3.0.2.1 Vehicle Classes
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+20
-2
@@ -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.
|
||||
|
||||
|
||||
+9
-10
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+168
-51
@@ -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 < 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""> *</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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
@@ -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"> *</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"> *</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"> *</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"> *</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" />
|
||||
|
||||
+84
@@ -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>
|
||||
+69
@@ -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" />
|
||||
+44
@@ -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);
|
||||
});
|
||||
|
||||
//--------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user