3.0.2.1 Vehicle Classes

This commit is contained in:
Andy Howard
2025-11-29 17:03:00 +00:00
parent 0c43bbad77
commit 166fa3a352
47 changed files with 1412 additions and 651 deletions
@@ -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
{
@@ -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
{
+3 -2
View File
@@ -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.
@@ -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<TypeCodeDesc> RequirementTypeCodes { get { return GetApplicationCodes(Sbm.ApplicationCode.RequirementType); } }
//-------------------------------------------------------------------
// Code types.
// Application Code types.
private Dictionary<Sbm.ApplCodeType, List<SaCode>> codeTypeCodes { get; } = new Dictionary<Sbm.ApplCodeType, List<SaCode>>();
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<SaCode>(codeTypeCodes.GetValueOrDefault(codeType, new List<SaCode>()).Where(c => !activeOnly || c.IsStatusActive));
return new List<SaCode>(codeTypeCodes.GetValueOrDefault(codeType, new List<SaCode>()).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;
}
//-------------------------------------------------------------------
@@ -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
/// <summary>Properties other than common.</summary>
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;
@@ -36,6 +36,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
//-------------------------------------------------------------------
// Utilities.
public abstract bool AssetDatabaseIsValid();
public abstract bool VehicleDatabaseIsValid();
//-------------------------------------------------------------------
}
@@ -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;
@@ -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);
}
//---------------------------------------------------------------
@@ -109,7 +109,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
{
List<String> filter = new List<String>();
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<String> filter = new List<String>();
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<String> filter = new List<String>();
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<String> filter = new List<String>();
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;
@@ -52,7 +52,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
if (Database.TableExists(tableVehicle))
{
List<String> filter = new List<String>();
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));
@@ -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");
@@ -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;
}
@@ -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<String, String> GetSmlSchemas(Sbm.Database databaseInstance)
{
Dictionary<String, String> schemas = new Dictionary<String, String>();
@@ -549,4 +549,25 @@
<data name="msg.item.created" xml:space="preserve">
<value>Item created.</value>
</data>
<data name="security.msg.signin.invalid" xml:space="preserve">
<value>Incorrect account credentials entered.</value>
</data>
<data name="security.msg.warn.sessionExpired" xml:space="preserve">
<value>Your session has expired.</value>
</data>
<data name="security.msg.request.password.saved" xml:space="preserve">
<value>Password has been updated.</value>
</data>
<data name="security.msg.request.password.email.sent" xml:space="preserve">
<value>If your email address matches an active user account, you will shortly receive an email with instructions for changing your password.</value>
</data>
<data name="security.msg.change.password.failed" xml:space="preserve">
<value>Failed to change password.</value>
</data>
<data name="security.change.password.not.changed" xml:space="preserve">
<value>Your new password must be different from the previous.</value>
</data>
<data name="security.change.password.current.invalid" xml:space="preserve">
<value>Current password does not match.</value>
</data>
</root>
@@ -468,12 +468,6 @@
<data name="label.derivative" xml:space="preserve">
<value>Derivative</value>
</data>
<data name="label.vehicle" xml:space="preserve">
<value>Vehicle</value>
</data>
<data name="label.vehicles" xml:space="preserve">
<value>Vehicles</value>
</data>
<data name="caption.code.types" xml:space="preserve">
<value>Code Types</value>
</data>
@@ -948,4 +942,19 @@
<data name="caption.commodity.select" xml:space="preserve">
<value>Select Commodity</value>
</data>
<data name="caption.vehicle" xml:space="preserve">
<value>Vehicle</value>
</data>
<data name="caption.vehicle.create" xml:space="preserve">
<value>Create Vehicle</value>
</data>
<data name="caption.vehicle.update" xml:space="preserve">
<value>Update Vehicle</value>
</data>
<data name="caption.vehicles" xml:space="preserve">
<value>Vehicles</value>
</data>
<data name="msg.vehicle.class.caption.unique" xml:space="preserve">
<value>Active vehicle class caption must be unique.</value>
</data>
</root>
@@ -130,6 +130,21 @@ namespace Sarand.BusinessMgr.Web.Portal.Components
// System codes.
protected List<TypeCodeDesc> 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<TypeCodeDesc> commodityTypes = new List<TypeCodeDesc>();
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 ---
/// <summary>
/// List of Asset Types for filter dropdown.
/// </summary>
@@ -355,6 +372,35 @@ namespace Sarand.BusinessMgr.Web.Portal.Components
return new SelectList(assetTypes, "Code", "Desc");
}
// --- Vehicle Type ---
/// <summary>
/// List of Vehicle Types for filter dropdown.
/// </summary>
public IEnumerable<SelectListItem> GetVehicleTypeCodesForFilterDropdown()
{
List<TypeCodeDesc> vehicleTypes = new List<TypeCodeDesc>();
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");
}
/// <summary>
/// List of Vehicle Types for form dropdown.
/// </summary>
public IEnumerable<SelectListItem> GetVehicleTypeCodesForDropdown()
{
List<TypeCodeDesc> vehicleTypes = new List<TypeCodeDesc>();
foreach (TypeCodeDesc vehicleType in GetSystemCodes(Sbm.ApplicationCode.VehicleType))
{
vehicleTypes.Add(vehicleType);
}
return new SelectList(vehicleTypes, "Code", "Desc");
}
//-------------------------------------------------------------------
// View reference data - Transactions.
@@ -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")]
@@ -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<AssetCategoryController> logger) :
base(localiser, logger)
{
}
//-------------------------------------------------------------------
// Construction.
public AssetCategoryController(SbmLocaliser localiser, ILogger<AssetCategoryController> 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);
}
//-------------------------------------------------------------------
}
//======================================================================
//======================================================================
}
@@ -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);
}
@@ -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<ItemCodeDesc> VehicleTypes { get; } = new List<ItemCodeDesc>();
public List<ItemCodeDesc> Categories { get; } = new List<ItemCodeDesc>();
public List<ItemCodeDesc> Makes { get; } = new List<ItemCodeDesc>();
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
public List<ItemCodeDesc> StatusesCreate { get; } = new List<ItemCodeDesc>();
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<VehicleClassListData> VehicleClasses { get; } = new List<VehicleClassListData>();
// Reference data.
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
public List<ItemCodeDesc> StatusesCreate { get; } = new List<ItemCodeDesc>();
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<ColumnDfn> columns = new List<ColumnDfn>()
{
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;
}
@@ -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<VehicleClassController> logger) :
base(localiser, logger)
{
}
//-------------------------------------------------------------------
// Construction.
public VehicleClassController(SbmLocaliser localiser, ILogger<VehicleClassController> 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);
}
//-------------------------------------------------------------------
}
//======================================================================
//======================================================================
}
@@ -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))
{
@@ -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.
@@ -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
@@ -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()))
@@ -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}");
//---------------------------------------------------------------
@@ -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;
}
}
@@ -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}");
@@ -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.
@@ -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"]);
@@ -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.
@@ -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
{
//-------------------------------------------------------------------
/// <summary>Prefix for field names.</summary>
public const String FieldNamePrefix = "VehicleClass";
/// <summary>Item fields.</summary>
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,
}
/// <summary>
/// Identifier used by form fields to show control specific messages generated by model validation etc.
/// <para>- Both page and model should use this method to consistently generate the field name.</para>
/// </summary>
public static String GetFieldName(ItemField field)
{
return $"{FieldNamePrefix}{field}";
}
// List configuration.
public class ListConfigData
{
// Actions.
public class ActionData
{
public class AllowData
{
public bool? Create { get; set; }
public bool? Update { get; set; }
}
public AllowData Allow { get; } = new AllowData();
}
public ActionData Action { get; } = new ActionData();
// List columns.
public class ColumnData
{
// Column name prefix.
public String Prefix { get; } = Model_VehicleClass.FieldNamePrefix;
// Hide column.
public HashSet<string> Hide { get; } = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
// Column labels.
public Dictionary<String, String> Label { get; } = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
}
public ColumnData Column { get; } = new ColumnData();
}
public ListConfigData ListConfig { get; private set; }
//-------------------------------------------------------------------
/// <summary>
/// Populate VehicleClass list configuration data - only required on initial page construction.
/// </summary>
public void PopulateListConfig()
{
ListConfig = new ListConfigData();
PopulateListConfig(ListConfig);
}
public void PopulateListConfig(ListConfigData config)
{
ViewMode pageMode = GetFilterMode();
bool modeIsSearch = pageMode == ViewMode.Search;
bool modeIsMaintain = pageMode == ViewMode.Maintain;
bool 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<string> Hide { get; } = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
// Read-only field.
public HashSet<string> Readonly { get; } = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
// Field labels.
public Dictionary<String, String> Label { get; } = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
}
public FieldData Field { get; } = new FieldData();
}
/// <summary>
/// Populate item configuration for existing vehicle.
/// </summary>
public void PopulateItemConfig(ItemConfigData config, SbmVehicleClass vehicleClass)
{
PopulateItemConfig(config, vehicleClass.GetItemId(), vehicleClass.VehicleType);
}
/// <summary>
/// Populate item configuration for new or existing vehicle.
/// </summary>
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.
//---------------------------------------------------------------
}
//-------------------------------------------------------------------
}
//=======================================================================
@@ -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<ISacsDisposable> disposables = new DisposableCollection<ISacsDisposable>())
{
// 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()))
@@ -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.
/// <summary>Control label text.</summary>
public string Label { get; set; }
/// <summary>Whether control value is mandatory - to show '*' indicator.</summary>
public bool Required { get; set; }
/// <summary>Label column size (1-12). Default: 3.</summary>
public int LabelColumn { get; set; } = 3;
/// <summary>Model binding control name.</summary>
public string BindingName { get; set; }
/// <summary>Value to include before control name.</summary>
public string NamePrefix { get; set; }
/// <summary>Defaults to ControlNameSuffix if not specified. At least one of these values must be supplied.</summary>
public string FormControlNameSuffix { get; set; }
/// <summary>Defaults to FormControlNameSuffix if not specified. At least one of these values must be supplied.</summary>
public string ControlNameSuffix { get; set; }
/// <summary>'input', 'textarea', 'select'.</summary>
public string ControlType { get; set; } = "input";
/// <summary>'text', 'search', 'email' etc.</summary>
public string InputType { get; set; } = "text";
/// <summary>Max length for input/textarea controls. Not set if &lt; 1.</summary>
public int MaxLength { get; set; }
/// <summary>List of options to populate for Select.</summary>
public IEnumerable<SelectItem> SelectItems { get; set; }
/// <summary>To exclude 'sbm-auto-val' class</summary>
public bool NoAutoValue { get; set; }
/// <summary>Number of tabs that form control is indented by.</summary>
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} <div class=""row"">
{FormControlTabs} <div class=""col-sm-{LabelColumn}"">
{FormControlTabs} <div class=""sbm-label"">
{FormControlTabs} <label for=""{ControlId}""><span>{Label}</span>{(Required ? $@"<span class=""required"">&nbsp;*</span>" : "")}</label>
{FormControlTabs} </div>
{FormControlTabs} </div>
{FormControlTabs} <div class=""col-sm"">
{FormControlTabs} <div class=""sbm-control"">
{FormControlTabs} {ConstructControlTag()}
{FormControlTabs} </div>
{FormControlTabs} <div class=""sbm-message""></div>
{FormControlTabs} </div>
{FormControlTabs} </div>
{FormControlTabs}");
}
// --- Control Tag ---
private string ConstructControlTag()
{
// Control tag.
string controlTabs = $"{FormControlTabs}\t\t\t";
if (ControlType.EqualsCI("input"))
{
return $@"<input type=""{InputType}"" id=""{ControlId}"" name=""{BindingName}"" class=""{ControlName} sbm-input {(NoAutoValue ? "" : "sbm-auto-val")}"" {(MaxLength > 0 ? @$"maxlength=""{MaxLength}""" : "")} />";
}
else if (ControlType.EqualsCI("textarea"))
{
return $@"<textarea id=""{ControlId}"" name=""{BindingName}"" class=""{ControlName} sbm-textarea {(NoAutoValue ? "" : "sbm-auto-val")}"" {(MaxLength > 0 ? @$"maxlength=""{MaxLength}""" : "")}></textarea>";
}
else if (ControlType.EqualsCI("select"))
{
string controlTag = @$"<select id=""{ControlId}"" name=""{BindingName}"" class=""{ControlName} sbm-select {(NoAutoValue ? "" : "sbm-auto-val")}"">";
if ((SelectItems ?? new List<SelectItem>()).Any())
controlTag += $"\n{controlTabs}\t{string.Join($"\n{controlTabs}\t", SelectItems.Select(item => $@"<option value=""{item.Code}"">{item.Desc}</option>"))}\n{controlTabs}";
controlTag += "</select>";
return controlTag;
}
else throw new ArgumentException($"Unsupported ControlType: {ControlType}");
}
}
}
@@ -50,6 +50,7 @@
@Html.DropDownList("Filter.AssetType", Model.GetAssetTypeCodesForFilterDropdown(), null, new { @id = "", @class = "FilterAssetType sbm-select" })
</div>
</div>
<div class="col-sm-4"></div>
<div class="col-sm-4 row pb4">
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
<div class="col-sm-7">
@@ -27,6 +27,7 @@
@Html.DropDownList("Filter.AssetType", Model.GetAssetTypeCodesForFilterDropdown(), Localiser["label.any"], new { @id = "", @class = "FilterAssetType sbm-select" })
</div>
</div>
<div class="col-sm-4"></div>
<div class="col-sm-4 row pb4">
@* AssetCategory filter - name etc. *@
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
@@ -140,17 +140,17 @@ else
<td class="">@Localiser["label.sales.orders"]</td>
<td class="center">@Model.GetSalesOrderCount()</td>
</tr>
@if (Model.GetInternals().SessionConsole.AllowOption(Sbm.ConfigOption.Assets))
@if (Model.AllowOption(Sbm.ConfigOption.Assets))
{
<tr class="sbm-action-text" onclick="sbm.goToPage('Assets/Asset')">
<td class="">@Localiser["label.assets"]</td>
<td class="center">@Model.GetAssetCount()</td>
</tr>
}
@if (Model.GetInternals().SessionConsole.AllowOption(Sbm.ConfigOption.Vehicles))
@if (Model.AllowOption(Sbm.ConfigOption.Vehicles))
{
<tr class="sbm-action-text" onclick="sbm.goToPage('Vehicles/Vehicle')">
<td class="">@Localiser["label.vehicles"]</td>
<td class="">@Localiser["caption.vehicles"]</td>
<td class="center">@Model.GetVehicleCount()</td>
</tr>
}
@@ -6,197 +6,4 @@
Model.AdditionalFiles_JS.Add("js/sbm-veh-cls.js");
}
<div class="sbm-panel VehicleClasses fullheight">
<script type="text/javascript">
sbm.dlg.title.createItem = '@(Localiser.GetJavascriptText("caption.vehicle.class.create"))';
sbm.dlg.title.updateItem = '@(Localiser.GetJavascriptText("caption.vehicle.class.update"))';
</script>
<div class="sbm-panel-data sbm-flex">
@* Filter form - wrap header to include paging controls. *@
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmVehicleClassFilter", @class = "sbm-form", @onSubmit = "return false;" }))
{
<div class="sbm-panel-header">
<div class="row">
<div class="fixed">
<partial name="~/Views/Common/ResultsPaging.cshtml" />
</div>
<div class="col center"><div class="sbm-panel-caption">@Localiser["caption.vehicle.classes"]</div></div>
<div class="fixed">
@* Burger menu *@
<ul class="nav navbar-nav navbar-dark navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="navbar-toggler-icon"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</div>
</div>
@* Filter Panel *@
<div class="sbm-panel-filter">
<div class="row pb4">
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
<div class="col-sm-7">
@Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
</div>
</div>
</div>
}
<div class="sbm-panel-item-table sbm-flex">
<table class="sbm-item-list">
<thead>
<tr>
<th class="pl-2">@Localiser["label.make"]</th>
<th class="">@Localiser["label.model"]</th>
<th class="">@Localiser["label.derivative"]</th>
<th class="center">@Localiser["label.status"]</th>
<th class="right" style="width:2%;"></th>
</tr>
<tr><td colspan="6"><div class="sbm-panel-messages"></div></td></tr>
</thead>
<tbody></tbody>
</table>
</div>
@* Element templates *@
<div class="sbm-panel-item-template">
@* Filter Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu VehicleClassFilter">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
@* VehicleClass row template - table is ignored. *@
<table class="">
<tr class="sbm-row-item VehicleClass">
<td><div class="VehicleClassMake pl-1"></div></td>
<td><div class="VehicleClassModel"></div></td>
<td><div class="VehicleClassDerivative"></div></td>
<td><div class="VehicleClassStatusDesc center"></div></td>
<td>
<div class="right">
@* Burger menu *@
<ul class="nav navbar-nav navbar-light navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</td>
</tr>
</table>
@* Item Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu VehicleClass">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
</div>
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmVehicleClassId", @onSubmit = "return false;" }))
{
@Html.HiddenFor(model => model.VehicleClass.Id, new { @id = "", @class = "VehicleClassId" })
}
<div id="dlgVehicleClass" class="sbm-dialog">
<div class="spacer2"></div>
@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 *@
<div class="sbm-form-control VehicleClassMake">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="cbVehicleClassMake"><span>@Localiser["label.make"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
<select id="cbVehicleClassMake" name="VehicleClass.MakeCode" class="VehicleClassMake sbm-select"></select>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Contact Model *@
<div class="sbm-form-control VehicleClassModel">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifVehicleClassModel"><span>@Localiser["label.model"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
@Html.TextBoxFor(model => model.VehicleClass.Model, new { @id = "ifVehicleClassModel", @class = "VehicleClassModel sbm-input upper", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_Model) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Derivative *@
<div class="sbm-form-control VehicleClassDerivative">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifVehicleClassDerivative"><span>@Localiser["label.description"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
@Html.TextBoxFor(model => model.VehicleClass.DescBrief, new { @id = "ifVehicleClassDerivative", @class = "VehicleClassDerivative sbm-input", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Status *@
<div class="sbm-form-control VehicleClassStatus">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="cbVehicleClassStatus"><span>@Localiser["label.status"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
<select id="cbVehicleClassStatus" class="sbm-select VehicleClassStatus" name="VehicleClass.StatusCode"></select>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Notes *@
<div class="sbm-form-control VehicleClassNotes">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifVehicleClassNotes"><span>@Localiser["label.notes"]</span></label>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
@Html.TextAreaFor(model => model.VehicleClass.Notes, new { @id = "ifVehicleClassNotes", @class = "VehicleClassNotes sbm-textarea", @rows = 3, @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_Notes) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
}
<div class="spacer2"></div>
</div>
</div>
</div>
<partial name="Panel-VehicleClassMaintain.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)}" })
}
<div id="dlgVehicleClass" class="sbm-dialog">
<div class="spacer2"></div>
@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 *@
<sbm-form-control
label="@Localiser["label.type"]"
name-prefix="@NamePrefix" form-control-name-suffix="VehicleType" control-name-suffix="VehicleTypeCode"
control-type="select" binding-name="VehicleClass.VehicleTypeCode">
</sbm-form-control>
@* Vehicle Category *@
<sbm-form-control
label="@Localiser["label.category"]"
name-prefix="@NamePrefix" form-control-name-suffix="VehicleCategory" control-name-suffix="VehicleCategoryCode"
control-type="select" binding-name="VehicleClass.VehicleCategoryCode">
</sbm-form-control>
@* Make *@
<sbm-form-control
label="@Localiser["label.make"]" required="true"
name-prefix="@NamePrefix" form-control-name-suffix="Make" control-name-suffix="MakeCode"
control-type="select" binding-name="VehicleClass.MakeCode">
</sbm-form-control>
@* Model *@
<sbm-form-control
label="@Localiser["label.model"]" required="true"
name-prefix="@NamePrefix" control-name-suffix="Model"
control-type="input" binding-name="VehicleClass.Model" max-length="@Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_Model)">
</sbm-form-control>
@* Derivative *@
<sbm-form-control
label="@Localiser["label.derivative"]"
name-prefix="@NamePrefix" control-name-suffix="Derivative"
control-type="input" binding-name="VehicleClass.Derivative"
input-type="text" max-length="@Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_Derivative)">
</sbm-form-control>
@* Caption *@
<sbm-form-control
label="@Localiser["label.caption"]"
name-prefix="@NamePrefix" control-name-suffix="Caption"
control-type="input" binding-name="VehicleClass.Caption"
input-type="text" max-length="@Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief)">
</sbm-form-control>
@* Status *@
<sbm-form-control
label="@Localiser["label.status"]" required="true"
name-prefix="@NamePrefix" form-control-name-suffix="Status" control-name-suffix="StatusCode"
control-type="select" binding-name="VehicleClass.StatusCode">
</sbm-form-control>
@* Notes *@
<sbm-form-control
label="@Localiser["label.notes"]"
name-prefix="@NamePrefix" control-name-suffix="Notes"
control-type="input" binding-name="VehicleClass.Notes"
input-type="textarea" max-length="@Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicleClass_Notes)">
</sbm-form-control>
}
<div class="spacer2"></div>
</div>
@@ -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 *@
<div class="sbm-panel-item-table sbm-flex">
<table class="sbm-item-list" style="table-layout:fixed;">
<thead>
<tr>
<th class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.VehicleType) width05pc pl-1">@Localiser["label.type"]</th>
<th class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.VehicleCategory) width05pc">@Localiser["label.category"]</th>
<th class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Caption) width25pc" style="max-width:20%">@Localiser["label.caption"]</th>
<th class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Make) ">@Localiser["label.make"]</th>
<th class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Model) width10pc">@Localiser["label.model"]</th>
<th class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Notes) d-none d-lg-table-cell" style="max-width:20%">@Localiser["label.derivative"]</th>
<th class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Notes) d-none d-xl-table-cell" style="max-width:20%">@Localiser["label.notes"]</th>
<th class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.VehicleCount) width10pc center">@Localiser["caption.vehicles"]</th>
<th class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Status) width5pc center">@Localiser["label.status"]</th>
<th class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Actions) width5pc"></th>
</tr>
<tr><td colspan="6"><div class="sbm-panel-messages"></div></td></tr>
</thead>
<tbody></tbody>
</table>
</div>
@* Element templates *@
<div class="sbm-panel-item-template">
@* Filter Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu VehicleClassFilter">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
@* VehicleClass row template - table is ignored. *@
<table class="">
<tr class="sbm-row-item VehicleClass">
<td class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.VehicleType) pl-1"></td>
<td class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.VehicleCategory)"></td>
<td class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Caption)"></td>
<td class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Make)"></td>
<td class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Model)"></td>
<td class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Derivative) d-none d-lg-table-cell nowrap overflow-hidden text-truncate"></td>
<td class="d-none d-xl-table-cell"><div class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Notes) nowrap overflow-hidden text-truncate"></div></td>
<td class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.VehicleCount) center"></td>
<td class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Status) center"></td>
<td class="@Model_VehicleClass.GetFieldName(Model_VehicleClass.ItemField.Actions)">
<div class="right">
@* Burger menu *@
<ul class="nav navbar-nav navbar-light navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</td>
</tr>
</table>
@* Item Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu VehicleClass">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
</div>
@@ -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");
}
<div class="sbm-panel VehicleClasses fullheight">
<script type="text/javascript">
sbm.dlg.title.createItem = '@(Localiser.GetJavascriptText("caption.vehicle.class.create"))';
sbm.dlg.title.updateItem = '@(Localiser.GetJavascriptText("caption.vehicle.class.update"))';
</script>
<div class="sbm-panel-data sbm-flex">
@* 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 = "" })
<div class="sbm-panel-header">
<div class="row">
<div class="fixed">
<partial name="~/Views/Common/ResultsPaging.cshtml" />
</div>
<div class="col center"><div class="sbm-panel-caption">@Localiser["caption.vehicle.classes"]</div></div>
<div class="fixed">
@* Burger menu *@
<ul class="nav navbar-nav navbar-dark navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="navbar-toggler-icon"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</div>
</div>
@* Filter Panel *@
<div class="sbm-panel-filter">
<div class="row">
<div class="col-sm-4 row pb4">
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.type"]</div>
<div class="col-sm-7">
@Html.DropDownList("Filter.VehicleType", Model.GetVehicleTypeCodesForFilterDropdown(), null, new { @id = "", @class = "FilterVehicleType sbm-select" })
</div>
</div>
<div class="col-sm-4"></div>
<div class="col-sm-4 row pb4">
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
<div class="col-sm-7">
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
</div>
</div>
</div>
</div>
}
<partial name="Panel-VehicleClassList.cshtml" />
</div>
</div>
<partial name="Panel-VehicleClassDialog.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");
}
<script type="text/javascript">
</script>
<div id="dlgVehicleClassSelect" class="sbm-dialog sbm-flex sbm-no-padding" title="@Localiser["caption.contact.select"]">
@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 *@
<div class="sbm-panel-filter">
<div class="row">
<div class="col-sm-4 row pb4">
@* VehicleClass type *@
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.type"]</div>
<div class="col-8 col-sm-8">
@Html.DropDownList("Filter.VehicleType", Model.GetVehicleTypeCodesForFilterDropdown(), Localiser["label.any"], new { @id = "", @class = "FilterVehicleType sbm-select" })
</div>
</div>
<div class="col-sm-4"></div>
<div class="col-sm-4 row pb4">
@* VehicleClass filter - name etc. *@
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
<div class="col-8 col-sm-8">
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
</div>
</div>
</div>
</div>
}
<partial name="Panel-VehicleClassList.cshtml" />
</div>
@@ -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
@@ -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
@@ -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($('<div class="sbm-message">' + sbm.msg.dataQuerying + '</div>')).fadeIn(200);
env.$pnl.msgs.hide().empty().append($(`<div class="sbm-message">${sbm.msg.dataQuerying}</div>`)).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($('<div class="sbm-message">' + sbm.msg.dataNoneFound + '</div>')).fadeIn(500);
return env.$pnl.msgs.append($(`<div class="sbm-message">${sbm.msg.dataNoneFound}</div>`)).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);
@@ -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($('<option>').prop('value', value[code]).text(value[desc]));
(values || []).forEach(val => $sel.append($('<option>').prop('value', val[code]).text(val[desc])));
}
sbm.populateSelectCodeDesc = function ($sel, values)
{
sbm.populateSelect($($sel), values);
}
sbm.refreshSelectCaption = function ($sel, values, code, desc)
{
@@ -116,10 +119,6 @@
for (const value of values || [])
$sel.find($('option[value="' + value[code] + '"]').text(value[desc]));
}
sbm.populateSelectCodeDesc = function ($sel, values)
{
sbm.populateSelect($($sel), values);
}
sbm.checkTextAreaMaxLength = function (ctrl, len)
{
if (ctrl == null || ctrl.value == null) return;
@@ -6,97 +6,121 @@
(function (win, doc, undef)
{
"use strict";
let vc = sbm.vehicleClass = { data: {}, ajax: {} };
let $pnl = vc.$pnl = {}, $frm = vc.$frm = {}, $dlg = vc.$dlg = {};
let vc = sbm.vehicleClass = { env: {} };
//--------------------------------------------------------------
vc.refreshResults = function (delay)
vc.refreshConfig = function (env, delay)
{
if (!vc.awaitingRefreshResponse)
{
$('.sbm-burger', $pnl.header).invisible();
$pnl.table.find('tbody tr').remove();
$pnl.msgs.hide().empty().append($('<div class="sbm-message">' + sbm.msg.dataQuerying + '</div>')).fadeIn(200);
}
vc.ajax.vehicleClasses = vc.ajax.vehicleClasses || { url: sbm.url.base + 'Assets/VehicleClass/Ajax/GetVehicleClasses', formId: $frm.filter.prop('id'), $msgs: env.$pnl.msgs, callbackFn: vc.handleVehicleClasses };
sbm.doAjaxRequest(vc.ajax.vehicleClasses, delay || 50);
vc.awaitingRefreshResponse = true;
sbm.doAjaxRequest(env.ajax.refreshConfig = env.ajax.refreshConfig || { url: `${sbm.url.base}Vehicles/VehicleClass/Ajax/Config`, formSel: env.$frm.filter, callbackFn: function (response) { vc.doRefreshConfig(env, response); } }, delay || 50);
}
vc.handleVehicleClasses = function (response)
vc.doRefreshConfig = function (env, response)
{
//sbm.debug('handleVehicleClasses', response);
delete vc.awaitingRefreshResponse;
let $table = $('table', $pnl.table).find('tbody tr').remove().end();
$pnl.msgs.hide().empty();
sbm.refreshPaging(response, '#frmVehicleClassFilter', vc.refreshResults);
//console.log('doRefreshConfig', response);
if (!response.success) return;
Object.assign(env.data, response.data);
}
// Reference data - Statuses.
if (response.statuses) sbm.data.statuses = response.statuses;
if (response.statusesCreate) sbm.data.statusesCreate = response.statusesCreate;
if (response.statusCodeDefault) sbm.data.statusCodeDefault = response.statusCodeDefault;
//--------------------------------------------------------------
vc.refreshResults = function (env, delay)
{
if (!env.data.awaitingRefreshResponse)
{
env.$pnl.bgr.invisible();
env.$pnl.table.find('tbody tr').remove();
env.$pnl.msgs.hide().empty().append($(`<div class="sbm-message">${sbm.msg.dataQuerying}</div>`)).fadeIn(200);
}
sbm.doAjaxRequest(env.ajax.vehicleClasses = env.ajax.vehicleClasses || { url: `${sbm.url.base}Vehicles/VehicleClass/Ajax/GetVehicleClasses`, formSel: env.$frm.filter, $msgs: env.$pnl.msgs, callbackFn: function (response) { vc.doRefreshResults(env, response); } }, delay || 50);
env.data.awaitingRefreshResponse = true;
}
vc.doRefreshResults = function (env, response)
{
//sbm.debug('doRefreshResults', response);
delete env.data.awaitingRefreshResponse;
let $table = $('table', env.$pnl.table).find('tbody tr').remove().end();
env.$pnl.msgs.hide().empty();
sbm.refreshPaging(response, '#frmVehicleClassFilter', function () { vc.refreshResults(env); });
if (!response.success) return;
vc.doRefreshConfig(env, response);
env.mode = response.mode;
// Menu.
var $bgr = $('.sbm-burger', $pnl.header).invisible();
var $mnu = $('ul.sbm-dropdown-menu', $bgr).empty();
$mnu.append(vc.getFilterMenuOption(sbm.lbl.refresh, function () { vc.refreshResults(); }, 'sbm-refresh'));
$mnu.append(vc.getFilterMenuOption(sbm.lbl.create, function () { vc.createItem(); }, 'sbm-add'));
$bgr.toggleVisibility(!!$('.sbm-dropdown-item', $mnu).length);
if (env.$pnl.bgr.length)
{
env.$pnl.bgr.invisible();
env.$pnl.mnu.empty();
env.$pnl.mnu.append(vc.getFilterMenuOption(env, sbm.lbl.refresh, function () { vc.refreshResults(env); }, 'sbm-refresh'));
env.$pnl.mnu.append(vc.getFilterMenuOption(env, sbm.lbl.create, function () { vc.createItem(env, env.data.cfgItemNew); }, 'sbm-add'));
env.$pnl.bgr.toggleVisibility(!!$('.sbm-dropdown-item', env.$pnl.mnu).length);
}
// Items.
var items = response.vehicleClasses || [];
if (!items.length)
return $pnl.msgs.append($('<div class="sbm-message">' + sbm.msg.dataNoneFound + '</div>')).fadeIn(500);
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
$table.append(vc.populateItem(vc.getItemRowTemplate(), items[itemIdx]));
return env.$pnl.msgs.append($(`<div class="sbm-message">${sbm.msg.dataNoneFound}</div>`)).fadeIn(500);
for (const item of items)
$table.append(env, vc.populateItem(env, vc.getItemRowTemplate(env), item));
sbm.configureItemTable(env.data.cfgList, $table);
}
vc.populateItem = function ($item, item)
vc.populateItem = function (env, $item, item)
{
//sbm.debug('populateItem', env, $item, item)
if (!item) return $item;
$pnl.msgs.hide().empty();
$item.prop('id', vc.getItemId(item));
$('.VehicleClassMake', $item).text(item.makeDesc);
$('.VehicleClassModel', $item).text(item.model);
$('.VehicleClassDerivative', $item).text(item.derivative);
$('.VehicleClassDescription', $item).text(item.descBrief);
$('.VehicleClassStatusDesc', $item).text(item.statusDesc).removeStatusClasses().addClass('sbm-status-' + item.statusCode.toLowerCase());
// Actions.
let fnUpd = function () { vc.updateItem($item, item) };
var $bgr = $('.sbm-burger', $item).invisible();
let $mnu = $('ul.sbm-dropdown-menu', $bgr).empty();
if (!item.deleted)
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()}`);
if (!env.mode.search)
{
$mnu.append(vc.getItemMenuOption(sbm.lbl.edit, fnUpd, 'sbm-edit'));
$('.VehicleClassMake,.VehicleClassModel', $item).off('click').on('click', fnUpd).addClass('sbm-action-text');
$item.off('dblclick').on('dblclick', fnUpd);
let $vehicleCount = $(`.${prefix}VehicleCount`, $item).off('click');
if ($vehicleCount.text() > 0)
$vehicleCount.on('click', function () { sbm.navigateTo('Vehicles/Vehicle'); }).addClass('sbm-action-text');
// Actions.
let fnUpd = function () { vc.updateItem(env, item.id) };
var $bgr = $('.sbm-burger', $item).invisible();
let $mnu = $('ul.sbm-dropdown-menu', $bgr).empty();
if (!item.deleted)
{
$mnu.append(vc.getItemMenuOption(env, sbm.lbl.edit, fnUpd, 'sbm-edit'));
$(`.${prefix}Model`, $item).off('click').on('click', fnUpd).addClass('sbm-action-text');
$item.off('dblclick').on('dblclick', fnUpd);
}
$bgr.toggleVisibility(!!$('.sbm-dropdown-item', $mnu).length);
}
else
{
$item.off('click').on('click', function () { vc.selectItemRow(env, $item, item); });
$item.off('dblclick').on('dblclick', function () { vc.selectItem(env); });
}
$bgr.toggleVisibility(!!$('.sbm-dropdown-item', $mnu).length);
return $item;
}
vc.getItemId = function (item)
{
return 'Itm_' + (item || {}).id;
return `Itm_${(item || {}).id}`;
}
//--------------------------------------------------------------
vc.getFilterDropdownTemplate = function ()
vc.getFilterDropdownTemplate = function (env)
{
return $('.sbm-dropdown-menu.VehicleClassFilter li.sbm-dropdown-item', $pnl.tmpls).clone();
return $('.sbm-dropdown-menu.VehicleClassFilter li.sbm-dropdown-item', env.$pnl.tmpls).clone();
}
vc.getItemRowTemplate = function ()
vc.getItemRowTemplate = function (env)
{
return $('table tr.sbm-row-item.VehicleClass', $pnl.tmpls).clone();
return $('table tr.sbm-row-item.VehicleClass', env.$pnl.tmpls).clone();
}
vc.getItemDropdownTemplate = function ()
vc.getItemDropdownTemplate = function (env)
{
return $('.sbm-dropdown-menu.VehicleClass li.sbm-dropdown-item', $pnl.tmpls).clone();
return $('.sbm-dropdown-menu.VehicleClass li.sbm-dropdown-item', env.$pnl.tmpls).clone();
}
vc.getFilterMenuOption = function (lbl, fn, cls)
//--------------------------------------------------------------
vc.getFilterMenuOption = function (env, lbl, fn, cls)
{
return vc.getMenuOption(vc.getFilterDropdownTemplate(), lbl, fn, cls);
return vc.getMenuOption(vc.getFilterDropdownTemplate(env), lbl, fn, cls);
}
vc.getItemMenuOption = function (lbl, fn, cls)
vc.getItemMenuOption = function (env, lbl, fn, cls)
{
return vc.getMenuOption(vc.getItemDropdownTemplate(), lbl, fn, cls);
return vc.getMenuOption(vc.getItemDropdownTemplate(env), lbl, fn, cls);
}
vc.getMenuOption = function ($opt, lbl, fn, cls)
{
@@ -104,98 +128,171 @@
}
//--------------------------------------------------------------
vc.createItem = function ()
vc.createItem = function (env, cfg)
{
vc.clearItem();
sbm.populateSelectCodeDesc('#cbVehicleClassStatus', sbm.data.statusesCreate);
$('#cbVehicleClassStatus').val(sbm.data.statusCodeDefault).prop('readonly', false);
$dlg.item.dialog('option', 'title', sbm.dlg.title.createItem);
vc.openVehicleClassDlg();
vc.clearItem(env, cfg);
sbm.populateSelectCodeDesc('#cbVehicleClassStatus', env.data.statusesCreate);
$('#cbVehicleClassStatus').val(env.data.statusCodeDefault).prop('readonly', false);
vc.openItemDlg(env, cfg, sbm.dlg.title.createItem);
}
vc.openVehicleClassDlg = function ()
vc.clearItem = function (env, cfg)
{
sbm.openDialog($dlg.item, 600, 600);
sbm.clearItemForm(env.$frm.item);
sbm.populateSelectCodeDesc('#cbVehicleClassVehicleType', env.data.vehicleTypes);
sbm.populateSelectCodeDesc('#cbVehicleClassVehicleCategory', env.data.categories);
sbm.populateSelectCodeDesc('#cbVehicleClassMake', env.data.makes);
sbm.populateSelectCodeDesc('#cbVehicleClassStatus', env.data.statuses);
}
vc.clearItem = function ()
vc.openItemDlg = function (env, cfg, title)
{
let frm = $frm.item;
$('.VehicleClassExists,.VehicleClassId,input[type="text"],textarea,select', frm).val('');
sbm.populateSelectCodeDesc('#cbVehicleClassStatus', sbm.data.statuses);
$('.VehicleClassType,.VehicleClassStatus', frm).prop('disabled', false);
sbm.clearControlErrors();
let $dlg = env.$dlg.item;
let $frm = env.$frm.item;
sbm.configureItemControls(cfg, $frm);
var btns = {};
btns[sbm.lbl.ok] = function () { vc.storeItem(env); };
btns[sbm.lbl.cancel] = function () { delete env.prmEdit; $(this).dialog('close'); };
$dlg.dialog('option', 'buttons', btns);
if (title) $dlg.dialog('option', 'title', title);
sbm.openDialog($dlg, 600, 600);
}
//--------------------------------------------------------------
vc.updateItem = function ($item, item)
vc.updateItem = function (env, id)
{
vc.clearItem();
$('.VehicleClassId', $frm.itemId).val(item.id);
sbm.ajax.updateItem = sbm.ajax.updateItem || { url: sbm.url.base + 'Assets/VehicleClass/Ajax/GetItem', formId: $frm.itemId.prop('id'), callbackFn: vc.onUpdateItem };
sbm.doAjaxRequest(sbm.ajax.updateItem, 50);
let $frm = env.$frm.itemId;
$('.VehicleClassId', $frm.itemId).val(id);
env.ajax.updateItem = env.ajax.updateItem || { url: `${sbm.url.base}Vehicles/VehicleClass/Ajax/GetItem`, formSel: $frm, callbackFn: function (response) { vc.onUpdateItem(env, response); } };
sbm.doAjaxRequest(env.ajax.updateItem, 50);
}
vc.onUpdateItem = function (response)
vc.onUpdateItem = function (env, response)
{
//sbm.debug('onUpdateItem', response);
let frm = $frm.item;
vc.clearItem();
if (!response.success) return;
let cfg = response.config || {};
vc.clearItem(env, cfg);
let item = response.vehicleClass;
$('.VehicleClassExists', frm).val(1);
$('.VehicleClassId', frm).val(item.id);
$('.VehicleClassType', frm).val(item.typeCode).prop('disabled', true);
$('.VehicleClassCode', frm).val(item.code);
$('.VehicleClassDescription', frm).val(item.descBrief);
$('.VehicleClassNotes', frm).val(item.notes);
$('.VehicleClassStatus', frm).val(item.statusCode).prop('disabled', true);
sbm.clearControlErrors();
$dlg.item.dialog('option', 'title', sbm.dlg.title.updateItem);
vc.openVehicleClassDlg();
let $frm = env.$frm.item;
sbm.populateFormValues(cfg, $frm, item.field.value);
let $ctrls = $('.sbm-input,.sbm-textarea,.sbm-select', $frm);
sbm.selectOrAdd($ctrls.filter('.VehicleClassStatus'), item.statusCode, item.field.value.Status);
vc.openItemDlg(env, cfg, sbm.dlg.title.updateItem);
}
//--------------------------------------------------------------
vc.storeItem = function ()
vc.storeItem = function (env)
{
sbm.ajax.storeItem = sbm.ajax.storeItem || { url: sbm.url.base + 'Assets/VehicleClass/Ajax/StoreItem', formId: 'frmVehicleClass', callbackFn: vc.onStoreItem };
sbm.doAjaxRequest(sbm.ajax.storeItem, 50);
env.ajax.storeItem = env.ajax.storeItem || { url: `${sbm.url.base}Vehicles/VehicleClass/Ajax/StoreItem`, formSel: env.$frm.item, callbackFn: function (response) { vc.onStoreItem(env, response); } };
sbm.doAjaxRequest(env.ajax.storeItem, 50);
}
vc.onStoreItem = function (response)
vc.onStoreItem = function (env, response)
{
//sbm.debug('onStoreItem', response);
sbm.refreshControlValues(response.controlValues);
if (!response.success) return;
$dlg.item.dialog('close');
env.$dlg.item.dialog('close');
var item = response.vehicleClass;
var $item = $('#' + vc.getItemId(item), $pnl.table);
if (!$item.length)
if (env.prmEdit)
{
$item = vc.getItemRowTemplate();
$('table tbody', $pnl.table).prepend($item).show();
vc.onItemEdited(env, item);
}
vc.populateItem($item, item);
else if (env.$pnl.table.length)
{
env.$pnl.msgs.hide().empty();
var $item = $(`#${vc.getItemId(item)}`, env.$pnl.table);
if (!$item.length)
{
$item = vc.getItemRowTemplate(env);
$('table tbody', env.$pnl.table).prepend($item).show();
}
vc.populateItem(env, $item, item);
sbm.configureItemTable(env.data.cfgList, env.$pnl.table);
}
}
//--------------------------------------------------------------
/* Params: type, search, fnSuccess. */
sbm.fn.selectVehicleClass = function (prm)
{
//sbm.debug('selectVehicleClass', prm);
let env = vc.env.select;
if (!env.$pnl.items.length) return;
env.prmSelect = prm;
env.$frm.filter.find('.FilterSearch').val(prm.search || '');
env.$pnl.table.find('tbody tr').remove();
sbm.openDialog(env.$dlg.select, 1000, 800);
setTimeout(function () { vc.refreshResults(env); }, 250);
}
vc.selectItemRow = function (env, $item, item)
{
//sbm.debug('selectItemRow', env, $item, item);
env.$pnl.table.find('tr').removeClass('sbm-sel');
$item.addClass('sbm-sel');
env.prmSelect.item = item;
}
vc.selectItem = function (env)
{
//sbm.debug('selectItem', env, env.prmSelect.item);
env.$dlg.select.dialog('close');
if (env.prmSelect.fnSuccess) env.prmSelect.fnSuccess(env.prmSelect.item);
delete env.prmSelect;
}
/* Params: id, fnSuccess. */
sbm.fn.editVehicleClass = function (prm)
{
//sbm.debug('editVehicleClass', prm);
let env = vc.env.select;
env.prmEdit = prm;
//sbm.debug(env, prm);
vc.updateItem(env, prm.id);
}
vc.onItemEdited = function (env, item)
{
//sbm.debug('vc.onItemEdited', env, item);
if (env.prmEdit.fnSuccess) env.prmEdit.fnSuccess(item);
delete env.prmEdit;
}
//--------------------------------------------------------------
vc.initEnv = function ($pnlItems)
{
let env = { mode: { search: 1 }, data: {}, ajax: {}, $pnl: {}, $frm: {}, $ctrl: {}, $dlg: {} };
let $items = env.$pnl.items = $($pnlItems);
if (!$items.length) return env;
env.$pnl.hdr = $items.find('.sbm-panel-header');
env.$pnl.bgr = env.$pnl.hdr.find('.sbm-burger').invisible();
env.$pnl.mnu = env.$pnl.bgr.find('ul.sbm-dropdown-menu');
env.$pnl.table = $items.find('.sbm-panel-item-table');
env.$pnl.msgs = env.$pnl.table.find('.sbm-panel-messages');
env.$pnl.tmpls = $items.find('.sbm-panel-item-template');
env.$frm.filter = $items.find('.frmVehicleClassFilter');
env.$frm.filter.on('input', '.FilterSearch', function () { vc.refreshResults(env, 250); });
env.$frm.filter.on('change', '.FilterAssetType', function () { vc.refreshResults(env, 50); });
env.$frm.itemId = $('#frmVehicleClassId');
var opt = sbm.dlgOpts();
opt.dialogClass += " sbm-VehicleClass";
env.$dlg.item = $('#dlgVehicleClass').dialog(opt);
env.$frm.item = $('#frmVehicleClass').off('input').on('input', '.sbm-input, .sbm-textarea', function () { sbm.clearControlError(this); }).off('change').on('change', '.sbm-select', function () { sbm.clearControlError(this); });
var opt = sbm.dlgOpts();
opt.dialogClass += " sbm-VehicleClass";
opt.buttons[sbm.lbl.ok] = function () { vc.selectItem(env); };
opt.buttons[sbm.lbl.cancel] = function () { delete env.prmSelect; $(this).dialog('close'); };
env.$dlg.select = $('#dlgVehicleClassSelect').dialog(opt);
return env;
}
//--------------------------------------------------------------
$(function ()
{
$pnl.items = $('.sbm-panel.VehicleClasses');
$pnl.header = $('.sbm-panel-header', $pnl.items);
$pnl.filter = $('.sbm-panel-filter', $pnl.items);
$pnl.msgs = $('.sbm-panel-messages', $pnl.items);
$pnl.table = $('.sbm-panel-item-table', $pnl.items);
$pnl.tmpls = $('.sbm-panel-item-template', $pnl.items);
$frm.filter = $('#frmVehicleClassFilter');
$('.FilterSearch', $frm.filter).on('input', function () { vc.refreshResults(250); });
$frm.itemId = $('#frmVehicleClassId');
var opt = sbm.dlgOpts();
opt.buttons[sbm.lbl.save] = function () { vc.storeItem(); };
opt.buttons[sbm.lbl.cancel] = function () { $(this).dialog('close'); };
$dlg.item = $('#dlgVehicleClass').dialog(opt);
$frm.item = $('#frmVehicleClass').off('input').on('input', '.sbm-input, .sbm-textarea', function () { sbm.clearControlError(this); }).off('change').on('change', '.sbm-select', function () { sbm.clearControlError(this); });
setTimeout(vc.refreshResults, 250);
vc.env.maint = vc.initEnv('.sbm-panel.VehicleClasses');
if (vc.env.maint.$pnl.items.length) setTimeout(function () { vc.refreshResults(vc.env.maint); }, 250);
vc.env.select = vc.initEnv('#dlgVehicleClassSelect');
if (vc.env.select.$pnl.items.length) setTimeout(function () { vc.refreshConfig(vc.env.select); }, 250);
});
//--------------------------------------------------------------