diff --git a/SaBusMgrCoreProcs/Procs/Interfaces/SbmInterfaceProcess_Commodity_Export.cs b/SaBusMgrCoreProcs/Procs/Interfaces/SbmInterfaceProcess_Commodity_Export.cs index 8204864..7443fcf 100644 --- a/SaBusMgrCoreProcs/Procs/Interfaces/SbmInterfaceProcess_Commodity_Export.cs +++ b/SaBusMgrCoreProcs/Procs/Interfaces/SbmInterfaceProcess_Commodity_Export.cs @@ -1,24 +1,22 @@  using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; +using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.App; -using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Bus; +using Sarand.Net.Standard.Base.Core; +using Sarand.Net.Standard.Base.Data; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Interfaces; using Sarand.Net.Standard.Base.IO; using Sarand.Net.Standard.Base.ItemOptions; using Sarand.Net.Standard.Base.Procs; using Sarand.Net.Standard.Base.Utils; +using Sarand.Net.Standard.Proc.Excel; using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Sarand.Net.Standard.Proc.Excel; -using Sarand.Net.Standard.Base.Data; -using Sarand.BusinessMgr.Net.Standard.Base.Core; namespace Sarand.BusinessMgr.Net.Core.Procs.Interfaces { diff --git a/SaBusMgrCoreProcs/Procs/Procs/SbmProcess_Commodity_Export.cs b/SaBusMgrCoreProcs/Procs/Procs/SbmProcess_Commodity_Export.cs index a9c17e7..44dce5e 100644 --- a/SaBusMgrCoreProcs/Procs/Procs/SbmProcess_Commodity_Export.cs +++ b/SaBusMgrCoreProcs/Procs/Procs/SbmProcess_Commodity_Export.cs @@ -10,10 +10,7 @@ using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Proc.Excel; using System; using System.Collections.Generic; -using System.Drawing; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Sarand.BusinessMgr.Net.Core.Procs.Procs { diff --git a/SaBusMgrStandardBase/Base/App/Sbm-Version.cs b/SaBusMgrStandardBase/Base/App/Sbm-Version.cs index efcb76e..fb957a8 100644 --- a/SaBusMgrStandardBase/Base/App/Sbm-Version.cs +++ b/SaBusMgrStandardBase/Base/App/Sbm-Version.cs @@ -13,7 +13,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App //------------------------------------------------------------------- public static class Version { - private static String version { get; } = "3.0.2.0"; + private static String version { get; } = "3.0.2.1"; // Retrieve version. public static String GetFullVersion() { return version; } public static String GetAppVersion() @@ -36,6 +36,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App // Version history. //------------------------------------------------------------------- // 3.0.2 20-Nov-25 .Net 8. + // 3.0.2.1 29-Nov-25 Vehicle Classes. //------------------------------------------------------------------- // 3.0.1 19-Feb-25 Portal Transactions. // 3.0.1.1 19-Feb-25 Portal tidy. @@ -48,7 +49,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App // 3.0.1.8 26-Oct-25 Control repository status check on update. // 3.0.1.9 30-Oct-25 Portal styling. //------------------------------------------------------------------- - // 3.0.0 Jul-2021 Initial demo test version. + // 3.0.0 Jul-2021 Initial version. // 02-Feb-25 Initial live deployment. // 3.0.0.1 08-Feb-25 Demo repository registration. // 3.0.0.2 08-Feb-25 Production SMTP config. diff --git a/SaBusMgrStandardBase/Base/App/SbmInternals.cs b/SaBusMgrStandardBase/Base/App/SbmInternals.cs index 1f62884..44dd3ab 100644 --- a/SaBusMgrStandardBase/Base/App/SbmInternals.cs +++ b/SaBusMgrStandardBase/Base/App/SbmInternals.cs @@ -15,6 +15,7 @@ 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; @@ -292,7 +293,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App public List RequirementTypeCodes { get { return GetApplicationCodes(Sbm.ApplicationCode.RequirementType); } } //------------------------------------------------------------------- - // Code types. + // Application Code types. private Dictionary> codeTypeCodes { get; } = new Dictionary>(); public String GetCodeTypeCode(Sbm.ApplCodeType codeType) { @@ -302,7 +303,11 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App { if (!codeTypeCodes.ContainsKey(codeType)) codeTypeCodes.Add(codeType, CodeTypeConsole.GetCodesForCodeType(GetCodeTypeCode(codeType), false)); - return new List(codeTypeCodes.GetValueOrDefault(codeType, new List()).Where(c => !activeOnly || c.IsStatusActive)); + return new List(codeTypeCodes.GetValueOrDefault(codeType, new List()).Where(c => !activeOnly || c.IsStatusActive || c.IsStatusCurrent)); + } + public String GetCodeTypeDesc(Sbm.ApplCodeType codeType, String code) + { + return GetCodesForCodeType(codeType, false).FirstOrDefault(vm => vm.Code.EqualsCI(code))?.Description ?? code; } //------------------------------------------------------------------- diff --git a/SaBusMgrStandardBase/Base/Bus/SbmVehicleClass.cs b/SaBusMgrStandardBase/Base/Bus/SbmVehicleClass.cs index 680798e..d07992e 100644 --- a/SaBusMgrStandardBase/Base/Bus/SbmVehicleClass.cs +++ b/SaBusMgrStandardBase/Base/Bus/SbmVehicleClass.cs @@ -1,8 +1,6 @@ using Sarand.BusinessMgr.Net.Standard.Base.App; -using Sarand.BusinessMgr.Net.Standard.Base.Core; 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; @@ -58,12 +56,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus /// Properties other than common. public class DataProperties { + public Sbm.VehicleType VehicleType { get; set; } = Sbm.VehicleType.Unknown; + public String VehicleCategoryCode { get; set; } = ""; public String MakeCode { get; set; } = ""; public String Model { get; set; } = ""; public String Derivative { get; set; } = ""; public String DescBrief { get; set; } = ""; - public Sbm.VehicleType VehicleType { get; set; } = Sbm.VehicleType.Unknown; - public String VehicleCategoryCode { get; set; } = ""; public Sbm.VehicleFuelType FuelType { get; set; } = Sbm.VehicleFuelType.Unknown; public Sbm.VehicleOdometerUnits OdometerUnits { get; set; } = Sbm.VehicleOdometerUnits.Unknown; public short Seats { get; set; } = 0; diff --git a/SaBusMgrStandardBase/Base/Mgr/SbmAssetMgr.cs b/SaBusMgrStandardBase/Base/Mgr/SbmAssetMgr.cs index 11df245..0d13b12 100644 --- a/SaBusMgrStandardBase/Base/Mgr/SbmAssetMgr.cs +++ b/SaBusMgrStandardBase/Base/Mgr/SbmAssetMgr.cs @@ -36,6 +36,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr //------------------------------------------------------------------- // Utilities. public abstract bool AssetDatabaseIsValid(); + public abstract bool VehicleDatabaseIsValid(); //------------------------------------------------------------------- } diff --git a/SaBusMgrStandardBase/Base/Mgr/SbmAssetMgr_VehicleClass.cs b/SaBusMgrStandardBase/Base/Mgr/SbmAssetMgr_VehicleClass.cs index 4709a65..89a2909 100644 --- a/SaBusMgrStandardBase/Base/Mgr/SbmAssetMgr_VehicleClass.cs +++ b/SaBusMgrStandardBase/Base/Mgr/SbmAssetMgr_VehicleClass.cs @@ -109,7 +109,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr public virtual bool IsValidVehicleClassData(SbmVehicleClass.Data data, SbmVehicleClass.ErrField errField) { ClearErrorState(); - // VehicleClass properties. + // Item properties. if (errField.MakeCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.MakeCode, "make", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode), true)) { errField.MakeCode = SacsHierarchyItem.ValidValue.Invalid; @@ -120,12 +120,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr errField.Model = SacsHierarchyItem.ValidValue.Invalid; return false; } - if (errField.Derivative != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.MakeCode, "derivative", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicleClass_Derivative), true)) + if (errField.Derivative != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.MakeCode, "derivative", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicleClass_Derivative))) { errField.Derivative = SacsHierarchyItem.ValidValue.Invalid; return false; } - if (errField.DescBrief != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescBrief, "desctiption brief", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief), true)) + if (errField.DescBrief != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescBrief, "desctiption brief", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief))) { errField.DescBrief = SacsHierarchyItem.ValidValue.Invalid; return false; diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-AssetCategory.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-AssetCategory.cs index 59adfa7..824a429 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-AssetCategory.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-AssetCategory.cs @@ -368,9 +368,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr } //------------------------------------------------------------------- - // AssetCategory column definitions. + // Item column definitions. private static readonly String AliasAssetCategory = "aAstCat"; - private static readonly String colNameAssetCategory_AssetCount = "AssetCount"; + private static readonly String dataNameAssetCategory_AssetCount = "AssetCount"; private void SetAssetCategoryColDfn (ColumnDfn col, String caption, int width, SbmDbDfn.ColumnIdx dbCol, @@ -384,7 +384,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr col.MaxLength = (int)Internals.GetColTextLen(dbCol); } //------------------------------------------------------------------- - // Getting prmAssetCategory column definition. + // Configure item column definition. public override ColumnDfn GetAssetCategoryColumnDfn(SbmAssetCategory.Column columnId, string caption = "", int width = 0) { ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width); @@ -432,6 +432,13 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr SetAssetCategoryColDfn(columnDfn, "AssocId Customer", 45, SbmDbDfn.ColumnIdx.SaAssetCategory_AssocIdCustomer, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; + + // Derived properties. + case SbmAssetCategory.Column.AssetCount: + SetAssetCategoryColDfn(columnDfn, "Asset count", 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); + columnDfn.DataName = dataNameAssetCategory_AssetCount; + break; + // Common properties. case SbmAssetCategory.Column.Notes: SetAssetCategoryColDfn(columnDfn, "Notes", 200, SbmDbDfn.ColumnIdx.SaAssetCategory_Notes); @@ -459,10 +466,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr columnDfn.DateFormat = "d-MMM-yy"; columnDfn.ReadOnly = true; break; - case SbmAssetCategory.Column.AssetCount: - SetAssetCategoryColDfn(columnDfn, "Asset Count", 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); - columnDfn.DataName = colNameAssetCategory_AssetCount; - break; } if (!String.IsNullOrEmpty(caption)) columnDfn.Caption = caption; @@ -657,7 +660,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr qryAssetCount.Tables.Add(tableAsset, aliasAsset); qryAssetCount.Columns.Add($"Count({SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Id, aliasAsset)})"); qryAssetCount.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AssetCategoryId, aliasAsset)}={SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAssetCategory_Id, AliasAssetCategory)}"); - query.Columns.Add($"({qryAssetCount.BuildQuery()})", colNameAssetCategory_AssetCount); + query.Columns.Add($"({qryAssetCount.BuildQuery()})", dataNameAssetCategory_AssetCount); } //--------------------------------------------------------------- diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Vehicle.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Vehicle.cs index 8066794..19a1e90 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Vehicle.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Vehicle.cs @@ -109,7 +109,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr { List filter = new List(); filter.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaAsset_ItemType) + "=" + ((int)Sbm.ItemType.Vehicle).ToString()); - filter.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaAsset_ItemId) + "=" + vehicleId.ToString()); + filter.Add($"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaAsset_ItemId)}={SysId.ToString(vehicleId)}"); return Database.GetRowCount(tableAsset, filter.Concat(" AND ", "(", ")")) > 0; } return false; @@ -119,12 +119,14 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr { ClearErrorState(); if (!SysId.IsValid(vehicleId)) return false; + String tableAsset = SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset); String tableAssetProcess = SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAssetProcess); - if (Database.TableExists(tableAssetProcess)) + if (Database.TableExists(tableAsset) && Database.TableExists(tableAssetProcess)) { List filter = new List(); - filter.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaAssetProcess_AssetId) + "=" + vehicleId.ToString()); - return Database.GetRowCount(tableAssetProcess, filter.Concat(" AND ", "(", ")")) > 0; + filter.Add($"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaAsset_ItemId)}={SysId.ToString(vehicleId)}"); + filter.Add($"Exists (Select 1 From {tableAssetProcess} Where {SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaAssetProcess_AssetId)}={SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Id, aliasAsset)})"); + return Database.GetRowCount($"{tableAsset} As {aliasAsset}", filter.Concat(" AND ", "(", ")")) > 0; } return false; } @@ -136,7 +138,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr if (Database.TableExists(tableVehicleEvent)) { List filter = new List(); - filter.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaVehicleEvent_VehicleId) + "=" + vehicleId.ToString()); + filter.Add($"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaVehicleEvent_VehicleId)}={SysId.ToString(vehicleId)}"); return Database.GetRowCount(tableVehicleEvent, filter.Concat(" AND ", "(", ")")) > 0; } return false; @@ -149,7 +151,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr if (Database.TableExists(tableVehicleFeature)) { List filter = new List(); - filter.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaVehicleFeature_VehicleId) + "=" + vehicleId.ToString()); + filter.Add($"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaVehicleFeature_VehicleId)}={SysId.ToString(vehicleId)}"); return Database.GetRowCount(tableVehicleFeature, filter.Concat(" AND ", "(", ")")); } return 0; diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleClass.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleClass.cs index c14c908..23bc6dc 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleClass.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleClass.cs @@ -52,7 +52,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr if (Database.TableExists(tableVehicle)) { List filter = new List(); - filter.Add($"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaVehicleFeature_VehicleId)}={SysId.ToLong(vehicleClassId)}"); + filter.Add($"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId)}={SysId.ToLong(vehicleClassId)}"); return Database.GetRowCount(tableVehicle, filter.Concat(" AND ", "(", ")")); } return 0; @@ -179,7 +179,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr } //------------------------------------------------------------------- - // Get VehicleClass. + // Get Item. public override SbmVehicleClass GetVehicleClass(SbmVehicleClass.Params prm) { return GetVehicleClass(GetVehicleClassQueryFilter(prm).Concat(" AND ", "(", ")")); @@ -229,7 +229,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr } //------------------------------------------------------------------- - // Create VehicleClass. + // Create Item. public override SbmVehicleClass CreateVehicleClass() { ClearErrorState(); @@ -244,7 +244,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr } //------------------------------------------------------------------- - // Validate VehicleClass. + // Validate Item. public override bool IsValidVehicleClassData(SbmVehicleClass.Data data, SbmVehicleClass.ErrField errField) { ClearErrorState(); @@ -253,7 +253,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr } //------------------------------------------------------------------- - // Insert VehicleClass. + // Insert Item. public override bool InsertVehicleClass(SbmVehicleClass vehicleClass, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); @@ -283,7 +283,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr } //------------------------------------------------------------------- - // Update VehicleClass. + // Update Item. public override bool UpdateVehicleClass(SbmVehicleClass vehicleClass, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); @@ -321,7 +321,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr } //------------------------------------------------------------------- - // Delete VehicleClass. + // Delete Item. public override bool VehicleClassCanBeDeleted(SbmVehicleClass vehicleClass) { ClearErrorState(); @@ -422,8 +422,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr //------------------------------------------------------------------- // Column definitions. private static readonly String aliasVehicleClass = "aVehCla"; + private static readonly String aliasVehicleClass_Vehicle = "aVehClaVeh"; // VehilceCount DataName. - private static readonly String dataNameVehicleCount = "VehCount"; + private static readonly String dataNameVehicleClass_VehicleCount = "VehCount"; // Column definition population. private void SetVehicleClassColDfn @@ -439,7 +440,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr } //------------------------------------------------------------------- - // Getting prm column definition. + // Configure item column definition. public override ColumnDfn GetVehicleClassColumnDfn(SbmVehicleClass.Column columnId, string caption = "", int width = 0) { ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width); @@ -524,6 +525,13 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr case SbmVehicleClass.Column.RentalPriceUomDesc: SetVehicleClassColDfn(columnDfn, "Rental Price unit", 90, SbmDbDfn.ColumnIdx.SaVehicleClass_UomIdRentalPrice); break; + + // Derived properties. + case SbmVehicleClass.Column.VehicleCount: + SetVehicleClassColDfn(columnDfn, "Vehicle count", 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); + columnDfn.DataName = dataNameVehicleClass_VehicleCount; + break; + // Common properties. case SbmVehicleClass.Column.Notes: SetVehicleClassColDfn(columnDfn, "Notes", 200, SbmDbDfn.ColumnIdx.SaVehicleClass_Notes); @@ -551,10 +559,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr columnDfn.DateFormat = "d-MMM-yy"; columnDfn.ReadOnly = true; break; - case SbmVehicleClass.Column.VehicleCount: - SetVehicleClassColDfn(columnDfn, "Vehicles", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); - columnDfn.DataName = dataNameVehicleCount; - break; } if (!String.IsNullOrEmpty(caption)) columnDfn.Caption = caption; @@ -619,13 +623,13 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Status. String colVehicleClass_Status = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Status, aliasVehicleClass); if (prm.StatusCat == SbmVehicleClass.StatusCat.ActiveOnly) - filter.Add(colVehicleClass_Status + "='" + SacsSystem.GetStatusDesc(SaStatus.Active) + "'"); + filter.Add($"{colVehicleClass_Status}='{SacsSystem.GetStatusDesc(SaStatus.Active)}'"); else if (prm.StatusCat == SbmVehicleClass.StatusCat.InactiveOnly) - filter.Add(colVehicleClass_Status + "='" + SacsSystem.GetStatusDesc(SaStatus.Inactive) + "'"); + filter.Add($"{colVehicleClass_Status}='{SacsSystem.GetStatusDesc(SaStatus.Cancelled)}' Or {colVehicleClass_Status}='{SacsSystem.GetStatusDesc(SaStatus.Inactive)}'"); else if (prm.StatusCat == SbmVehicleClass.StatusCat.NotDeleted) - filter.Add(colVehicleClass_Status + "!='" + SacsSystem.GetStatusDesc(SaStatus.Deleted) + "'"); + filter.Add($"{colVehicleClass_Status}!='{SacsSystem.GetStatusDesc(SaStatus.Deleted)}'"); else if (prm.StatusCat == SbmVehicleClass.StatusCat.DeletedOnly) - filter.Add(colVehicleClass_Status + "='" + SacsSystem.GetStatusDesc(SaStatus.Deleted) + "'"); + filter.Add($"{colVehicleClass_Status}='{SacsSystem.GetStatusDesc(SaStatus.Deleted)}'"); if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1"); return filter; @@ -776,6 +780,18 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr if (columns.HasId(SbmVehicleClass.Column.UpdateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_UpdateOn, aliasVehicleClass)); + //--------------------------------------------------------------- + // Vehicle Count + if (columns.HasId(SbmVehicleClass.Column.VehicleCount)) + { + String tableVehicle = SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicle); + DbQuery qryVehicleCount = new DbQuery(Database.DbmsType); + qryVehicleCount.Tables.Add(tableVehicle, aliasVehicleClass_Vehicle); + qryVehicleCount.Columns.Add($"Count({SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Id, aliasVehicleClass_Vehicle)})"); + qryVehicleCount.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicleClass_Vehicle)}={SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Id, aliasVehicleClass)}"); + query.Columns.Add($"({qryVehicleCount.BuildQuery()})", dataNameVehicleClass_VehicleCount); + } + //--------------------------------------------------------------------- // Populate filter. query.Filters.AddRange(GetVehicleClassQueryFilter(prm)); diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleFeature.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleFeature.cs index 6ca0e15..03b7684 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleFeature.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleFeature.cs @@ -122,8 +122,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr if (Database != null) { String filter = GetVehicleFeatureQueryFilter(prm).Concat(" AND ", "(", ")"); - String colVehicleFeature_VehicleId = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaVehicleFeature_VehicleId); - return Database.GetRowCount(tableVehicleFeature, /*colVehicleFeature_VehicleId, 0,*/ filter) > 0; + return Database.GetRowCount($"{tableVehicleFeature} As {aliasVehicleFeature}", filter) > 0; } } else SetErrorState("vehicle features not supported"); diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas.cs index ba219c5..9fe36de 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas.cs @@ -59,9 +59,18 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr { ClearErrorState(); if (Database == null) return SetErrorState("Database not specified"); - //if (pDb->GetInterfaceType() != SaDatabase::eSaDbInterfaceOdbc) return SetErrorState ("Database not ODBC"); - if (Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAssetCategory))) return SetErrorState("Asset Category table does not exist"); - if (Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset))) return SetErrorState("Asset table does not exist"); + if (!Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAssetCategory))) return SetErrorState("Asset Category table does not exist"); + if (!Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset))) return SetErrorState("Asset table does not exist"); + return true; + } + + public override bool VehicleDatabaseIsValid() + { + if (!AssetDatabaseIsValid()) return false; + ClearErrorState(); + if (Database == null) return SetErrorState("Database not specified"); + if (!Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass))) return SetErrorState("Vehicle Class table does not exist"); + if (!Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicle))) return SetErrorState("Vehicle table does not exist"); return true; } diff --git a/SaBusinessMgrCoreWebControl/Control/Controllers/System/SystemController-Ajax-Database.cs b/SaBusinessMgrCoreWebControl/Control/Controllers/System/SystemController-Ajax-Database.cs index 8ddbefc..266c01c 100644 --- a/SaBusinessMgrCoreWebControl/Control/Controllers/System/SystemController-Ajax-Database.cs +++ b/SaBusinessMgrCoreWebControl/Control/Controllers/System/SystemController-Ajax-Database.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Text.RegularExpressions; namespace Sarand.BusinessMgr.Web.Control.Controllers.System { @@ -106,7 +107,7 @@ namespace Sarand.BusinessMgr.Web.Control.Controllers.System foreach (DbDfnTable tableDfn in tableDfns.OrderBy(item => item.Name)) { // Filter by table name. - if (!StringUtil.IsEmpty(model.DatabaseFilter.Search) && !tableDfn.Name.ContainsCI(model.DatabaseFilter.Search)) + if (!StringUtil.IsBlank(model.DatabaseFilter.Search) && !tableDfn.Name.ContainsCI(model.DatabaseFilter.Search)) continue; DatabaseTableData tableData = new DatabaseTableData(); @@ -266,7 +267,8 @@ namespace Sarand.BusinessMgr.Web.Control.Controllers.System IndexName = schemaComparisonItem.IndexName, Comment = schemaComparisonItem.Comment }; - responseData.Items.Add(item); + if (SchemaItemMatchesSearch(item, model.DatabaseFilter.Search)) + responseData.Items.Add(item); } } @@ -275,6 +277,22 @@ namespace Sarand.BusinessMgr.Web.Control.Controllers.System return Json(responseData); } + private bool SchemaItemMatchesSearch(DbSchemaItemResponseData item, String search) + { + if (StringUtil.IsBlank(search)) return true; + foreach (string searchWord in Regex.Split(search, "[\\s,;\\-+]+")) + { + if (searchWord.IsBlank()) continue; + if (!item.SchemaName.ContainsCI(searchWord) + && !item.TableName.ContainsCI(searchWord) + && !item.ColumnName.ContainsCI(searchWord) + && !item.IndexName.ContainsCI(searchWord) + && !item.Comment.ContainsCI(searchWord)) + return false; + } + return true; + } + private Dictionary GetSmlSchemas(Sbm.Database databaseInstance) { Dictionary schemas = new Dictionary(); diff --git a/SaBusinessMgrCoreWebControl/Localisation/SbmControlProperties.resx b/SaBusinessMgrCoreWebControl/Localisation/SbmControlProperties.resx index 12f11db..9592654 100644 --- a/SaBusinessMgrCoreWebControl/Localisation/SbmControlProperties.resx +++ b/SaBusinessMgrCoreWebControl/Localisation/SbmControlProperties.resx @@ -549,4 +549,25 @@ Item created. + + Incorrect account credentials entered. + + + Your session has expired. + + + Password has been updated. + + + If your email address matches an active user account, you will shortly receive an email with instructions for changing your password. + + + Failed to change password. + + + Your new password must be different from the previous. + + + Current password does not match. + \ No newline at end of file diff --git a/SaBusinessMgrCoreWebPortal/Localisation/SbmPortalProperties.resx b/SaBusinessMgrCoreWebPortal/Localisation/SbmPortalProperties.resx index d63d358..a94270e 100644 --- a/SaBusinessMgrCoreWebPortal/Localisation/SbmPortalProperties.resx +++ b/SaBusinessMgrCoreWebPortal/Localisation/SbmPortalProperties.resx @@ -468,12 +468,6 @@ Derivative - - Vehicle - - - Vehicles - Code Types @@ -948,4 +942,19 @@ Select Commodity + + Vehicle + + + Create Vehicle + + + Update Vehicle + + + Vehicles + + + Active vehicle class caption must be unique. + \ No newline at end of file diff --git a/SaBusinessMgrCoreWebPortal/Portal/Components/SbmModel_Portal.cs b/SaBusinessMgrCoreWebPortal/Portal/Components/SbmModel_Portal.cs index 8c1c2d8..6008559 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Components/SbmModel_Portal.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Components/SbmModel_Portal.cs @@ -130,6 +130,21 @@ namespace Sarand.BusinessMgr.Web.Portal.Components // System codes. protected List GetSystemCodes(Sbm.ApplicationCode applicationCode) { return Internals.GetApplicationCodes(applicationCode); } + //------------------------------------------------------------------- + // Repository Options. + public bool AllowOption(Sbm.ConfigOption option) + { + // Options with extended logic. + switch (option) + { + case Sbm.ConfigOption.Assets: + return SessionConsole.AllowOption(option) && AssetMgr.AssetDatabaseIsValid(); + case Sbm.ConfigOption.Vehicles: + return SessionConsole.AllowOption(option) && AssetMgr.VehicleDatabaseIsValid(); + } + return SessionConsole.AllowOption(option); + } + //------------------------------------------------------------------- // Page menu options. @@ -160,7 +175,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Components // Contacts. MenuItemData contactsItem = new MenuItemData() { Caption = @Localiser["label.contacts"] }; - if (SessionConsole.AllowOption(Sbm.ConfigOption.Contacts)) + if (AllowOption(Sbm.ConfigOption.Contacts)) { contactsItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.contacts"], Page = "Contacts" }); contactsItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.customers"], Page = "Customers" }); @@ -172,23 +187,23 @@ namespace Sarand.BusinessMgr.Web.Portal.Components // Commodities. MenuItemData commoditiesItem = new MenuItemData() { Caption = @Localiser["label.commodities"] }; - if (SessionConsole.AllowOption(Sbm.ConfigOption.Commodities)) + if (AllowOption(Sbm.ConfigOption.Commodities)) commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.commodities"], Page = "Commodity" }); - if (SessionConsole.AllowOption(Sbm.ConfigOption.Assets)) + if (AllowOption(Sbm.ConfigOption.Assets)) { commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.asset.categories"], Page = "Assets/AssetCategory" }); commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.assets"], Page = "Assets/Asset" }); - if (SessionConsole.AllowOption(Sbm.ConfigOption.Vehicles)) + if (AllowOption(Sbm.ConfigOption.Vehicles)) { commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.vehicle.classes"], Page = "Vehicles/VehicleClass" }); - commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.vehicles"], Page = "Vehicles/Vehicle" }); + commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.vehicles"], Page = "Vehicles/Vehicle" }); } } if (commoditiesItem.Options.Any()) Menu.Items.Add(commoditiesItem); // Transactions. - if (SessionConsole.AllowOption(Sbm.ConfigOption.Transactions)) + if (AllowOption(Sbm.ConfigOption.Transactions)) { MenuItemData transactionsItem = new MenuItemData() { Caption = @Localiser["label.transactions"] }; transactionsItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.sales.orders"], Page = "Transactions/SalesOrder" }); @@ -308,7 +323,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Components commodityTypes.Add(Sbm.CommodityType.Any, "", Localiser["label.any"]); foreach (TypeCodeDesc commodityType in GetSystemCodes(Sbm.ApplicationCode.CommodityType)) { - if (commodityType.Type == (int)Sbm.CommodityType.Asset && !SessionConsole.AllowOption(Sbm.ConfigOption.Assets)) continue; + if (commodityType.Type == (int)Sbm.CommodityType.Asset && !AllowOption(Sbm.ConfigOption.Assets)) continue; commodityTypes.Add(commodityType); } return new SelectList(commodityTypes, "Code", "Desc"); @@ -322,12 +337,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Components List commodityTypes = new List(); foreach (TypeCodeDesc commodityType in GetSystemCodes(Sbm.ApplicationCode.CommodityType)) { - if (commodityType.Type == (int)Sbm.CommodityType.Asset && !SessionConsole.AllowOption(Sbm.ConfigOption.Assets)) continue; + if (commodityType.Type == (int)Sbm.CommodityType.Asset && !AllowOption(Sbm.ConfigOption.Assets)) continue; commodityTypes.Add(commodityType); } return new SelectList(commodityTypes, "Code", "Desc"); } + // --- Asset Type --- + /// /// List of Asset Types for filter dropdown. /// @@ -355,6 +372,35 @@ namespace Sarand.BusinessMgr.Web.Portal.Components return new SelectList(assetTypes, "Code", "Desc"); } + // --- Vehicle Type --- + + /// + /// List of Vehicle Types for filter dropdown. + /// + public IEnumerable GetVehicleTypeCodesForFilterDropdown() + { + List vehicleTypes = new List(); + vehicleTypes.Add(Sbm.VehicleType.Any, "", Localiser["label.any"]); + foreach (TypeCodeDesc vehicleType in GetSystemCodes(Sbm.ApplicationCode.VehicleType)) + { + vehicleTypes.Add(vehicleType); + } + return new SelectList(vehicleTypes, "Code", "Desc"); + } + + /// + /// List of Vehicle Types for form dropdown. + /// + public IEnumerable GetVehicleTypeCodesForDropdown() + { + List vehicleTypes = new List(); + foreach (TypeCodeDesc vehicleType in GetSystemCodes(Sbm.ApplicationCode.VehicleType)) + { + vehicleTypes.Add(vehicleType); + } + return new SelectList(vehicleTypes, "Code", "Desc"); + } + //------------------------------------------------------------------- // View reference data - Transactions. diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetCategoryController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetCategoryController-Ajax.cs index d75b9eb..68288f6 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetCategoryController-Ajax.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetCategoryController-Ajax.cs @@ -10,7 +10,6 @@ using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; -using static Sarand.BusinessMgr.Web.Portal.Models.Requirements.Model_Requirement.RequirementData; namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets { @@ -20,7 +19,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets partial class AssetCategoryController { //------------------------------------------------------------------- - // Item data. + // Response data. private class AssetCategoryListData : AjaxResponse_Data.ItemData_Base { public String TypeDesc { get; set; } @@ -41,6 +40,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets data.Field.Value.Add($"{Model_AssetCategory.ItemField.Exists}", "1"); data.Code = assetCategory.Code; data.Caption = assetCategory.DescBrief; + // Common properties. + data.StatusCode = assetCategory.StatusCode; + data.StatusDesc = assetCategory.StatusDesc; // Asset count. long assetCount = AssetMgr.GetAssetCountForAssetCategory(assetCategory.Id, false); if (assetCount > 0) data.Field.Value.Add($"{Model_AssetCategory.ItemField.AssetCount}", $"{assetCount}"); @@ -56,9 +58,6 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets // Asset Category properties. data.Field.Value.Add($"{Model_AssetCategory.ItemField.Code}", assetCategory.Code); data.Field.Value.Add($"{Model_AssetCategory.ItemField.Caption}", assetCategory.DescBrief); - // Common properties. - data.StatusCode = assetCategory.StatusCode; - data.StatusDesc = assetCategory.StatusDesc; // Cleanse field values. data.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value)); // Populate item list values that might be cleared during update after removing blank values to ensure that blank values are published. @@ -67,7 +66,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets } //------------------------------------------------------------------- - // Asset Category configuration ajax request. + // Item configuration ajax request. //------------------------------------------------------------------- private class AjaxResponse_AssetCategoryConfig : AjaxResponse_Data { @@ -132,7 +131,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets } //------------------------------------------------------------------- - // Asset Category list ajax request. + // Item list ajax request. //------------------------------------------------------------------- private class AjaxResponse_AssetCategoryList : AjaxResponse_AssetCategoryConfig { @@ -235,7 +234,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets } //------------------------------------------------------------------- - // Asset Category ajax request. + // Get Item ajax request. //------------------------------------------------------------------- private class AjaxResponse_AssetCategory : AjaxResponse_Data { @@ -243,7 +242,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets public AjaxResponse_AssetCategory(SbmModel_Portal model) : base(model) { } // Configuration. public Model_AssetCategory.ItemConfigData Config { get; } = new Model_AssetCategory.ItemConfigData(); - // Asset Category details. + // Item details. public AssetCategoryItemData assetCategory { get; } = new AssetCategoryItemData(); } //------------------------------------------------------------------- @@ -286,7 +285,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets } //------------------------------------------------------------------- - // Store AssetCategory ajax request. + // Store Item ajax request. //------------------------------------------------------------------- [HttpPost] [Route("Assets/AssetCategory/Ajax/StoreItem")] diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetCategoryController.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetCategoryController.cs index 1eaaa83..ad1ddaf 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetCategoryController.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetCategoryController.cs @@ -2,52 +2,47 @@ using Microsoft.Extensions.Logging; using Sarand.BusinessMgr.Net.Core.Web.App; using Sarand.BusinessMgr.Web.Portal.Components; -using Sarand.BusinessMgr.Web.Portal.Models; using Sarand.BusinessMgr.Web.Portal.Models.Assets; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets { //====================================================================== public partial class AssetCategoryController : SbmController_Portal - { - //------------------------------------------------------------------- - // Data members. + { + //------------------------------------------------------------------- + // Data members. - //------------------------------------------------------------------- - // Construction. - public AssetCategoryController(SbmLocaliser localiser, ILogger logger) : - base(localiser, logger) - { - } + //------------------------------------------------------------------- + // Construction. + public AssetCategoryController(SbmLocaliser localiser, ILogger logger) : + base(localiser, logger) + { + } //------------------------------------------------------------------- [Route("Assets/AssetCategory")] public IActionResult Index(Model_AssetCategory model) - { - if (!ValidUserSession) - AutoLoginUser(); + { + if (!ValidUserSession) + AutoLoginUser(); - // Redirect to sign-in if not signed-in. - if (!ValidUserSession) - { - ClearKeepLoggedInCookie(); - return RedirectToAction("", "Security"); - } + // Redirect to sign-in if not signed-in. + if (!ValidUserSession) + { + ClearKeepLoggedInCookie(); + return RedirectToAction("", "Security"); + } + + RefreshModel(model); + if (!model.AllowOption(Net.Standard.Base.App.Sbm.ConfigOption.Assets)) + return RedirectToAction("", ""); // Asset Category page. - RefreshModel(model); model.PopulateListConfig(); - model.Paging.PageNo = SessionData_Portal.Profile.Commodity.Filter.PageNo; - model.Paging.PageLength = SessionData_Portal.Profile.Commodity.Filter.PageLength; return View("Views/Assets/AssetCategory/Index.cshtml", model); } //------------------------------------------------------------------- } - //====================================================================== + //====================================================================== } diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetController.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetController.cs index 53e5182..f88576f 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetController.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetController.cs @@ -2,13 +2,7 @@ using Microsoft.Extensions.Logging; using Sarand.BusinessMgr.Net.Core.Web.App; using Sarand.BusinessMgr.Web.Portal.Components; -using Sarand.BusinessMgr.Web.Portal.Models; using Sarand.BusinessMgr.Web.Portal.Models.Assets; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets { @@ -39,8 +33,12 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets return RedirectToAction("", "Security"); } - // Asset page. Model_Asset model = new Model_Asset(Localiser); + RefreshModel(model); + if (!model.AllowOption(Net.Standard.Base.App.Sbm.ConfigOption.Assets)) + return RedirectToAction("", ""); + + // Asset page. return View("Views/Assets/Asset/Index.cshtml", model); } diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Vehicles/VehicleClassController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Vehicles/VehicleClassController-Ajax.cs index d1d40f5..54d26f5 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Vehicles/VehicleClassController-Ajax.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Vehicles/VehicleClassController-Ajax.cs @@ -1,17 +1,17 @@ using Microsoft.AspNetCore.Mvc; using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; -using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control; using Sarand.BusinessMgr.Web.Portal.Components; using Sarand.BusinessMgr.Web.Portal.Models.Vehicles; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; +using Sarand.Net.Standard.Base.CodeTypes; 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 System.Linq; +using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm; namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles { @@ -21,53 +21,153 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles //------------------------------------------------------------------- // Definitions. - // VehicleClass data. + // Response data. private class VehicleClassListData : AjaxResponse_Data.ItemData_Base { - public String MakeDesc { get; set; } - public String Model { get; set; } - public String Derivative { get; set; } - public String DescBrief { get; set; } - public long? VehicleCount { get; set; } + public String VehicleType { get; set; } + public String Category { get; set; } + public String Caption { get; set; } + // Field values. + public AjaxResponse_Data.FieldValuesData Field { get; } = new AjaxResponse_Data.FieldValuesData(); } private class VehicleClassItemData : VehicleClassListData { - public String MakeCode { get; set; } } private void PopulateVehicleClassResponseListData(SbmModel_Portal model, VehicleClassListData data, SbmVehicleClass vehicleClass) { data.Id = SysId.ToString(vehicleClass.Id); - data.MakeDesc = GetMakeDesc(vehicleClass.MakeCode); - data.Model = vehicleClass.Model; - data.Derivative = vehicleClass.Derivative; - data.DescBrief = vehicleClass.DescBrief; + data.Field.Value.Add($"{Model_VehicleClass.ItemField.Id}", data.Id); + data.VehicleType = Internals.GetApplicationCodes(Sbm.ApplicationCode.VehicleType).GetDescForType(vehicleClass.VehicleType); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.VehicleType}", data.VehicleType); + data.Category = Internals.GetCodeTypeDesc(Sbm.ApplCodeType.VehicleCategory, vehicleClass.VehicleCategoryCode); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.VehicleCategory}", data.Category); + data.Caption = vehicleClass.DescBrief; + data.Field.Value.Add($"{Model_VehicleClass.ItemField.Caption}", data.Caption); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.Make}", Internals.GetCodeTypeDesc(Sbm.ApplCodeType.VehicleMake, vehicleClass.MakeCode)); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.Model}", vehicleClass.Model); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.Derivative}", vehicleClass.Derivative); + // Common properties. data.StatusCode = vehicleClass.StatusCode; data.StatusDesc = vehicleClass.StatusDesc; } - private String GetMakeDesc(String makeCode) - { - return Internals.GetCodesForCodeType(Sbm.ApplCodeType.VehicleMake, false).FirstOrDefault(vm => vm.Code.EqualsCI(makeCode))?.Description ?? makeCode; - } private void PopulateVehicleClassResponseItemData(SbmModel_Portal model, VehicleClassItemData data, SbmVehicleClass vehicleClass) { PopulateVehicleClassResponseListData(model, data, vehicleClass); - data.MakeCode = vehicleClass.MakeCode; - data.Notes = vehicleClass.Notes; + data.Field.Value.Add($"{Model_VehicleClass.ItemField.Exists}", "1"); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.VehicleTypeCode}", Internals.GetApplicationCodes(Sbm.ApplicationCode.VehicleType).GetCodeForType(vehicleClass.VehicleType)); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.VehicleCategoryCode}", vehicleClass.VehicleCategoryCode); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.MakeCode}", vehicleClass.MakeCode); + // Properties. + data.Field.Value.Add($"{Model_VehicleClass.ItemField.FuelType}", $"{vehicleClass.FuelType}"); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.OdometerUnits}", $"{vehicleClass.OdometerUnits}"); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.Seats}", $"{vehicleClass.Seats}"); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.Weight}", $"{vehicleClass.Weight}"); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.InsuranceCode}", vehicleClass.InsuranceCode); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.FirstServiceOdo}", $"{vehicleClass.FirstServiceOdo}"); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.ServiceOdo}", $"{vehicleClass.ServiceOdo}"); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.ServiceWeeks}", $"{vehicleClass.ServiceWeeks}"); + // Rental. + if (model.UserCanViewFinancials()) + { + data.Field.Value.Add($"{Model_VehicleClass.ItemField.RentalCostAmount}", vehicleClass.AmountRentalCost.ToString()); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.RentalCostUomId}", SysId.ToString(vehicleClass.UomIdRentalCost)); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.RentalPriceAmount}", vehicleClass.AmountRentalPrice.ToString()); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.RentalPriceUomId}", SysId.ToString(vehicleClass.UomIdRentalPrice)); + } + // Cleanse field values. + data.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value)); + // Populate item list values that might be cleared during update after removing blank values to ensure that blank values are published. + data.Field.Value.Add($"{Model_VehicleClass.ItemField.Notes}", $"{vehicleClass.Notes}"); + data.Field.Value.Add($"{Model_VehicleClass.ItemField.UpdatedOn}", Localiser.FormatDate(vehicleClass.UpdateStamp.On)); } //------------------------------------------------------------------- - // Get VehicleClass List ajax request. + // Item configuration ajax request. //------------------------------------------------------------------- - private class AjaxResponse_VehicleClassList : AjaxResponse_Data + private class AjaxResponse_VehicleClassConfig : AjaxResponse_Data + { + // Construction. + public AjaxResponse_VehicleClassConfig(SbmModel_Portal model) : base(model) { } + // Configuration data - object copied directly to env.datain script. + public class ConfigData + { + // Configuration. + public Model_VehicleClass.ListConfigData CfgList { get; } = new Model_VehicleClass.ListConfigData(); + public Model_VehicleClass.ItemConfigData CfgItemNew { get; } = new Model_VehicleClass.ItemConfigData(); + // Reference data. + public List VehicleTypes { get; } = new List(); + public List Categories { get; } = new List(); + public List Makes { get; } = new List(); + public List Statuses { get; } = new List(); + public List StatusesCreate { get; } = new List(); + public String StatusCodeDefault { get; set; } + } + public ConfigData Data { get; set; } = new ConfigData(); + } + // Ajax request. + [HttpPost] + [Route("Vehicles/VehicleClass/Ajax/Config")] + [Route("Vehicles/VehicleClass/Ajax/GetConfig")] + public IActionResult Ajax_VehicleClassConfig(Model_VehicleClass model) + { + AjaxResponse_VehicleClassConfig responseData = new AjaxResponse_VehicleClassConfig(model); + String messageTitle = Localiser["caption.asset.categories"]; + + // Validate session and referrer. + if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); + if (!ValidReferer) return Forbid(); + RefreshModel(model); + + // Populate configuration data. + PopulateVehicleClassConfig(model, responseData); + + // Complete response. + responseData.Success = true; + return Json(responseData); + } + private void PopulateVehicleClassConfig(Model_VehicleClass model, AjaxResponse_VehicleClassConfig responseData) + { + // Configuration. + model.PopulateListConfig(responseData.Data.CfgList); + model.PopulateItemConfig(responseData.Data.CfgItemNew, null, Sbm.VehicleType.Unknown); + + // Reference data - select lists. + responseData.Data.VehicleTypes.Add(new()); + foreach (TypeCodeDesc vehicleType in GetSystemCodes(Sbm.ApplicationCode.VehicleType)) + responseData.Data.VehicleTypes.Add(new AjaxResponse_Data.ItemCodeDesc(vehicleType.Code, vehicleType.Desc)); + responseData.Data.Categories.Add(new()); + foreach (SaCode categoryCode in Internals.GetCodesForCodeType(ApplCodeType.VehicleCategory)) + responseData.Data.Categories.Add(new AjaxResponse_Data.ItemCodeDesc(categoryCode.Code, categoryCode.Description)); + responseData.Data.Makes.Add(new()); + foreach (SaCode makeCode in Internals.GetCodesForCodeType(ApplCodeType.VehicleMake)) + responseData.Data.Makes.Add(new AjaxResponse_Data.ItemCodeDesc(makeCode.Code, makeCode.Description)); + + // Reference data - statuses. + foreach (SaStatus status in SbmVehicleClass.ValidStatuses) + { + responseData.Data.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status))); + if (status != SaStatus.Deleted) + responseData.Data.StatusesCreate.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status))); + } + responseData.Data.StatusCodeDefault = SacsSystem.GetStatusCode(SbmVehicleClass.DefaultStatus); + } + + //------------------------------------------------------------------- + // Get Item List ajax request. + //------------------------------------------------------------------- + private class AjaxResponse_VehicleClassList : AjaxResponse_VehicleClassConfig { // Construction. public AjaxResponse_VehicleClassList(SbmModel_Portal model) : base(model) { } - // VehicleClass list. + // View mode. + public class ModeData + { + public ushort? Search { get; set; } + public ushort? Maintain { get; set; } + } + public ModeData Mode { get; set; } + // Item list. public List VehicleClasses { get; } = new List(); - // Reference data. - public List Statuses { get; } = new List(); - public List StatusesCreate { get; } = new List(); - public String StatusCodeDefault { get; set; } } //------------------------------------------------------------------- [HttpPost] @@ -84,14 +184,16 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); RefreshModel(model); - // Reference data - statuses. - foreach (SaStatus status in SbmVehicleClass.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(SbmVehicleClass.DefaultStatus); + // Populate configuration data. + PopulateVehicleClassConfig(model, responseData); + + // View mode. + responseData.Mode = new AjaxResponse_VehicleClassList.ModeData(); + Model_VehicleClass.ViewMode viewMode = model.GetFilterMode(); + if (viewMode == Model_VehicleClass.ViewMode.Maintain) + responseData.Mode.Maintain = 1; + else + responseData.Mode.Search = 1; // Item filter. SbmVehicleClass.Params prmVehicleClass = new SbmVehicleClass.Params(); @@ -102,16 +204,19 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles // Item columns. ColumnDfn colId = AssetMgr.GetVehicleClassColumnDfn(SbmVehicleClass.Column.Id); - ColumnDfn colMakeCode = AssetMgr.GetVehicleClassColumnDfn(SbmVehicleClass.Column.MakeCode); + ColumnDfn colVehicleType = AssetMgr.GetVehicleClassColumnDfn(SbmVehicleClass.Column.VehicleType); + ColumnDfn colCategory = AssetMgr.GetVehicleClassColumnDfn(SbmVehicleClass.Column.VehicleCategoryCode); + ColumnDfn colMake = AssetMgr.GetVehicleClassColumnDfn(SbmVehicleClass.Column.MakeCode); ColumnDfn colModel = AssetMgr.GetVehicleClassColumnDfn(SbmVehicleClass.Column.Model); ColumnDfn colDerivative = AssetMgr.GetVehicleClassColumnDfn(SbmVehicleClass.Column.Derivative); ColumnDfn colDescBrief = AssetMgr.GetVehicleClassColumnDfn(SbmVehicleClass.Column.DescBrief); ColumnDfn colVehicleCount = AssetMgr.GetVehicleClassColumnDfn(SbmVehicleClass.Column.VehicleCount); ColumnDfn colStatus = AssetMgr.GetVehicleClassColumnDfn(SbmVehicleClass.Column.Status); + ColumnDfn colNotes = AssetMgr.GetVehicleClassColumnDfn(SbmVehicleClass.Column.Notes); List columns = new List() { - colId, colMakeCode, colModel, colDerivative, colDescBrief, - colVehicleCount, colStatus + colId, colVehicleType, colCategory, colMake, colModel, colDerivative, colDescBrief, + colVehicleCount, colStatus, colNotes }; // Query items. @@ -120,19 +225,23 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles while (resultSet != null && resultSet.HasRows && resultSet.NextRecord()) { NamedValue.Map values = resultSet.GetRecordValues(); + Sbm.VehicleType vehicleType = (Sbm.VehicleType)values.GetLong(colVehicleType.DataName); VehicleClassListData vehicleClassData = new VehicleClassListData() { Id = values.GetLong(colId.DataName).ToString(), - MakeDesc = GetMakeDesc(values.GetString(colMakeCode.DataName)), - Model = values.GetString(colModel.DataName), - Derivative = values.GetString(colDerivative.DataName), - DescBrief = values.GetString(colDescBrief.DataName), StatusCode = values.GetString(colStatus.DataName), StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)) }; + vehicleClassData.Field.Value.Add($"{Model_VehicleClass.ItemField.VehicleType}", Internals.GetApplicationCodes(ApplicationCode.VehicleType).GetDescForType(vehicleType)); + vehicleClassData.Field.Value.Add($"{Model_VehicleClass.ItemField.VehicleCategory}", Internals.GetCodeTypeDesc(ApplCodeType.VehicleCategory, values.GetString(colCategory.DataName))); + vehicleClassData.Field.Value.Add($"{Model_VehicleClass.ItemField.Make}", Internals.GetCodeTypeDesc(ApplCodeType.VehicleMake, values.GetString(colMake.DataName))); + vehicleClassData.Field.Value.Add($"{Model_VehicleClass.ItemField.Model}", values.GetString(colModel.DataName)); + vehicleClassData.Field.Value.Add($"{Model_VehicleClass.ItemField.Derivative}", values.GetString(colDerivative.DataName)); + vehicleClassData.Field.Value.Add($"{Model_VehicleClass.ItemField.Caption}", values.GetString(colDescBrief.DataName)); + vehicleClassData.Field.Value.Add($"{Model_VehicleClass.ItemField.Notes}", AssetMgr.GetVehicleClassDataValue(colNotes, values).ToString()); long vehicleCount = values.GetLong(colVehicleCount.DataName); - if (vehicleCount > 0) - vehicleClassData.VehicleCount = vehicleCount; + if (vehicleCount > 0) vehicleClassData.Field.Value.Add($"{Model_VehicleClass.ItemField.VehicleCount}", $"{vehicleCount}"); + vehicleClassData.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value)); responseData.VehicleClasses.Add(vehicleClassData); } } @@ -146,13 +255,15 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles } //------------------------------------------------------------------- - // Get VehicleClass ajax request. + // Get Item ajax request. //------------------------------------------------------------------- private class AjaxResponse_VehicleClass : AjaxResponse_Data { // Construction. public AjaxResponse_VehicleClass(SbmModel_Portal model) : base(model) { } - // VehicleClass details. + // Configuration. + public Model_VehicleClass.ItemConfigData Config { get; } = new Model_VehicleClass.ItemConfigData(); + // Item details. public VehicleClassItemData vehicleClass { get; } = new VehicleClassItemData(); } //------------------------------------------------------------------- @@ -174,7 +285,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles { // Identify item. - SysId vehicleClassId = SysId.ToSysId(model.VehicleClass.Id); + SysId vehicleClassId = model.GetVehicleClassId(); if (!SysId.IsValid(vehicleClassId)) return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.item.id.not.specified"])); @@ -187,6 +298,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles } // Construct response. + model.PopulateItemConfig(responseData.Config, vehicleClass); PopulateVehicleClassResponseItemData(model, responseData.vehicleClass, vehicleClass); responseData.Success = true; } @@ -194,7 +306,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles } //------------------------------------------------------------------- - // Store VehicleClass ajax request. + // Store Item ajax request. //------------------------------------------------------------------- [HttpPost] [Route("Vehicles/VehicleClass/Ajax/StoreItem")] @@ -210,7 +322,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles RefreshModel(model); // Validate item Id. - SysId vehicleClassId = SysId.ToSysId(model.VehicleClass.Id); + SysId vehicleClassId = model.GetVehicleClassId(); if (StringUtil.ToBool(model.VehicleClass.Exists) && !SysId.IsValid(vehicleClassId)) { SaLogger.Warn($"{SysUtil.Fn} VehicleClass Id not supplied for existing item."); @@ -235,7 +347,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles SbmVehicleClass vehicleClass = AssetMgr.GetVehicleClassById(vehicleClassId); if (vehicleClass == null && SysId.IsValid(vehicleClassId)) { - SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve Vehicle Class for Id: '" + model.VehicleClass.Id + "'"); + SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve Vehicle Class for Id: '{model.VehicleClass.Id}'"); return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.item.id.not.found"])); } @@ -246,14 +358,18 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles } // Populate item properties. + if (model.VehicleClass.VehicleTypeCode != null) + vehicleClass.VehicleType = model.GetVehicleClassVehicleType(); + if (model.VehicleClass.VehicleCategoryCode != null) + vehicleClass.VehicleCategoryCode = model.VehicleClass.VehicleCategoryCode; if (model.VehicleClass.MakeCode != null) vehicleClass.MakeCode = model.VehicleClass.MakeCode; if (model.VehicleClass.Model != null) vehicleClass.Model = model.VehicleClass.Model; if (model.VehicleClass.Derivative != null) vehicleClass.Derivative = model.VehicleClass.Derivative; - if (model.VehicleClass.DescBrief != null) - vehicleClass.DescBrief = model.VehicleClass.DescBrief; + if (model.VehicleClass.Caption != null) + vehicleClass.DescBrief = model.VehicleClass.Caption; if (model.VehicleClass.StatusCode != null) vehicleClass.Status = model.VehicleClass.GetStatus(); if (model.VehicleClass.Notes != null) @@ -280,6 +396,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles } // Construct response. + model.PopulateItemConfig(responseData.Config, vehicleClass); PopulateVehicleClassResponseItemData(model, responseData.vehicleClass, vehicleClass); responseData.Success = true; } diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Vehicles/VehicleClassController.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Vehicles/VehicleClassController.cs index 9c11d61..0dd8397 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Vehicles/VehicleClassController.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Vehicles/VehicleClassController.cs @@ -2,49 +2,48 @@ using Microsoft.Extensions.Logging; using Sarand.BusinessMgr.Net.Core.Web.App; using Sarand.BusinessMgr.Web.Portal.Components; -using Sarand.BusinessMgr.Web.Portal.Models; using Sarand.BusinessMgr.Web.Portal.Models.Vehicles; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles { //====================================================================== public partial class VehicleClassController : SbmController_Portal - { - //------------------------------------------------------------------- - // Data members. + { + //------------------------------------------------------------------- + // Data members. - //------------------------------------------------------------------- - // Construction. - public VehicleClassController(SbmLocaliser localiser, ILogger logger) : - base(localiser, logger) - { - } + //------------------------------------------------------------------- + // Construction. + public VehicleClassController(SbmLocaliser localiser, ILogger logger) : + base(localiser, logger) + { + } //------------------------------------------------------------------- [Route("Vehicles/VehicleClass")] - public IActionResult Index() - { - if (!ValidUserSession) - AutoLoginUser(); + public IActionResult Index(Model_VehicleClass model) + { + if (!ValidUserSession) + AutoLoginUser(); - // Redirect to sign-in if not signed-in. - if (!ValidUserSession) - { - ClearKeepLoggedInCookie(); - return RedirectToAction("", "Security"); - } + // Redirect to sign-in if not signed-in. + if (!ValidUserSession) + { + ClearKeepLoggedInCookie(); + return RedirectToAction("", "Security"); + } + RefreshModel(model); - // VehicleClass page. - Model_VehicleClass model = new Model_VehicleClass(Localiser); + // Redirect Home if no access to Vehicles. + if (!model.AllowOption(Net.Standard.Base.App.Sbm.ConfigOption.Vehicles)) + return RedirectToAction("", ""); + + // VehicleClass page. + model.PopulateListConfig(); return View("Views/Vehicles/VehicleClass/Index.cshtml", model); } //------------------------------------------------------------------- } - //====================================================================== + //====================================================================== } diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Addreses/Model_Address.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Addreses/Model_Address.cs index 71137d6..6368f53 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Addreses/Model_Address.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Addreses/Model_Address.cs @@ -1,20 +1,12 @@ -using DocumentFormat.OpenXml.Office2016.Excel; -using NPOI.SS.Util; -using Sarand.BusinessMgr.Net.Core.Web.App; +using Sarand.BusinessMgr.Net.Core.Web.App; using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.BusinessMgr.Web.Portal.Components; -using Sarand.BusinessMgr.Web.Portal.Controllers.Addresses; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; -using Sarand.Net.Standard.Base.ReferenceData; using Sarand.Net.Standard.Base.Utils; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm; namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses { @@ -175,7 +167,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Item. if (Address.ItemType != null || Address.ItemId != null) { - String controlName = GetFieldName(Model_Address.ItemField.Item); + String controlName = GetFieldName(ItemField.Item); SbmItemId itemIdAddress = GetAddressItemId(); if (!ItemId.IsValid(GetAddressItemId())) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); @@ -184,7 +176,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Address Type. if (Address.Type != null) { - String controlName = GetFieldName(Model_Address.ItemField.Type); + String controlName = GetFieldName(ItemField.Type); if (Address.Type.IsEmpty() || GetAddressType() <= 0) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); } @@ -192,7 +184,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Reference. if (Address.RefExt != null) { - String controlName = GetFieldName(Model_Address.ItemField.RefExt); + String controlName = GetFieldName(ItemField.RefExt); Address.RefExt = Address.RefExt.ToUpperInvariant(); responseData.SetControlValue(controlName, Address.RefExt); if (!StringUtil.IsEmpty(Address.RefExt) && StringUtil.GetLength(Address.RefExt) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_RefExt)) @@ -202,7 +194,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Reference Address. if (Address.AddressIdRef != null) { - String controlName = GetFieldName(Model_Address.ItemField.AddressRef); + String controlName = GetFieldName(ItemField.AddressRef); if (!SysId.IsValid(GetAddressIdRef())) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); } @@ -210,7 +202,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Name. if (Address.Name != null) { - String controlName = GetFieldName(Model_Address.ItemField.Name); + String controlName = GetFieldName(ItemField.Name); responseData.SetControlValue(controlName, Address.Name); if (!Address.Name.IsEmpty() && StringUtil.GetLength(Address.Name) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Name)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Name)]); @@ -219,7 +211,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Description. if (Address.DescBrief != null) { - String controlName = GetFieldName(Model_Address.ItemField.DescBrief); + String controlName = GetFieldName(ItemField.DescBrief); responseData.SetControlValue(controlName, Address.DescBrief); if (!Address.DescBrief.IsEmpty() && StringUtil.GetLength(Address.DescBrief) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_DescBrief)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_DescBrief)]); @@ -228,7 +220,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Line 1. if (Address.Line1 != null) { - String controlName = GetFieldName(Model_Address.ItemField.Line1); + String controlName = GetFieldName(ItemField.Line1); responseData.SetControlValue(controlName, Address.Line1); if (Address.Line1.IsBlank()) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); @@ -239,7 +231,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Line 2. if (Address.Line2 != null) { - String controlName = GetFieldName(Model_Address.ItemField.Line2); + String controlName = GetFieldName(ItemField.Line2); responseData.SetControlValue(controlName, Address.Line2); if (!Address.Line2.IsEmpty() && StringUtil.GetLength(Address.Line2) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line2)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line2)]); @@ -248,7 +240,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Line 3. if (Address.Line3 != null) { - String controlName = GetFieldName(Model_Address.ItemField.Line3); + String controlName = GetFieldName(ItemField.Line3); responseData.SetControlValue(controlName, Address.Line3); if (!Address.Line3.IsEmpty() && StringUtil.GetLength(Address.Line3) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line3)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line3)]); @@ -257,7 +249,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // City. if (Address.City != null) { - String controlName = GetFieldName(Model_Address.ItemField.City); + String controlName = GetFieldName(ItemField.City); responseData.SetControlValue(controlName, Address.City); if (!Address.City.IsEmpty() && StringUtil.GetLength(Address.City) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_City)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_City)]); @@ -268,7 +260,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Province. if (Address.Province != null) { - String controlName = GetFieldName(Model_Address.ItemField.Province); + String controlName = GetFieldName(ItemField.Province); responseData.SetControlValue(controlName, Address.Province); if (!Address.Province.IsEmpty() && StringUtil.GetLength(Address.Province) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Province)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Province)]); @@ -279,7 +271,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Postcode. if (Address.Postcode != null) { - String controlName = GetFieldName(Model_Address.ItemField.Postcode); + String controlName = GetFieldName(ItemField.Postcode); Address.Postcode = Address.Postcode.ToUpperInvariant(); responseData.SetControlValue(controlName, Address.Postcode); if (!Address.Postcode.IsEmpty() && StringUtil.GetLength(Address.Postcode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Postcode)) @@ -289,7 +281,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Country. if (Address.Country != null) { - String controlName = GetFieldName(Model_Address.ItemField.Country); + String controlName = GetFieldName(ItemField.Country); responseData.SetControlValue(controlName, Address.Country); if (!Address.Country.IsEmpty() && StringUtil.GetLength(Address.Country) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Country)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Country)]); @@ -300,7 +292,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Contact. if (Address.Contact != null) { - String controlName = GetFieldName(Model_Address.ItemField.Contact); + String controlName = GetFieldName(ItemField.Contact); responseData.SetControlValue(controlName, Address.Contact); if (!Address.Contact.IsEmpty() && StringUtil.GetLength(Address.Contact) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Contact)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Contact)]); @@ -309,7 +301,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Phone. if (Address.Phone != null) { - String controlName = GetFieldName(Model_Address.ItemField.Phone); + String controlName = GetFieldName(ItemField.Phone); responseData.SetControlValue(controlName, Address.Phone); if (!Address.Phone.IsEmpty() && StringUtil.GetLength(Address.Phone) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Phone)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Phone)]); @@ -318,7 +310,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Fax. if (Address.Fax != null) { - String controlName = GetFieldName(Model_Address.ItemField.Fax); + String controlName = GetFieldName(ItemField.Fax); responseData.SetControlValue(controlName, Address.Fax); if (!Address.Fax.IsEmpty() && StringUtil.GetLength(Address.Fax) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Fax)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Fax)]); @@ -327,7 +319,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Email. if (Address.Email != null) { - String controlName = GetFieldName(Model_Address.ItemField.Email); + String controlName = GetFieldName(ItemField.Email); responseData.SetControlValue(controlName, Address.Email); if (!Address.Email.IsEmpty() && StringUtil.GetLength(Address.Email) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Email)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Email)]); @@ -336,7 +328,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Last Visit On. if (Address.LastVisitOn != null) { - String controlName = GetFieldName(Model_Address.ItemField.LastVisitOn); + String controlName = GetFieldName(ItemField.LastVisitOn); DateTime lastVisitOn = GetAddressLastVisitOn(); if (!StringUtil.IsBlank(Address.LastVisitOn)) { @@ -350,7 +342,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses // Next Visit On. if (Address.NextVisitOn != null) { - String controlName = GetFieldName(Model_Address.ItemField.NextVisitOn); + String controlName = GetFieldName(ItemField.NextVisitOn); DateTime lastVisitOn = GetAddressNextVisitOn(); if (!StringUtil.IsBlank(Address.NextVisitOn)) { diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_Asset-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_Asset-Config.cs index 7d13cf2..5f0b691 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_Asset-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_Asset-Config.cs @@ -128,7 +128,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets config.Column.Hide.Add($"{ItemField.Category}"); // Asset Category Assets. - if (!modeIsMaintain || !SessionConsole.AllowOption(Sbm.ConfigOption.Vehicles)) + if (!modeIsMaintain || !AllowOption(Sbm.ConfigOption.Vehicles)) config.Column.Hide.Add($"{ItemField.VehicleCount}"); // Actions. diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_AssetCategory-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_AssetCategory-Config.cs index 38084be..c877ff2 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_AssetCategory-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_AssetCategory-Config.cs @@ -109,10 +109,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets // List columns. if (GetFilterAssetType() > 0) - config.Column.Hide.Add($"{ItemField.TypeDesc}"); + config.Column.Hide.Add($"{ItemField.Type}"); // Asset Category Assets. - if (!modeIsMaintain || !SessionConsole.AllowOption(Sbm.ConfigOption.Assets)) + if (!modeIsMaintain || !AllowOption(Sbm.ConfigOption.Assets)) config.Column.Hide.Add($"{ItemField.AssetCount}"); // Actions. @@ -123,15 +123,15 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets //------------------------------------------------------------------- // Item configuration. //------------------------------------------------------------------- - // Legacy AssetCategory dialog tabs and panels. + // Legacy dialog tabs and panels. // Dialog: // - Asset type, code, caption. - // Tab 1 'Properties': + // Panels: // Defaults - Income type. // Purchase - Purcahse tax code, payment terms. // Sale - Sell tax code, profit tax code. // Notes. - // Tab 2 'Processes'. + // Processes. //------------------------------------------------------------------- public class ItemConfigData diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_AssetCategory.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_AssetCategory.cs index d2ad1ae..2170b94 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_AssetCategory.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_AssetCategory.cs @@ -1,15 +1,10 @@ -using DocumentFormat.OpenXml.Spreadsheet; -using Microsoft.AspNetCore.Http; -using Sarand.BusinessMgr.Net.Core.Web.App; +using Sarand.BusinessMgr.Net.Core.Web.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.Bus.Control; using Sarand.BusinessMgr.Web.Portal.Components; 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; @@ -74,7 +69,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets //------------------------------------------------------------------- // Validation. //------------------------------------------------------------------- - // AssetCategory. + // Asset Category. public bool ValidateAssetCategoryData(SbmController_Base.AjaxResponse_Data responseData) { // Record disposable items as they are created so all can be disposed when needed. @@ -84,7 +79,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets // AssetCategory type. if (AssetCategory.TypeCode != null) { - String controlName = @Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Type); + String controlName = GetFieldName(ItemField.Type); AssetCategory.AssetType = (Sbm.AssetType)Internals.AssetTypeCodes.GetTypeForCode(AssetCategory.TypeCode); responseData.SetControlValue(controlName, AssetCategory.TypeCode); if (StringUtil.IsBlank(AssetCategory.TypeCode)) @@ -96,7 +91,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets // AssetCategory Code. if (AssetCategory.Code != null) { - String controlName = @Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Code); + String controlName = GetFieldName(ItemField.Code); AssetCategory.Code = AssetCategory.Code.ToUpper(); responseData.SetControlValue(controlName, AssetCategory.Code); if (StringUtil.IsBlank(AssetCategory.Code)) @@ -108,7 +103,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets // AssetCategory Caption. if (AssetCategory.Caption != null) { - String controlName = @Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Caption); + String controlName = GetFieldName(ItemField.Caption); responseData.SetControlValue(controlName, AssetCategory.Caption); if (StringUtil.IsBlank(AssetCategory.Caption)) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); @@ -119,7 +114,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets // Notes. if (AssetCategory.Notes != null) { - String controlName = @Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Notes); + String controlName = GetFieldName(ItemField.Notes); responseData.SetControlValue(controlName, AssetCategory.Notes); if (StringUtil.GetLength(AssetCategory.Notes) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAssetCategory_Notes)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAssetCategory_Notes)]); @@ -128,7 +123,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets // AssetCategory status. if (AssetCategory.StatusCode != null) { - String controlName = @Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Status); + String controlName = GetFieldName(ItemField.Status); if (StringUtil.IsBlank(AssetCategory.StatusCode)) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); else if (!SbmAssetCategory.ValidStatuses.Contains(GetAssetCategoryStatus())) diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity-Config.cs index bdab761..1fd8c3b 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity-Config.cs @@ -1,9 +1,7 @@ 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; -using System.Drawing; namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities { @@ -288,11 +286,11 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities config.Column.Hide.Add($"{ItemField.SalePackQty}"); // Customer. - if (modeIsStockControl || !SessionConsole.AllowOption(Sbm.ConfigOption.CommodityExclusiveToCustomer)) + if (modeIsStockControl || !AllowOption(Sbm.ConfigOption.CommodityExclusiveToCustomer)) config.Column.Hide.Add($"{ItemField.Customer}"); // Promotion. - if (!SessionConsole.AllowOption(Sbm.ConfigOption.CommodityPromotion) || !CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.CommodityPromotion)) || !CommodityMgr.ColumnExists(SbmDbDfn.ColumnIdx.Commodity_PromotionCode)) + if (!AllowOption(Sbm.ConfigOption.CommodityPromotion) || !CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.CommodityPromotion)) || !CommodityMgr.ColumnExists(SbmDbDfn.ColumnIdx.Commodity_PromotionCode)) config.Column.Hide.Add($"{ItemField.Promotion}"); //--------------------------------------------------------------- @@ -502,7 +500,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities config.Field.Readonly.Add($"{ItemField.DescOrder}"); // Customer. - if (!SessionConsole.AllowOption(Sbm.ConfigOption.CommodityExclusiveToCustomer)) + if (!AllowOption(Sbm.ConfigOption.CommodityExclusiveToCustomer)) config.Field.Hide.Add($"{ItemField.Customer}"); else if (managedByAccounts) config.Field.Readonly.Add($"{ItemField.Customer}"); @@ -516,7 +514,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities config.Field.Hide.Add($"{ItemField.NominalCode}"); // Promotion. - if (!SessionConsole.AllowOption(Sbm.ConfigOption.CommodityPromotion) || !CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.CommodityPromotion)) || !CommodityMgr.ColumnExists(SbmDbDfn.ColumnIdx.Commodity_PromotionCode)) + if (!AllowOption(Sbm.ConfigOption.CommodityPromotion) || !CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.CommodityPromotion)) || !CommodityMgr.ColumnExists(SbmDbDfn.ColumnIdx.Commodity_PromotionCode)) config.Field.Hide.Add($"{ItemField.Promotion}"); //--------------------------------------------------------------- @@ -652,7 +650,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities // Asset. // Asset category. - if (!SessionConsole.AllowOption(Sbm.ConfigOption.Assets)) + if (!AllowOption(Sbm.ConfigOption.Assets)) config.Field.Hide.Add($"{ItemField.AssetCategory}"); //--------------------------------------------------------------- diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity.cs index 97aa6d3..d367d61 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity.cs @@ -131,7 +131,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities // Commodity Type. if (Commodity.Type != null) { - String controlName = GetFieldName(Model_Commodity.ItemField.Type); + String controlName = GetFieldName(ItemField.Type); if (Commodity.Type.IsEmpty() || GetCommodityType() <= 0) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); } @@ -139,7 +139,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities // Commodity Code. if (Commodity.Code != null) { - String controlName = GetFieldName(Model_Commodity.ItemField.Code); + String controlName = GetFieldName(ItemField.Code); Commodity.Code = Commodity.Code.ToUpperInvariant(); responseData.SetControlValue(controlName, Commodity.Code); if (Commodity.Code.IsEmpty()) @@ -151,7 +151,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities // Commodity Description. if (Commodity.DescBrief != null) { - String controlName = GetFieldName(Model_Commodity.ItemField.DescBrief); + String controlName = GetFieldName(ItemField.DescBrief); responseData.SetControlValue(controlName, Commodity.DescBrief); if (Commodity.DescBrief.IsEmpty()) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); @@ -162,7 +162,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities // Commodity Sales Price. if (Commodity.SaleAmount != null) { - String controlName = GetFieldName(Model_Commodity.ItemField.SaleAmount); + String controlName = GetFieldName(ItemField.SaleAmount); responseData.SetControlValue(controlName, Commodity.SaleAmount); if (Commodity.SaleAmount.IsBlank()) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); @@ -173,7 +173,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities // Commodity Tax. if (Commodity.SaleTaxCode != null) { - String controlName = GetFieldName(Model_Commodity.ItemField.SaleTaxCode); + String controlName = GetFieldName(ItemField.SaleTaxCode); if (Commodity.SaleTaxCode.IsBlank()) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); else if (!SysId.IsValid(GetCommoditySalesTaxCodeId())) @@ -183,7 +183,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities // Commodity Sales Unit Type. if (Commodity.SaleUnitType != null) { - String controlName = GetFieldName(Model_Commodity.ItemField.SaleUnit); + String controlName = GetFieldName(ItemField.SaleUnit); if (Commodity.SaleUnitType.IsBlank()) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); else if (GetCommoditySalesUnitType() == SaUomType.Unknown || !SysId.IsValid(GetCommoditySalesUnitId())) @@ -193,7 +193,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities // Commodity Sales pack quantity. if (Commodity.SalePackQty != null) { - String controlName = GetFieldName(Model_Commodity.ItemField.SalePackQty); + String controlName = GetFieldName(ItemField.SalePackQty); if (!StringUtil.IsBlank(Commodity.SalePackQty) && (!StringUtil.IsDecimal(Commodity.SalePackQty) || GetCommoditySalesPackQty() < 1)) responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]); } @@ -262,7 +262,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities else msg += $" Issue: None."; SaLogger.Warn($"{SysUtil.Fn} {msg}"); - responseData.SetControlError(GetFieldName(Model_Commodity.ItemField.Code), Localiser["msg.validation.duplicate.value"]); + responseData.SetControlError(GetFieldName(ItemField.Code), Localiser["msg.validation.duplicate.value"]); break; } } diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Association-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Association-Config.cs index 16a3c47..19442bd 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Association-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Association-Config.cs @@ -5,10 +5,7 @@ using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; using System; -using System.Buffers; using System.Collections.Generic; -using System.Drawing; -using System.Xml.Serialization; namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts { @@ -203,9 +200,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts if (!modeIsMaintain || !typeIsCustomer || !CommodityMgr.CanManageCommodityCustomers()) config.Column.Hide.Add($"{ItemField.CommodityCount}"); // Customer pricing. - if (!modeIsMaintain || !typeIsCustomer || !UserCanViewFinancials() || !SessionConsole.AllowOption(Sbm.ConfigOption.CustomerDiscount)) + if (!modeIsMaintain || !typeIsCustomer || !UserCanViewFinancials() || !AllowOption(Sbm.ConfigOption.CustomerDiscount)) config.Column.Hide.Add($"{ItemField.DiscountRate}"); - if (!modeIsMaintain || !typeIsCustomer || !UserCanViewFinancials() || !SessionConsole.AllowOption(Sbm.ConfigOption.CustomerPriceSet) && PriceMgr.PriceDatabaseIsValid) + if (!modeIsMaintain || !typeIsCustomer || !UserCanViewFinancials() || !AllowOption(Sbm.ConfigOption.CustomerPriceSet) && PriceMgr.PriceDatabaseIsValid) config.Column.Hide.Add($"{ItemField.PriceSet}"); // Association group. if (!modeIsMaintain || !typeIsCustomer || !SessionConsole.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Association_Group)) @@ -418,7 +415,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts config.Field.Readonly.Add($"{ItemField.AccountBalance}"); // Discount. - if (!UserCanViewFinancials() || (!managedByAccounts && !SessionConsole.AllowOption(isSupplier ? Sbm.ConfigOption.SupplierDiscount : Sbm.ConfigOption.CustomerDiscount))) + if (!UserCanViewFinancials() || (!managedByAccounts && !AllowOption(isSupplier ? Sbm.ConfigOption.SupplierDiscount : Sbm.ConfigOption.CustomerDiscount))) { config.Field.Hide.Add($"{ItemField.DiscountType}"); config.Field.Hide.Add($"{ItemField.DiscountRate}"); @@ -430,7 +427,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts } // Price set. - if (!UserCanViewFinancials() || (!managedByAccounts && !SessionConsole.AllowOption(isSupplier ? Sbm.ConfigOption.SupplierPriceSet : Sbm.ConfigOption.CustomerPriceSet)) || !PriceMgr.PriceDatabaseIsValid) + if (!UserCanViewFinancials() || (!managedByAccounts && !AllowOption(isSupplier ? Sbm.ConfigOption.SupplierPriceSet : Sbm.ConfigOption.CustomerPriceSet)) || !PriceMgr.PriceDatabaseIsValid) config.Field.Hide.Add($"{ItemField.PriceSet}"); else if (!localPricing || !UserCanUpdateFinancials()) config.Field.Readonly.Add($"{ItemField.PriceSet}"); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement-Config.cs index 850c1fb..edcadb9 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement-Config.cs @@ -1,11 +1,9 @@ using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.BusinessMgr.Web.Portal.Models.Transactions; -using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; -using System.Drawing; namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements { @@ -201,15 +199,15 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements // Options. bool userCanCreateRequirements = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.Requirement); bool userCanUpdateRequirements = SessionData_Portal.SecurityProfile.UserCanUpdateItemType(Sbm.ItemType.Requirement); - bool allowJobNumber = SessionConsole.AllowOption(Sbm.ConfigOption.SalesOrderItemJobNumber); + bool allowJobNumber = AllowOption(Sbm.ConfigOption.SalesOrderItemJobNumber); bool showDrawingIssue = SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_DrawingIssue); bool showAllocationInd = SessionConsole.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.OrderItem_AllocationInd); SbmStockControlConfig stockControlConfig = Internals.StockControlConfig; - bool allowProductionControl = SessionConsole.AllowOption(Sbm.ConfigOption.ProductionControl); - bool allowTimeRecording = SessionConsole.AllowOption(Sbm.ConfigOption.TimeRecording); - bool allowCommodityPromotions = SessionConsole.AllowOption(Sbm.ConfigOption.CommodityPromotion); + bool allowProductionControl = AllowOption(Sbm.ConfigOption.ProductionControl); + bool allowTimeRecording = AllowOption(Sbm.ConfigOption.TimeRecording); + bool allowCommodityPromotions = AllowOption(Sbm.ConfigOption.CommodityPromotion); bool allowJobCosting = SessionConsole.GetRequirementCostingConfig().AllowRequirementCosting(transactionType) && TransactionMgr.CostColumnsAreAvailable() && UserCanViewFinancials(); - bool allowSalesOrderItemRandD = SessionConsole.AllowOption(Sbm.ConfigOption.SalesOrderItemRandD); + bool allowSalesOrderItemRandD = AllowOption(Sbm.ConfigOption.SalesOrderItemRandD); //--------------------------------------------------------------- // List Caption. @@ -506,7 +504,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements config.Field.Hide.Add($"{ItemField.Id}"); // Job Number. - if (transactionType != Sbm.TransactionType.SalesOrder || !SessionConsole.AllowOption(Sbm.ConfigOption.SalesOrderItemJobNumber)) + if (transactionType != Sbm.TransactionType.SalesOrder || !AllowOption(Sbm.ConfigOption.SalesOrderItemJobNumber)) config.Field.Hide.Add($"{ItemField.JobNumber}"); // Narrative. diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Transactions/Model_Transaction-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Transactions/Model_Transaction-Config.cs index 18e393f..b32d82c 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Transactions/Model_Transaction-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Transactions/Model_Transaction-Config.cs @@ -1,11 +1,9 @@ using Sarand.BusinessMgr.Net.Core.Web.App; using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; -using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; -using System.Drawing; namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions { @@ -229,7 +227,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions // Options. bool userCanCreateTransactions = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.Transaction); bool userCanUpdateTransactions = SessionData_Portal.SecurityProfile.UserCanUpdateItemType(Sbm.ItemType.Transaction); - bool allowTimeRecording = SessionConsole.AllowOption(Sbm.ConfigOption.TimeRecording); + bool allowTimeRecording = AllowOption(Sbm.ConfigOption.TimeRecording); bool allowJobCosting = SessionConsole.GetRequirementCostingConfig().AllowRequirementCosting(transactionType) && TransactionMgr.CostColumnsAreAvailable() && UserCanViewFinancials(); //--------------------------------------------------------------- @@ -287,7 +285,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions // Addresses and contact. // Delivery address. - if (modeIsDeliveryPlanning || (isSalesOrder && SessionConsole.AllowOption(Sbm.ConfigOption.ShowSiteAddrOnTransView))) + if (modeIsDeliveryPlanning || (isSalesOrder && AllowOption(Sbm.ConfigOption.ShowSiteAddrOnTransView))) { config.Column.Label.Add($"{ItemField.DeliveryAddress}", Localiser["label.delivery.address"]); config.Column.Label.Add($"{ItemField.DeliveryPostcode}", Localiser["label.delivery.postcode"]); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_Vehicle-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_Vehicle-Config.cs index 1267c61..a964860 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_Vehicle-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_Vehicle-Config.cs @@ -119,7 +119,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles config.Column.Hide.Add($"{ItemField.Class}"); // Vehicle Assets. - if (!modeIsMaintain || !SessionConsole.AllowOption(Sbm.ConfigOption.Assets)) + if (!modeIsMaintain || !AllowOption(Sbm.ConfigOption.Assets)) config.Column.Hide.Add($"{ItemField.AssetCount}"); // Actions. diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_VehicleClass-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_VehicleClass-Config.cs index 91e96c7..a9a3200 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_VehicleClass-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_VehicleClass-Config.cs @@ -1,10 +1,8 @@ -using Sarand.BusinessMgr.Net.Core.Web.App; -using Sarand.BusinessMgr.Net.Standard.Base.App; +using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; -using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; -using Sarand.Net.Standard.Base.Core; -using Sarand.Net.Standard.Base.Utils; +using System; +using System.Collections.Generic; namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles { @@ -15,6 +13,222 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles { //------------------------------------------------------------------- + /// Prefix for field names. + public const String FieldNamePrefix = "VehicleClass"; + + /// Item fields. + public enum ItemField + { + // VehicleClass properties. + Id, + Exists, + // Identity. + VehicleTypeCode, + VehicleType, + VehicleCategoryCode, + VehicleCategory, + Caption, + MakeCode, + Make, + Model, + Derivative, + // Properties. + FuelType, + OdometerUnits, + Seats, + Weight, + InsuranceCode, + FirstServiceOdo, + ServiceOdo, + ServiceWeeks, + RentalCostAmount, + RentalCostUomId, + RentalPriceAmount, + RentalPriceUomId, + // Associated properties. + VehicleCount, + // Common. + Notes, + Status, + CreatedOn, + UpdatedOn, + Actions, + } + + /// + /// Identifier used by form fields to show control specific messages generated by model validation etc. + /// - Both page and model should use this method to consistently generate the field name. + /// + 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_VehicleClass.FieldNamePrefix; + // Hide column. + public HashSet Hide { get; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + // Column labels. + public Dictionary Label { get; } = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + } + public ColumnData Column { get; } = new ColumnData(); + } + public ListConfigData ListConfig { get; private set; } + + //------------------------------------------------------------------- + /// + /// Populate VehicleClass list configuration data - only required on initial page construction. + /// + 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 userCanCreateVehicleClasses = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.VehicleClass); + bool userCanUpdateVehicleClasses = SessionData_Portal.SecurityProfile.UserCanUpdateItemType(Sbm.ItemType.VehicleClass); + + // Actions. + + if (userCanCreateVehicleClasses) + config.Action.Allow.Create = true; + if (userCanUpdateVehicleClasses) + config.Action.Allow.Update = true; + + // List columns. + + if (GetFilterVehicleType() > 0) + config.Column.Hide.Add($"{ItemField.VehicleType}"); + + // Vehicles. + if (!modeIsMaintain || !AllowOption(Sbm.ConfigOption.Vehicles)) + config.Column.Hide.Add($"{ItemField.VehicleCount}"); + + // Actions. + if (!modeIsMaintain) + config.Column.Hide.Add($"{ItemField.Actions}"); + } + + //------------------------------------------------------------------- + // Item configuration. + //------------------------------------------------------------------- + // Legacy dialog tabs and panels. + // Dialog: + // - Type, category, make, model. + // - Derivative, caption, status. + // Panels: + // Defaults - Fuel, seats, insurance, weight, First service, odometer, service interval miles, service interval weeks. + // Rental - Rental cost & period, rental price & period. + // Notes. + //------------------------------------------------------------------- + + public class ItemConfigData + { + public String Title { get; set; } + public String Prefix { get; } = Model_VehicleClass.FieldNamePrefix; + public bool Readonly { get; set; } = false; + // Allowed actions. + public class AllowData + { + } + public AllowData Allow { get; } = new AllowData(); + // Item fields. + public class FieldData + { + // Field name prefix. + public String Prefix { get; } = Model_VehicleClass.FieldNamePrefix; + // Hide field. + public HashSet Hide { get; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + // Read-only field. + public HashSet Readonly { get; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + // Field labels. + public Dictionary Label { get; } = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + } + public FieldData Field { get; } = new FieldData(); + } + /// + /// Populate item configuration for existing vehicle. + /// + public void PopulateItemConfig(ItemConfigData config, SbmVehicleClass vehicleClass) + { + PopulateItemConfig(config, vehicleClass.GetItemId(), vehicleClass.VehicleType); + } + /// + /// Populate item configuration for new or existing vehicle. + /// + public void PopulateItemConfig(ItemConfigData config, SbmItemId vehicleClassId, Sbm.VehicleType assetType) + { + // Session configuration. + bool userCanCreateVehicleClasses = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.VehicleClass); + bool userCanUpdateVehicleClasses = SessionData_Portal.SecurityProfile.UserCanUpdateItemType(Sbm.ItemType.VehicleClass); + + // Update dialog title. + config.Title = Localiser["caption.vehicle.class.update"]; + if (!userCanUpdateVehicleClasses) config.Readonly = true; + + //--------------------------------------------------------------- + // Identity. + + // Properties readonly if any associated vehicles. + if (ItemId.IsValid(vehicleClassId) && AssetMgr.VehicleClassHasVehicles(vehicleClassId.Id)) + { + //config.Field.Readonly.Add($"{ItemField.VehicleType}"); + //config.Field.Readonly.Add($"{ItemField.VehicleCategory}"); + } + + // Caption. + if (!userCanUpdateVehicleClasses) + config.Field.Readonly.Add($"{ItemField.Caption}"); + + //--------------------------------------------------------------- + // Defaults. + // Fuel, seats, insurance, weight, First service, odometer, service interval miles, service interval weeks. + + //--------------------------------------------------------------- + // Rental. + // Rental cost & period, rental price & period. + + if (!UserCanViewFinancials()) + { + config.Field.Hide.Add($"{ItemField.RentalCostAmount}"); + config.Field.Hide.Add($"{ItemField.RentalCostUomId}"); + config.Field.Hide.Add($"{ItemField.RentalPriceAmount}"); + config.Field.Hide.Add($"{ItemField.RentalPriceUomId}"); + } + else if (!UserCanUpdateFinancials()) + { + config.Field.Readonly.Add($"{ItemField.RentalCostAmount}"); + config.Field.Readonly.Add($"{ItemField.RentalCostUomId}"); + config.Field.Readonly.Add($"{ItemField.RentalPriceAmount}"); + config.Field.Readonly.Add($"{ItemField.RentalPriceUomId}"); + } + + //--------------------------------------------------------------- + // Common properties. + + //--------------------------------------------------------------- + } //------------------------------------------------------------------- } //======================================================================= diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_VehicleClass.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_VehicleClass.cs index 59badf8..bcbd7fa 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_VehicleClass.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_VehicleClass.cs @@ -6,6 +6,7 @@ using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; +using System; namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles { @@ -14,6 +15,13 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles //======================================================================= public partial class Model_VehicleClass : SbmModel_Portal { + //------------------------------------------------------------------- + // Definitions. + public enum ViewMode + { + Search, Maintain + } + //------------------------------------------------------------------- // Construction. public Model_VehicleClass(SbmLocaliser localiser) : @@ -25,11 +33,16 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles // Filter properties. public class FilterData { - public string VehicleType { get; set; } - public string Search { get; set; } - public string StatusCat { get; set; } + public String Mode { get; set; } + public String VehicleType { get; set; } + public String Search { get; set; } + public String StatusCat { get; set; } } public FilterData Filter { get; } = new FilterData(); + public ViewMode GetFilterMode() + { + return EnumUtil.ParseEnum(Filter.Mode, ViewMode.Search); + } public Sbm.VehicleType GetFilterVehicleType() { return (Sbm.VehicleType)Internals.VehicleTypeCodes.GetTypeForCode(Filter.VehicleType); @@ -43,49 +56,74 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles // Item properties. public class VehicleClassData { - public string Exists { get; set; } - public string Id { get; set; } - public string MakeCode { get; set; } - public string Model { get; set; } - public string Derivative { get; set; } - public string DescBrief { get; set; } - public string VehicleTypeCode { get; set; } - public Sbm.VehicleType VehicleType { get; set; } = Sbm.VehicleType.Unknown; - public string VehicleCategoryCode { get; set; } - public string FuelTypeCode { get; set; } - public Sbm.VehicleFuelType FuelType { get; set; } = Sbm.VehicleFuelType.Unknown; - public string OdometerUnitsCode { get; set; } - public Sbm.VehicleOdometerUnits OdometerUnits { get; set; } = Sbm.VehicleOdometerUnits.Unknown; - public string Notes { get; set; } - public string StatusCode { get; set; } + public String Exists { get; set; } + public String Id { get; set; } + // Vehicle. + public String VehicleTypeCode { get; set; } + public String VehicleCategoryCode { get; set; } + public String MakeCode { get; set; } + public String Model { get; set; } + public String Derivative { get; set; } + public String Caption { get; set; } + // Properties. + public String FuelTypeCode { get; set; } + public String OdometerUnitsCode { get; set; } + public String Seats { get; set; } + public String Weight { get; set; } + public String InsuranceCode { get; set; } + public String FirstServiceOdo { get; set; } + public String ServiceOdo { get; set; } + public String ServiceWeeks { get; set; } + // Rental. + public String RentalCostAmount { get; set; } + public String RentalCostUomId { get; set; } + public String RentalPriceAmount { get; set; } + public String RentalPriceUomId { get; set; } + // Common. + public String Notes { get; set; } + public String StatusCode { get; set; } public SaStatus GetStatus() { return SacsSystem.GetStatusForCode(StatusCode); } } public VehicleClassData VehicleClass { get; } = new VehicleClassData(); + public SysId GetVehicleClassId() { return SysId.ToSysId(VehicleClass.Id); } + public Sbm.VehicleType GetVehicleClassVehicleType() { return (Sbm.VehicleType)Internals.GetApplicationCodes(Sbm.ApplicationCode.VehicleType).GetTypeForCode(VehicleClass.VehicleTypeCode); } + public Sbm.VehicleFuelType GetVehicleClassFuelType() { return (Sbm.VehicleFuelType)Internals.GetApplicationCodes(Sbm.ApplicationCode.FuelType).GetTypeForCode(VehicleClass.FuelTypeCode); } + public Sbm.VehicleOdometerUnits GetVehicleClassOdometerUnits() { return (Sbm.VehicleOdometerUnits)Internals.GetApplicationCodes(Sbm.ApplicationCode.OdometerUnits).GetTypeForCode(VehicleClass.OdometerUnitsCode); } + public SaStatus GetVehicleClassStatus() { return SacsSystem.GetStatusForCode(VehicleClass.StatusCode); } //------------------------------------------------------------------- // Validation. //------------------------------------------------------------------- - // VehicleClass. + // Vehicle Class. public bool ValidateVehicleClassData(Sacs.Web.Components.SaController.AjaxResponse_Data responseData) { // Record disposable items as they are created so all can be disposed when needed. using (DisposableCollection disposables = new DisposableCollection()) { + // Category. + if (VehicleClass.VehicleCategoryCode != null) + { + string controlName = GetFieldName(ItemField.VehicleCategory); + if (StringUtil.GetLength(VehicleClass.VehicleCategoryCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_VehicleCategoryCode)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_VehicleCategoryCode)]); + } + // Make. if (VehicleClass.MakeCode != null) { - string controlName = "VehicleClassMake"; + string controlName = GetFieldName(ItemField.Make); responseData.SetControlValue(controlName, VehicleClass.MakeCode); if (VehicleClass.MakeCode.IsBlank()) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); + else if (StringUtil.GetLength(VehicleClass.MakeCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode)]); } // Model. if (VehicleClass.Model != null) { - string controlName = "VehicleClassModel"; - VehicleClass.Model = VehicleClass.Model.ToUpper(); + string controlName = GetFieldName(ItemField.Model); responseData.SetControlValue(controlName, VehicleClass.Model); if (VehicleClass.Model.IsBlank()) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); @@ -93,30 +131,46 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_Model)]); } - // VehicleClass DescBrief. - if (VehicleClass.DescBrief != null) + // Derivative. + if (VehicleClass.Derivative != null) { - string controlName = "VehicleClassDescription"; - responseData.SetControlValue(controlName, VehicleClass.DescBrief); - if (VehicleClass.DescBrief.IsBlank()) - responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); - else if (StringUtil.GetLength(VehicleClass.DescBrief) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief)) + string controlName = GetFieldName(ItemField.Derivative); + responseData.SetControlValue(controlName, VehicleClass.Derivative); + if (StringUtil.GetLength(VehicleClass.Derivative) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief)]); } + // Caption. + if (VehicleClass.Caption != null) + { + string controlName = GetFieldName(ItemField.Caption); + responseData.SetControlValue(controlName, VehicleClass.Caption); + if (StringUtil.GetLength(VehicleClass.Caption) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief)]); + else if (!StringUtil.IsBlank(VehicleClass.Caption) && GetVehicleClassStatus() == SaStatus.Active) + { + // Non-blank caption must be unique. + SbmVehicleClass.Params prmVehicleClass = new(); + prmVehicleClass.IdsExcluded.AddId(GetVehicleClassId()); + prmVehicleClass.StatusCat = SbmVehicleClass.StatusCat.ActiveOnly; + if (AssetMgr.GetVehicleClassCount(prmVehicleClass) > 0) + responseData.SetControlError(controlName, Localiser["msg.vehicle.class.caption.unique"]); + } + } + // Notes. if (VehicleClass.Notes != null) { - string controlName = "VehicleClassNotes"; + string controlName = GetFieldName(ItemField.Notes); responseData.SetControlValue(controlName, VehicleClass.Notes); if (StringUtil.GetLength(VehicleClass.Notes) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_Notes)) responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_Notes)]); } - // VehicleClass status. + // Status. if (VehicleClass.StatusCode != null) { - string controlName = "VehicleClassStatus"; + string controlName = GetFieldName(ItemField.Status); if (VehicleClass.StatusCode.IsBlank()) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); else if (!SbmVehicleClass.ValidStatuses.Contains(VehicleClass.GetStatus())) diff --git a/SaBusinessMgrCoreWebPortal/Portal/TagHelpers/SbmFormControlTagHelper.cs b/SaBusinessMgrCoreWebPortal/Portal/TagHelpers/SbmFormControlTagHelper.cs new file mode 100644 index 0000000..77be290 --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Portal/TagHelpers/SbmFormControlTagHelper.cs @@ -0,0 +1,115 @@ +using Microsoft.AspNetCore.Razor.TagHelpers; +using Sarand.Net.Standard.Base.Utils; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Sarand.BusinessMgr.Web.Portal.TagHelpers +{ + // You may need to install the Microsoft.AspNetCore.Razor.Runtime package into your project + [HtmlTargetElement("sbm-form-control")] + public class SbmFormControlTagHelper : TagHelper + { + // Definitions. + public class SelectItem + { + public string Code { get; set; } = string.Empty; + public string Desc { get; set; } = string.Empty; + } + + // Parameters. + /// Control label text. + public string Label { get; set; } + /// Whether control value is mandatory - to show '*' indicator. + public bool Required { get; set; } + /// Label column size (1-12). Default: 3. + public int LabelColumn { get; set; } = 3; + /// Model binding control name. + public string BindingName { get; set; } + /// Value to include before control name. + public string NamePrefix { get; set; } + /// Defaults to ControlNameSuffix if not specified. At least one of these values must be supplied. + public string FormControlNameSuffix { get; set; } + /// Defaults to FormControlNameSuffix if not specified. At least one of these values must be supplied. + public string ControlNameSuffix { get; set; } + /// 'input', 'textarea', 'select'. + public string ControlType { get; set; } = "input"; + /// 'text', 'search', 'email' etc. + public string InputType { get; set; } = "text"; + /// Max length for input/textarea controls. Not set if < 1. + public int MaxLength { get; set; } + /// List of options to populate for Select. + public IEnumerable SelectItems { get; set; } + /// To exclude 'sbm-auto-val' class + public bool NoAutoValue { get; set; } + /// Number of tabs that form control is indented by. + public int Tabs { get; set; } = 2; + + // Properties. + public string FormControlName => $"{NamePrefix}{StringUtil.OnBlank(FormControlNameSuffix, ControlNameSuffix)}"; + public string ControlName => $"{NamePrefix}{StringUtil.OnBlank(ControlNameSuffix, FormControlNameSuffix)}"; + private string ControlIdPrefix => + ControlType.EqualsCI("input") || ControlType.EqualsCI("textarea") ? "if" + : ControlType.EqualsCI("select") ? "cb" + : throw new ArgumentException($"Unsupported ControlType: {ControlType}"); + private string ControlId => $"{ControlIdPrefix}{FormControlName}"; + private string FormControlTabs => new string('\t', Math.Max(1, Math.Min(12, Tabs))); + + // --- Process --- + + public override void Process(TagHelperContext context, TagHelperOutput output) + { + // Validate parameters. + if (StringUtil.IsBlank(FormControlNameSuffix) && StringUtil.IsBlank(ControlNameSuffix)) + throw new ArgumentException("At least one of FormControlNameSuffix or ControlNameSuffix must be specified."); + + // Configure tag. + output.TagName = "div"; + output.Attributes.SetAttribute("class", $"sbm-form-control {FormControlName}"); + + + // Populate tag. + output.Content.SetHtmlContent($@" +{FormControlTabs}
+{FormControlTabs}
+{FormControlTabs}
+{FormControlTabs} +{FormControlTabs}
+{FormControlTabs}
+{FormControlTabs}
+{FormControlTabs}
+{FormControlTabs} {ConstructControlTag()} +{FormControlTabs}
+{FormControlTabs}
+{FormControlTabs}
+{FormControlTabs}
+{FormControlTabs}"); + + } + + // --- Control Tag --- + + private string ConstructControlTag() + { + // Control tag. + string controlTabs = $"{FormControlTabs}\t\t\t"; + if (ControlType.EqualsCI("input")) + { + return $@" 0 ? @$"maxlength=""{MaxLength}""" : "")} />"; + } + else if (ControlType.EqualsCI("textarea")) + { + return $@""; + } + else if (ControlType.EqualsCI("select")) + { + string controlTag = @$""; + return controlTag; + } + else throw new ArgumentException($"Unsupported ControlType: {ControlType}"); + } + } +} diff --git a/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategoryMaintain.cshtml b/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategoryMaintain.cshtml index aa66d2b..a2aaffe 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategoryMaintain.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategoryMaintain.cshtml @@ -50,6 +50,7 @@ @Html.DropDownList("Filter.AssetType", Model.GetAssetTypeCodesForFilterDropdown(), null, new { @id = "", @class = "FilterAssetType sbm-select" }) +
@Localiser["label.search"]
diff --git a/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategorySelect.cshtml b/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategorySelect.cshtml index e1ec063..a69ca36 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategorySelect.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategorySelect.cshtml @@ -27,6 +27,7 @@ @Html.DropDownList("Filter.AssetType", Model.GetAssetTypeCodesForFilterDropdown(), Localiser["label.any"], new { @id = "", @class = "FilterAssetType sbm-select" })
+
@* AssetCategory filter - name etc. *@
@Localiser["label.search"]
diff --git a/SaBusinessMgrCoreWebPortal/Views/Home/Index.cshtml b/SaBusinessMgrCoreWebPortal/Views/Home/Index.cshtml index 6b1223e..99b982e 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Home/Index.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Home/Index.cshtml @@ -140,17 +140,17 @@ else @Localiser["label.sales.orders"] @Model.GetSalesOrderCount() - @if (Model.GetInternals().SessionConsole.AllowOption(Sbm.ConfigOption.Assets)) + @if (Model.AllowOption(Sbm.ConfigOption.Assets)) { @Localiser["label.assets"] @Model.GetAssetCount() } - @if (Model.GetInternals().SessionConsole.AllowOption(Sbm.ConfigOption.Vehicles)) + @if (Model.AllowOption(Sbm.ConfigOption.Vehicles)) { - @Localiser["label.vehicles"] + @Localiser["caption.vehicles"] @Model.GetVehicleCount() } diff --git a/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Index.cshtml b/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Index.cshtml index cfa6535..0799197 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Index.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Index.cshtml @@ -6,197 +6,4 @@ Model.AdditionalFiles_JS.Add("js/sbm-veh-cls.js"); } -
- - - -
- - @* Filter form - wrap header to include paging controls. *@ - @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmVehicleClassFilter", @class = "sbm-form", @onSubmit = "return false;" })) - { - -
-
-
- -
-
@Localiser["caption.vehicle.classes"]
-
- @* Burger menu *@ - -
-
-
- - @* Filter Panel *@ -
-
-
@Localiser["label.search"]
-
- @Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" }) -
-
-
- - } - -
- - - - - - - - - - - - -
@Localiser["label.make"]@Localiser["label.model"]@Localiser["label.derivative"]@Localiser["label.status"]
-
- - @* Element templates *@ -
- @* Filter Burger option template - ul is ignored *@ -
    -
  • XXX
  • -
- @* VehicleClass row template - table is ignored. *@ - - - - - - - - -
-
- @* Burger menu *@ - -
-
- @* Item Burger option template - ul is ignored *@ -
    -
  • XXX
  • -
-
- - @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmVehicleClassId", @onSubmit = "return false;" })) - { - @Html.HiddenFor(model => model.VehicleClass.Id, new { @id = "", @class = "VehicleClassId" }) - } -
-
- @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmVehicleClass", @class = "sbm-form", @onSubmit = "return false;" })) - { - @Html.HiddenFor(model => model.VehicleClass.Exists, new { @id = "", @class = "VehicleClassExists" }) - @Html.HiddenFor(model => model.VehicleClass.Id, new { @id = "", @class = "VehicleClassId" }) - - @* Make *@ -
-
-
-
- -
-
-
-
- -
-
-
-
-
- - @* Contact Model *@ -
-
-
-
- -
-
-
-
- @Html.TextBoxFor(model => model.VehicleClass.Model, new { @id = "ifVehicleClassModel", @class = "VehicleClassModel sbm-input upper", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_Model) }) -
-
-
-
-
- - @* Derivative *@ -
-
-
-
- -
-
-
-
- @Html.TextBoxFor(model => model.VehicleClass.DescBrief, new { @id = "ifVehicleClassDerivative", @class = "VehicleClassDerivative sbm-input", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief) }) -
-
-
-
-
- - @* Status *@ -
-
-
-
- -
-
-
-
- -
-
-
-
-
- - @* Notes *@ -
-
-
-
- -
-
-
-
- @Html.TextAreaFor(model => model.VehicleClass.Notes, new { @id = "ifVehicleClassNotes", @class = "VehicleClassNotes sbm-textarea", @rows = 3, @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_Notes) }) -
-
-
-
-
- - } -
-
- -
- -
+ diff --git a/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Panel-VehicleClassDialog.cshtml b/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Panel-VehicleClassDialog.cshtml new file mode 100644 index 0000000..2e7a50e --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Panel-VehicleClassDialog.cshtml @@ -0,0 +1,84 @@ +@* Vehicle Class - Dialog panel *@ +@* View is decoupled from Vehicle Class 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(Html.ViewContext)) return; + Model.AdditionalFiles_JS.Add("js/sbm-veh-cls.js"); + string NamePrefix = Model_VehicleClass.FieldNamePrefix; +} + +@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmVehicleClassId", @onSubmit = "return false;" })) +{ + @Html.Hidden("VehicleClass.Id", "", new { @id = "", @class = $"{Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Id)}" }) +} +
+
+ @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmVehicleClass", @class = "sbm-form", @onSubmit = "return false;" })) + { + @Html.Hidden("VehicleClass.Exists", "", new { @id = "", @class = $"{Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Exists)} sbm-input sbm-auto-val" }) + @Html.Hidden("VehicleClass.Id", "", new { @id = "", @class = $"{Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Id)} sbm-input sbm-auto-val" }) + + @* Vehicle Type *@ + + + + @* Vehicle Category *@ + + + + @* Make *@ + + + + @* Model *@ + + + + @* Derivative *@ + + + + @* Caption *@ + + + + @* Status *@ + + + + @* Notes *@ + + + + } +
+
diff --git a/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Panel-VehicleClassList.cshtml b/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Panel-VehicleClassList.cshtml new file mode 100644 index 0000000..d13d35e --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Panel-VehicleClassList.cshtml @@ -0,0 +1,66 @@ +@* Vehicle Class - List panel *@ +@* View is decoupled from Vehicle Class 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. */ +} + +@* Item list *@ +
+ + + + + + + + + + + + + + + + + +
@Localiser["label.type"]@Localiser["label.category"]@Localiser["label.caption"]@Localiser["label.make"]@Localiser["label.model"]@Localiser["label.derivative"]@Localiser["label.notes"]@Localiser["caption.vehicles"]@Localiser["label.status"]
+
+ +@* Element templates *@ +
+ @* Filter Burger option template - ul is ignored *@ +
    +
  • XXX
  • +
+ @* VehicleClass row template - table is ignored. *@ + + + + + + + + + + + + + +
+
+ @* Burger menu *@ + +
+
+ @* Item Burger option template - ul is ignored *@ +
    +
  • XXX
  • +
+
diff --git a/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Panel-VehicleClassMaintain.cshtml b/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Panel-VehicleClassMaintain.cshtml new file mode 100644 index 0000000..6d04a66 --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Panel-VehicleClassMaintain.cshtml @@ -0,0 +1,69 @@ +@* Vehicle Class - Maintain Panel *@ +@* View is decoupled from Vehicle Class 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(Html.ViewContext)) return; + Model.AdditionalFiles_JS.Add("js/sbm-veh-cls.js"); +} + +
+ + + +
+ + @* Filter form - wrap header to include paging controls. *@ + @using (@Html.BeginForm(FormMethod.Post, new { @class = "frmVehicleClassFilter sbm-form", @onSubmit = "return false;" })) + { + @Html.Hidden("Filter.Mode", Model_VehicleClass.ViewMode.Maintain, new { @id = "" }) + +
+
+
+ +
+
@Localiser["caption.vehicle.classes"]
+
+ @* Burger menu *@ + +
+
+
+ + @* Filter Panel *@ +
+
+
+
@Localiser["label.type"]
+
+ @Html.DropDownList("Filter.VehicleType", Model.GetVehicleTypeCodesForFilterDropdown(), null, new { @id = "", @class = "FilterVehicleType sbm-select" }) +
+
+
+
+
@Localiser["label.search"]
+
+ @Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" }) +
+
+
+
+ + } + + + +
+
+ + diff --git a/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Panel-VehicleClassSelect.cshtml b/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Panel-VehicleClassSelect.cshtml new file mode 100644 index 0000000..ead345e --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Views/Vehicles/VehicleClass/Panel-VehicleClassSelect.cshtml @@ -0,0 +1,44 @@ +@* Vehicle Class - Select panel *@ +@* View is decoupled from Vehicle Class 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(Html.ViewContext)) return; + Model.AdditionalFiles_JS.Add("js/sbm-veh-cls.js"); +} + + + +
+ + @using (@Html.BeginForm(FormMethod.Post, new { @id = "", @class = "frmVehicleClassFilter sbm-form", @onSubmit = "return false;" })) + { + @Html.Hidden("Filter.Mode", Model_VehicleClass.ViewMode.Search, new { @id = "" }) + + @* Filter Panel *@ +
+
+
+ @* VehicleClass type *@ +
@Localiser["label.type"]
+
+ @Html.DropDownList("Filter.VehicleType", Model.GetVehicleTypeCodesForFilterDropdown(), Localiser["label.any"], new { @id = "", @class = "FilterVehicleType sbm-select" }) +
+
+
+
+ @* VehicleClass filter - name etc. *@ +
@Localiser["label.search"]
+
+ @Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" }) +
+
+
+
+ } + + + +
diff --git a/SaBusinessMgrCoreWebPortal/Views/_ViewImports.cshtml b/SaBusinessMgrCoreWebPortal/Views/_ViewImports.cshtml index 816f4e2..b5c2e6a 100644 --- a/SaBusinessMgrCoreWebPortal/Views/_ViewImports.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/_ViewImports.cshtml @@ -15,3 +15,4 @@ @using Sarand.Net.Standard.Base.CodeTypes @using Sarand.Net.Standard.Base.Utils @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Sarand.BusinessMgr.Web diff --git a/SaBusinessMgrCoreWebPortal/wwwroot/css/sbm-cols.css b/SaBusinessMgrCoreWebPortal/wwwroot/css/sbm-cols.css index 2622e7b..b258eb3 100644 --- a/SaBusinessMgrCoreWebPortal/wwwroot/css/sbm-cols.css +++ b/SaBusinessMgrCoreWebPortal/wwwroot/css/sbm-cols.css @@ -63,9 +63,9 @@ --color-Pastel-DarkMintBlue: #b1d3c8; --color-Pastel-MidMintBlue: #ace2d3; --color-Pastel-LightMintBlue: #b1efe0; - --color-Pastel-DarkMintBleu: #6984a3; - --color-Pastel-MidMintBleu: #8aa4c5; - --color-Pastel-LightMintBleu: #abc4e7; + --color-Pastel-DarkMintBlue: #6984a3; + --color-Pastel-MidMintBlue: #8aa4c5; + --color-Pastel-LightMintBlue: #abc4e7; --color-Pastel-DarkPaleBlue: #92dff3; --color-Pastel-MidPaleBlue: #b7e9f6; --color-Pastel-LightPaleBlue: #dbf3fa; @@ -87,7 +87,7 @@ :root { - --color-panel-data: var(--color-Pastel-DarkBlue); + --color-panel-data: var(--color-Pastel-MidMintBlue); } .Contacts .sbm-panel-data @@ -140,7 +140,7 @@ :root { - --color-dialog: var(--color-Pastel-DarkBlue); + --color-dialog: var(--color-Pastel-MidMintBlue); } .ui-dialog.sbm-dark-blue diff --git a/SaBusinessMgrCoreWebPortal/wwwroot/js/sbm-asset-cat.js b/SaBusinessMgrCoreWebPortal/wwwroot/js/sbm-asset-cat.js index d6201ea..9db4e21 100644 --- a/SaBusinessMgrCoreWebPortal/wwwroot/js/sbm-asset-cat.js +++ b/SaBusinessMgrCoreWebPortal/wwwroot/js/sbm-asset-cat.js @@ -11,7 +11,7 @@ //-------------------------------------------------------------- ac.refreshConfig = function (env, delay) { - sbm.doAjaxRequest(env.ajax.refreshConfig = env.ajax.refreshConfig || { url: sbm.url.base + 'Assets/AssetCategory/Ajax/Config', formSel: env.$frm.filter, callbackFn: function (response) { ac.doRefreshConfig(env, response); } }, delay || 50); + sbm.doAjaxRequest(env.ajax.refreshConfig = env.ajax.refreshConfig || { url: `${sbm.url.base}Assets/AssetCategory/Ajax/Config`, formSel: env.$frm.filter, callbackFn: function (response) { ac.doRefreshConfig(env, response); } }, delay || 50); } ac.doRefreshConfig = function (env, response) { @@ -26,9 +26,9 @@ { env.$pnl.bgr.invisible(); env.$pnl.table.find('tbody tr').remove(); - env.$pnl.msgs.hide().empty().append($('
' + sbm.msg.dataQuerying + '
')).fadeIn(200); + env.$pnl.msgs.hide().empty().append($(`
${sbm.msg.dataQuerying}
`)).fadeIn(200); } - sbm.doAjaxRequest(env.ajax.assetCategories = env.ajax.assetCategories || { url: sbm.url.base + 'Assets/AssetCategory/Ajax/GetAssetCategories', formSel: env.$frm.filter, $msgs: env.$pnl.msgs, callbackFn: function (response) { ac.doRefreshResults(env, response); } }, delay || 50); + sbm.doAjaxRequest(env.ajax.assetCategories = env.ajax.assetCategories || { url: `${sbm.url.base}Assets/AssetCategory/Ajax/GetAssetCategories`, formSel: env.$frm.filter, $msgs: env.$pnl.msgs, callbackFn: function (response) { ac.doRefreshResults(env, response); } }, delay || 50); env.data.awaitingRefreshResponse = true; } ac.doRefreshResults = function (env, response) @@ -55,7 +55,7 @@ // Items. var items = response.assetCategories || []; if (!items.length) - return env.$pnl.msgs.append($('
' + sbm.msg.dataNoneFound + '
')).fadeIn(500); + return env.$pnl.msgs.append($(`
${sbm.msg.dataNoneFound}
`)).fadeIn(500); for (const item of items) $table.append(env, ac.populateItem(env, ac.getItemTemplate(env), item)); sbm.configureItemTable(env.data.cfgList, $table); @@ -68,10 +68,10 @@ let cfg = env.data.cfgList; if (cfg) sbm.populateItemValues(cfg, $item, item.field.value); let prefix = cfg.column.prefix; - $('.' + prefix + 'Status', $item).text(item.statusDesc).removeStatusClasses().addClass('sbm-status-' + item.statusCode.toLowerCase()); + $(`.${prefix}Status`, $item).text(item.statusDesc).removeStatusClasses().addClass(`sbm-status-${item.statusCode.toLowerCase()}`); if (!env.mode.search) { - let $assetCount = $('.' + prefix + 'AssetCount', $item).off('click'); + let $assetCount = $(`.${prefix}AssetCount`, $item).off('click'); if ($assetCount.text() > 0) $assetCount.on('click', function () { sbm.navigateTo('Assets/Asset'); }).addClass('sbm-action-text'); // Actions. @@ -81,7 +81,7 @@ if (!item.deleted) { $mnu.append(ac.getItemMenuOption(env, sbm.lbl.edit, fnUpd, 'sbm-edit')); - $('.' + prefix + 'Code', $item).off('click').on('click', fnUpd).addClass('sbm-action-text'); + $(`.${prefix}Code`, $item).off('click').on('click', fnUpd).addClass('sbm-action-text'); $item.off('dblclick').on('dblclick', fnUpd); } $bgr.toggleVisibility(!!$('.sbm-dropdown-item', $mnu).length); @@ -95,7 +95,7 @@ } ac.getItemId = function (item) { - return 'Act_' + (item || {}).id; + return `Ast_${(item || {}).id}`; } //-------------------------------------------------------------- @@ -157,7 +157,7 @@ { let $frm = env.$frm.itemId; $('.AssetCatId', $frm).val(id); - env.ajax.updateItem = env.ajax.updateItem || { url: sbm.url.base + 'Assets/AssetCategory/Ajax/GetItem', formSel: $frm, callbackFn: function (response) { ac.onUpdateItem(env, response); } }; + env.ajax.updateItem = env.ajax.updateItem || { url: `${sbm.url.base}Assets/AssetCategory/Ajax/GetItem`, formSel: $frm, callbackFn: function (response) { ac.onUpdateItem(env, response); } }; sbm.doAjaxRequest(env.ajax.updateItem, 50); } ac.onUpdateItem = function (env, response) @@ -178,7 +178,7 @@ //-------------------------------------------------------------- ac.storeItem = function (env) { - env.ajax.storeItem = env.ajax.storeItem || { url: sbm.url.base + 'Assets/AssetCategory/Ajax/StoreItem', formSel: env.$frm.item, callbackFn: function (response) { ac.onStoreItem(env, response); } }; + env.ajax.storeItem = env.ajax.storeItem || { url: `${sbm.url.base}Assets/AssetCategory/Ajax/StoreItem`, formSel: env.$frm.item, callbackFn: function (response) { ac.onStoreItem(env, response); } }; sbm.doAjaxRequest(env.ajax.storeItem, 50); } ac.onStoreItem = function (env, response) @@ -195,7 +195,7 @@ else if (env.$pnl.table.length) { env.$pnl.msgs.hide().empty(); - var $item = $('#' + ac.getItemId(item), env.$pnl.table); + var $item = $(`#${ac.getItemId(item)}`, env.$pnl.table); if (!$item.length) { $item = ac.getItemTemplate(env); diff --git a/SaBusinessMgrCoreWebPortal/wwwroot/js/sbm-main.js b/SaBusinessMgrCoreWebPortal/wwwroot/js/sbm-main.js index 2e4d675..0538ea6 100644 --- a/SaBusinessMgrCoreWebPortal/wwwroot/js/sbm-main.js +++ b/SaBusinessMgrCoreWebPortal/wwwroot/js/sbm-main.js @@ -107,8 +107,11 @@ sbm.populateSelect = function ($sel, values, code, desc) { $sel = $($sel).empty(); code = code || 'code'; desc = desc || 'desc'; - for (const value of values || []) - $sel.append($('