Merge branch 'main' into Hargata/report.usability

This commit is contained in:
DESKTOP-T0O5CDB\DESK-555BD
2024-02-19 13:59:04 -07:00
32 changed files with 414 additions and 54 deletions

View File

@@ -154,6 +154,34 @@ namespace CarCareTracker.Controllers
_dataAccess.DeleteVehicle(vehicleId); _dataAccess.DeleteVehicle(vehicleId);
return Json(result); return Json(result);
} }
[HttpPost]
public IActionResult DuplicateVehicleCollaborators(int sourceVehicleId, int destVehicleId)
{
try
{
//retrieve collaborators for both source and destination vehicle id.
if (_userLogic.UserCanEditVehicle(GetUserID(), sourceVehicleId) && _userLogic.UserCanEditVehicle(GetUserID(), destVehicleId))
{
var sourceCollaborators = _userLogic.GetCollaboratorsForVehicle(sourceVehicleId).Select(x => x.UserVehicle.UserId).ToList();
var destCollaborators = _userLogic.GetCollaboratorsForVehicle(destVehicleId).Select(x => x.UserVehicle.UserId).ToList();
sourceCollaborators.RemoveAll(x => destCollaborators.Contains(x));
if (sourceCollaborators.Any()) {
foreach (int collaboratorId in sourceCollaborators)
{
_userLogic.AddUserAccessToVehicle(collaboratorId, destVehicleId);
}
} else
{
return Json(new OperationResponse { Success = false, Message = "Both vehicles already have identical collaborators" });
}
}
return Json(new OperationResponse { Success = true, Message = "Collaborators Copied"});
} catch (Exception ex)
{
_logger.LogError(ex.Message);
return Json(new OperationResponse { Success = false, Message = StaticHelper.GenericErrorMessage });
}
}
#region "Bulk Imports and Exports" #region "Bulk Imports and Exports"
[HttpGet] [HttpGet]
public IActionResult GetBulkImportModalPartialView(ImportMode mode) public IActionResult GetBulkImportModalPartialView(ImportMode mode)
@@ -712,11 +740,11 @@ namespace CarCareTracker.Controllers
} }
//move files from temp. //move files from temp.
serviceRecord.Files = serviceRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); serviceRecord.Files = serviceRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
var result = _serviceRecordDataAccess.SaveServiceRecordToVehicle(serviceRecord.ToServiceRecord()); if (serviceRecord.Supplies.Any())
if (result && serviceRecord.Supplies.Any())
{ {
RequisitionSupplyRecordsByUsage(serviceRecord.Supplies); serviceRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(serviceRecord.Supplies, DateTime.Parse(serviceRecord.Date), serviceRecord.Description);
} }
var result = _serviceRecordDataAccess.SaveServiceRecordToVehicle(serviceRecord.ToServiceRecord());
return Json(result); return Json(result);
} }
[HttpGet] [HttpGet]
@@ -740,6 +768,7 @@ namespace CarCareTracker.Controllers
VehicleId = result.VehicleId, VehicleId = result.VehicleId,
Files = result.Files, Files = result.Files,
Tags = result.Tags, Tags = result.Tags,
RequisitionHistory = result.RequisitionHistory,
ExtraFields = StaticHelper.AddExtraFields(result.ExtraFields, _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.ServiceRecord).ExtraFields) ExtraFields = StaticHelper.AddExtraFields(result.ExtraFields, _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.ServiceRecord).ExtraFields)
}; };
return PartialView("_ServiceRecordModal", convertedResult); return PartialView("_ServiceRecordModal", convertedResult);
@@ -783,11 +812,11 @@ namespace CarCareTracker.Controllers
} }
//move files from temp. //move files from temp.
collisionRecord.Files = collisionRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); collisionRecord.Files = collisionRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
var result = _collisionRecordDataAccess.SaveCollisionRecordToVehicle(collisionRecord.ToCollisionRecord()); if (collisionRecord.Supplies.Any())
if (result && collisionRecord.Supplies.Any())
{ {
RequisitionSupplyRecordsByUsage(collisionRecord.Supplies); collisionRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(collisionRecord.Supplies, DateTime.Parse(collisionRecord.Date), collisionRecord.Description);
} }
var result = _collisionRecordDataAccess.SaveCollisionRecordToVehicle(collisionRecord.ToCollisionRecord());
return Json(result); return Json(result);
} }
[HttpGet] [HttpGet]
@@ -811,6 +840,7 @@ namespace CarCareTracker.Controllers
VehicleId = result.VehicleId, VehicleId = result.VehicleId,
Files = result.Files, Files = result.Files,
Tags = result.Tags, Tags = result.Tags,
RequisitionHistory = result.RequisitionHistory,
ExtraFields = StaticHelper.AddExtraFields(result.ExtraFields, _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.RepairRecord).ExtraFields) ExtraFields = StaticHelper.AddExtraFields(result.ExtraFields, _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.RepairRecord).ExtraFields)
}; };
return PartialView("_CollisionRecordModal", convertedResult); return PartialView("_CollisionRecordModal", convertedResult);
@@ -1464,11 +1494,11 @@ namespace CarCareTracker.Controllers
} }
//move files from temp. //move files from temp.
upgradeRecord.Files = upgradeRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); upgradeRecord.Files = upgradeRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
var result = _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(upgradeRecord.ToUpgradeRecord()); if (upgradeRecord.Supplies.Any())
if (result && upgradeRecord.Supplies.Any())
{ {
RequisitionSupplyRecordsByUsage(upgradeRecord.Supplies); upgradeRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(upgradeRecord.Supplies, DateTime.Parse(upgradeRecord.Date), upgradeRecord.Description);
} }
var result = _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(upgradeRecord.ToUpgradeRecord());
return Json(result); return Json(result);
} }
[HttpGet] [HttpGet]
@@ -1492,6 +1522,7 @@ namespace CarCareTracker.Controllers
VehicleId = result.VehicleId, VehicleId = result.VehicleId,
Files = result.Files, Files = result.Files,
Tags = result.Tags, Tags = result.Tags,
RequisitionHistory = result.RequisitionHistory,
ExtraFields = StaticHelper.AddExtraFields(result.ExtraFields, _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.UpgradeRecord).ExtraFields) ExtraFields = StaticHelper.AddExtraFields(result.ExtraFields, _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.UpgradeRecord).ExtraFields)
}; };
return PartialView("_UpgradeRecordModal", convertedResult); return PartialView("_UpgradeRecordModal", convertedResult);
@@ -1564,8 +1595,9 @@ namespace CarCareTracker.Controllers
} }
return result; return result;
} }
private void RequisitionSupplyRecordsByUsage(List<SupplyUsage> supplyUsage) private List<SupplyUsageHistory> RequisitionSupplyRecordsByUsage(List<SupplyUsage> supplyUsage, DateTime dateRequisitioned, string usageDescription)
{ {
List<SupplyUsageHistory> results = new List<SupplyUsageHistory>();
foreach(SupplyUsage supply in supplyUsage) foreach(SupplyUsage supply in supplyUsage)
{ {
//get supply record. //get supply record.
@@ -1575,9 +1607,29 @@ namespace CarCareTracker.Controllers
result.Quantity -= supply.Quantity; result.Quantity -= supply.Quantity;
//deduct cost. //deduct cost.
result.Cost -= (supply.Quantity * unitCost); result.Cost -= (supply.Quantity * unitCost);
//check decimal places to ensure that it always has a max of 3 decimal places.
var roundedDecimal = decimal.Round(result.Cost, 3);
if (roundedDecimal != result.Cost)
{
//Too many decimals
result.Cost = roundedDecimal;
}
//create new requisitionrrecord
var requisitionRecord = new SupplyUsageHistory
{
Date = dateRequisitioned,
Description = usageDescription,
Quantity = supply.Quantity,
Cost = (supply.Quantity * unitCost)
};
result.RequisitionHistory.Add(requisitionRecord);
//save //save
_supplyRecordDataAccess.SaveSupplyRecordToVehicle(result); _supplyRecordDataAccess.SaveSupplyRecordToVehicle(result);
requisitionRecord.Description = result.Description; //change the name of the description for plan/service/repair/upgrade records
requisitionRecord.PartNumber = result.PartNumber; //populate part number if not displayed in supplies modal.
results.Add(requisitionRecord);
} }
return results;
} }
[TypeFilter(typeof(CollaboratorFilter))] [TypeFilter(typeof(CollaboratorFilter))]
[HttpGet] [HttpGet]
@@ -1647,6 +1699,7 @@ namespace CarCareTracker.Controllers
VehicleId = result.VehicleId, VehicleId = result.VehicleId,
Files = result.Files, Files = result.Files,
Tags = result.Tags, Tags = result.Tags,
RequisitionHistory = result.RequisitionHistory,
ExtraFields = StaticHelper.AddExtraFields(result.ExtraFields, _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.SupplyRecord).ExtraFields) ExtraFields = StaticHelper.AddExtraFields(result.ExtraFields, _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.SupplyRecord).ExtraFields)
}; };
return PartialView("_SupplyRecordModal", convertedResult); return PartialView("_SupplyRecordModal", convertedResult);
@@ -1677,11 +1730,11 @@ namespace CarCareTracker.Controllers
planRecord.DateModified = DateTime.Now.ToString("G"); planRecord.DateModified = DateTime.Now.ToString("G");
//move files from temp. //move files from temp.
planRecord.Files = planRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); planRecord.Files = planRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
var result = _planRecordDataAccess.SavePlanRecordToVehicle(planRecord.ToPlanRecord()); if (planRecord.Supplies.Any())
if (result && planRecord.Supplies.Any())
{ {
RequisitionSupplyRecordsByUsage(planRecord.Supplies); planRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(planRecord.Supplies, DateTime.Parse(planRecord.DateCreated), planRecord.Description);
} }
var result = _planRecordDataAccess.SavePlanRecordToVehicle(planRecord.ToPlanRecord());
return Json(result); return Json(result);
} }
[HttpPost] [HttpPost]
@@ -1727,15 +1780,24 @@ namespace CarCareTracker.Controllers
return Json(new OperationResponse { Success = false, Message = string.Join("<br>", supplyAvailability) }); return Json(new OperationResponse { Success = false, Message = string.Join("<br>", supplyAvailability) });
} }
} }
if (existingRecord.ReminderRecordId != default)
{
//check if reminder still exists and is still recurring.
var existingReminder = _reminderRecordDataAccess.GetReminderRecordById(existingRecord.ReminderRecordId);
if (existingReminder is null || existingReminder.Id == default || !existingReminder.IsRecurring)
{
return Json(new OperationResponse { Success = false, Message = "Missing or Non-recurring Reminder, Please Delete This Template and Recreate It." });
}
}
//populate createdDate //populate createdDate
existingRecord.DateCreated = DateTime.Now.ToString("G"); existingRecord.DateCreated = DateTime.Now.ToString("G");
existingRecord.DateModified = DateTime.Now.ToString("G"); existingRecord.DateModified = DateTime.Now.ToString("G");
existingRecord.Id = default; existingRecord.Id = default;
var result = _planRecordDataAccess.SavePlanRecordToVehicle(existingRecord.ToPlanRecord()); if (existingRecord.Supplies.Any())
if (result && existingRecord.Supplies.Any())
{ {
RequisitionSupplyRecordsByUsage(existingRecord.Supplies); existingRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(existingRecord.Supplies, DateTime.Parse(existingRecord.DateCreated), existingRecord.Description);
} }
var result = _planRecordDataAccess.SavePlanRecordToVehicle(existingRecord.ToPlanRecord());
return Json(new OperationResponse { Success = result, Message = result ? "Plan Record Added" : StaticHelper.GenericErrorMessage }); return Json(new OperationResponse { Success = result, Message = result ? "Plan Record Added" : StaticHelper.GenericErrorMessage });
} }
[HttpGet] [HttpGet]
@@ -1744,6 +1806,16 @@ namespace CarCareTracker.Controllers
return PartialView("_PlanRecordModal", new PlanRecordInput() { ExtraFields = _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.PlanRecord).ExtraFields }); return PartialView("_PlanRecordModal", new PlanRecordInput() { ExtraFields = _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.PlanRecord).ExtraFields });
} }
[HttpPost] [HttpPost]
public IActionResult GetAddPlanRecordPartialView(PlanRecordInput? planModel)
{
if (planModel is not null)
{
planModel.ExtraFields = _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.PlanRecord).ExtraFields;
return PartialView("_PlanRecordModal", planModel);
}
return PartialView("_PlanRecordModal", new PlanRecordInput() { ExtraFields = _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.PlanRecord).ExtraFields });
}
[HttpPost]
public IActionResult UpdatePlanRecordProgress(int planRecordId, PlanProgress planProgress, int odometer = 0) public IActionResult UpdatePlanRecordProgress(int planRecordId, PlanProgress planProgress, int odometer = 0)
{ {
var existingRecord = _planRecordDataAccess.GetPlanRecordById(planRecordId); var existingRecord = _planRecordDataAccess.GetPlanRecordById(planRecordId);
@@ -1775,6 +1847,7 @@ namespace CarCareTracker.Controllers
Cost = existingRecord.Cost, Cost = existingRecord.Cost,
Notes = existingRecord.Notes, Notes = existingRecord.Notes,
Files = existingRecord.Files, Files = existingRecord.Files,
RequisitionHistory = existingRecord.RequisitionHistory,
ExtraFields = existingRecord.ExtraFields ExtraFields = existingRecord.ExtraFields
}; };
_serviceRecordDataAccess.SaveServiceRecordToVehicle(newRecord); _serviceRecordDataAccess.SaveServiceRecordToVehicle(newRecord);
@@ -1790,6 +1863,7 @@ namespace CarCareTracker.Controllers
Cost = existingRecord.Cost, Cost = existingRecord.Cost,
Notes = existingRecord.Notes, Notes = existingRecord.Notes,
Files = existingRecord.Files, Files = existingRecord.Files,
RequisitionHistory = existingRecord.RequisitionHistory,
ExtraFields = existingRecord.ExtraFields ExtraFields = existingRecord.ExtraFields
}; };
_collisionRecordDataAccess.SaveCollisionRecordToVehicle(newRecord); _collisionRecordDataAccess.SaveCollisionRecordToVehicle(newRecord);
@@ -1805,10 +1879,29 @@ namespace CarCareTracker.Controllers
Cost = existingRecord.Cost, Cost = existingRecord.Cost,
Notes = existingRecord.Notes, Notes = existingRecord.Notes,
Files = existingRecord.Files, Files = existingRecord.Files,
RequisitionHistory = existingRecord.RequisitionHistory,
ExtraFields = existingRecord.ExtraFields ExtraFields = existingRecord.ExtraFields
}; };
_upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(newRecord); _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(newRecord);
} }
//push back any reminders
if (existingRecord.ReminderRecordId != default)
{
var existingReminder = _reminderRecordDataAccess.GetReminderRecordById(existingRecord.ReminderRecordId);
if (existingReminder is not null && existingReminder.Id != default && existingReminder.IsRecurring)
{
existingReminder = _reminderHelper.GetUpdatedRecurringReminderRecord(existingReminder);
//save to db.
var reminderUpdateResult = _reminderRecordDataAccess.SaveReminderRecordToVehicle(existingReminder);
if (!reminderUpdateResult)
{
_logger.LogError("Unable to update reminder either because the reminder no longer exists or is no longer recurring");
}
} else
{
_logger.LogError("Unable to update reminder because it no longer exists.");
}
}
} }
return Json(result); return Json(result);
} }
@@ -1830,6 +1923,8 @@ namespace CarCareTracker.Controllers
Notes = result.Notes, Notes = result.Notes,
VehicleId = result.VehicleId, VehicleId = result.VehicleId,
Files = result.Files, Files = result.Files,
RequisitionHistory = result.RequisitionHistory,
ReminderRecordId = result.ReminderRecordId,
ExtraFields = StaticHelper.AddExtraFields(result.ExtraFields, _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.PlanRecord).ExtraFields) ExtraFields = StaticHelper.AddExtraFields(result.ExtraFields, _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.PlanRecord).ExtraFields)
}; };
return PartialView("_PlanRecordModal", convertedResult); return PartialView("_PlanRecordModal", convertedResult);
@@ -1946,5 +2041,6 @@ namespace CarCareTracker.Controllers
return Json(result); return Json(result);
} }
#endregion #endregion
} }
} }

View File

@@ -13,6 +13,20 @@
public List<SupplyUsage> Supplies { get; set; } = new List<SupplyUsage>(); public List<SupplyUsage> Supplies { get; set; } = new List<SupplyUsage>();
public List<string> Tags { get; set; } = new List<string>(); public List<string> Tags { get; set; } = new List<string>();
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>(); public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public CollisionRecord ToCollisionRecord() { return new CollisionRecord { Id = Id, VehicleId = VehicleId, Date = DateTime.Parse(Date), Cost = Cost, Mileage = Mileage, Description = Description, Notes = Notes, Files = Files, Tags = Tags, ExtraFields = ExtraFields }; } public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
public CollisionRecord ToCollisionRecord() { return new CollisionRecord {
Id = Id,
VehicleId = VehicleId,
Date = DateTime.Parse(Date),
Cost = Cost,
Mileage = Mileage,
Description = Description,
Notes = Notes,
Files = Files,
Tags = Tags,
ExtraFields = ExtraFields,
RequisitionHistory = RequisitionHistory
};
}
} }
} }

View File

@@ -12,5 +12,6 @@
public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>(); public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>();
public List<string> Tags { get; set;} = new List<string>(); public List<string> Tags { get; set;} = new List<string>();
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>(); public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
} }
} }

View File

@@ -1,8 +0,0 @@
namespace CarCareTracker.Models
{
public class PlanCostItem
{
public string CostName { get; set; }
public decimal CostAmount { get; set; }
}
}

View File

@@ -4,6 +4,7 @@
{ {
public int Id { get; set; } public int Id { get; set; }
public int VehicleId { get; set; } public int VehicleId { get; set; }
public int ReminderRecordId { get; set; }
public DateTime DateCreated { get; set; } public DateTime DateCreated { get; set; }
public DateTime DateModified { get; set; } public DateTime DateModified { get; set; }
public string Description { get; set; } public string Description { get; set; }
@@ -14,5 +15,6 @@
public PlanProgress Progress { get; set; } public PlanProgress Progress { get; set; }
public decimal Cost { get; set; } public decimal Cost { get; set; }
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>(); public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
} }
} }

View File

@@ -4,6 +4,7 @@
{ {
public int Id { get; set; } public int Id { get; set; }
public int VehicleId { get; set; } public int VehicleId { get; set; }
public int ReminderRecordId { get; set; }
public string DateCreated { get; set; } = DateTime.Now.ToShortDateString(); public string DateCreated { get; set; } = DateTime.Now.ToShortDateString();
public string DateModified { get; set; } = DateTime.Now.ToShortDateString(); public string DateModified { get; set; } = DateTime.Now.ToShortDateString();
public string Description { get; set; } public string Description { get; set; }
@@ -15,9 +16,11 @@
public PlanProgress Progress { get; set; } public PlanProgress Progress { get; set; }
public decimal Cost { get; set; } public decimal Cost { get; set; }
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>(); public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
public PlanRecord ToPlanRecord() { return new PlanRecord { public PlanRecord ToPlanRecord() { return new PlanRecord {
Id = Id, Id = Id,
VehicleId = VehicleId, VehicleId = VehicleId,
ReminderRecordId = ReminderRecordId,
DateCreated = DateTime.Parse(DateCreated), DateCreated = DateTime.Parse(DateCreated),
DateModified = DateTime.Parse(DateModified), DateModified = DateTime.Parse(DateModified),
Description = Description, Description = Description,
@@ -27,7 +30,12 @@
Cost = Cost, Cost = Cost,
Priority = Priority, Priority = Priority,
Progress = Progress, Progress = Progress,
ExtraFields = ExtraFields ExtraFields = ExtraFields,
RequisitionHistory = RequisitionHistory
}; } }; }
/// <summary>
/// only used to hide view template button on plan create modal.
/// </summary>
public bool CreatedFromReminder { get; set; }
} }
} }

View File

@@ -13,6 +13,20 @@
public List<SupplyUsage> Supplies { get; set; } = new List<SupplyUsage>(); public List<SupplyUsage> Supplies { get; set; } = new List<SupplyUsage>();
public List<string> Tags { get; set; } = new List<string>(); public List<string> Tags { get; set; } = new List<string>();
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>(); public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public ServiceRecord ToServiceRecord() { return new ServiceRecord { Id = Id, VehicleId = VehicleId, Date = DateTime.Parse(Date), Cost = Cost, Mileage = Mileage, Description = Description, Notes = Notes, Files = Files, Tags = Tags, ExtraFields = ExtraFields }; } public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
public ServiceRecord ToServiceRecord() { return new ServiceRecord {
Id = Id,
VehicleId = VehicleId,
Date = DateTime.Parse(Date),
Cost = Cost,
Mileage = Mileage,
Description = Description,
Notes = Notes,
Files = Files,
Tags = Tags,
ExtraFields = ExtraFields,
RequisitionHistory = RequisitionHistory
};
}
} }
} }

View File

@@ -35,5 +35,6 @@
public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>(); public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>();
public List<string> Tags { get; set; } = new List<string>(); public List<string> Tags { get; set; } = new List<string>();
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>(); public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
} }
} }

View File

@@ -14,6 +14,7 @@
public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>(); public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>();
public List<string> Tags { get; set; } = new List<string>(); public List<string> Tags { get; set; } = new List<string>();
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>(); public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
public SupplyRecord ToSupplyRecord() { return new SupplyRecord { public SupplyRecord ToSupplyRecord() { return new SupplyRecord {
Id = Id, Id = Id,
VehicleId = VehicleId, VehicleId = VehicleId,
@@ -26,7 +27,8 @@
Notes = Notes, Notes = Notes,
Files = Files, Files = Files,
Tags = Tags, Tags = Tags,
ExtraFields = ExtraFields ExtraFields = ExtraFields,
RequisitionHistory = RequisitionHistory
}; } }; }
} }
} }

View File

@@ -0,0 +1,10 @@
namespace CarCareTracker.Models
{
public class SupplyUsageHistory {
public DateTime Date { get; set; }
public string PartNumber { get; set; }
public string Description { get; set; }
public decimal Quantity { get; set; }
public decimal Cost { get; set; }
}
}

View File

@@ -13,6 +13,20 @@
public List<SupplyUsage> Supplies { get; set; } = new List<SupplyUsage>(); public List<SupplyUsage> Supplies { get; set; } = new List<SupplyUsage>();
public List<string> Tags { get; set; } = new List<string>(); public List<string> Tags { get; set; } = new List<string>();
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>(); public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public UpgradeRecord ToUpgradeRecord() { return new UpgradeRecord { Id = Id, VehicleId = VehicleId, Date = DateTime.Parse(Date), Cost = Cost, Mileage = Mileage, Description = Description, Notes = Notes, Files = Files, Tags = Tags, ExtraFields = ExtraFields }; } public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
public UpgradeRecord ToUpgradeRecord() { return new UpgradeRecord {
Id = Id,
VehicleId = VehicleId,
Date = DateTime.Parse(Date),
Cost = Cost,
Mileage = Mileage,
Description = Description,
Notes = Notes,
Files = Files,
Tags = Tags,
ExtraFields = ExtraFields,
RequisitionHistory = RequisitionHistory
};
}
} }
} }

View File

@@ -23,9 +23,9 @@
<div class="row gy-3 align-items-stretch vehiclesContainer"> <div class="row gy-3 align-items-stretch vehiclesContainer">
@foreach (Vehicle vehicle in Model) @foreach (Vehicle vehicle in Model)
{ {
<div class="col-xl-2 col-lg-4 col-md-4 col-sm-4 col-4 user-select-none garage-item" data-tags='@string.Join(" ", vehicle.Tags)' id="gridVehicle_@vehicle.Id" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" data-bs-trigger="manual" onmouseenter="loadPinnedNotes(@vehicle.Id)" ontouchstart="loadPinnedNotes(@vehicle.Id)" ontouchcancel="hidePinnedNotes(@vehicle.Id)" ontouchend="hidePinnedNotes(@vehicle.Id)" onmouseleave="hidePinnedNotes(@vehicle.Id)"> <div class="col-xl-2 col-lg-4 col-md-4 col-sm-4 col-4 user-select-none garage-item" ondragover="dragOver(event)" ondrop="dropBox(event, @vehicle.Id)" draggable="true" ondragstart="dragStart(event, @vehicle.Id)" data-tags='@string.Join(" ", vehicle.Tags)' id="gridVehicle_@vehicle.Id" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" data-bs-trigger="manual" onmouseenter="loadPinnedNotes(@vehicle.Id)" ontouchstart="loadPinnedNotes(@vehicle.Id)" ontouchcancel="hidePinnedNotes(@vehicle.Id)" ontouchend="hidePinnedNotes(@vehicle.Id)" onmouseleave="hidePinnedNotes(@vehicle.Id)">
<div class="card" onclick="viewVehicle(@vehicle.Id)"> <div class="card" onclick="viewVehicle(@vehicle.Id)">
<img src="@vehicle.ImageLocation" style="height:145px; object-fit:scale-down;" /> <img src="@vehicle.ImageLocation" style="height:145px; object-fit:scale-down; pointer-events:none;" />
<div class="card-body"> <div class="card-body">
<h5 class="card-title text-truncate garage-item-year" data-unit="@vehicle.Year">@($"{vehicle.Year}")</h5> <h5 class="card-title text-truncate garage-item-year" data-unit="@vehicle.Year">@($"{vehicle.Year}")</h5>
<h5 class="card-title text-truncate">@($"{vehicle.Make}")</h5> <h5 class="card-title text-truncate">@($"{vehicle.Make}")</h5>

View File

@@ -201,7 +201,7 @@
<img src="/defaults/lubelogger_logo.png" /> <img src="/defaults/lubelogger_logo.png" />
</div> </div>
<div class="d-flex justify-content-center"> <div class="d-flex justify-content-center">
<small class="text-body-secondary">Version 1.2.0</small> <small class="text-body-secondary">Version 1.2.1</small>
</div> </div>
<p class="lead"> <p class="lead">
Proudly developed in the rural town of Price, Utah by Hargata Softworks. Proudly developed in the rural town of Price, Utah by Hargata Softworks.

View File

@@ -83,6 +83,10 @@
<div class="modal-footer"> <div class="modal-footer">
@if (!isNew) @if (!isNew)
{ {
@if (Model.RequisitionHistory.Any())
{
<button type="button" class="btn btn-warning" onclick="toggleSupplyUsageHistory()"><i class="bi bi-shop"></i></button>
}
<div class="btn-group" style="margin-right:auto;"> <div class="btn-group" style="margin-right:auto;">
<button type="button" class="btn btn-md mt-1 mb-1 btn-danger" onclick="deleteCollisionRecord(@Model.Id)">@translator.Translate(userLanguage,"Delete")</button> <button type="button" class="btn btn-md mt-1 mb-1 btn-danger" onclick="deleteCollisionRecord(@Model.Id)">@translator.Translate(userLanguage,"Delete")</button>
<button type="button" class="btn btn-md btn-danger btn-md mt-1 mb-1 dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false"> <button type="button" class="btn btn-md btn-danger btn-md mt-1 mb-1 dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
@@ -105,6 +109,7 @@
<button type="button" class="btn btn-primary" onclick="saveCollisionRecordToVehicle(true)">@translator.Translate(userLanguage,"Edit Repair Record")</button> <button type="button" class="btn btn-primary" onclick="saveCollisionRecordToVehicle(true)">@translator.Translate(userLanguage,"Edit Repair Record")</button>
} }
</div> </div>
@await Html.PartialAsync("_SupplyRequisitionHistory", Model.RequisitionHistory)
<script> <script>
var uploadedFiles = []; var uploadedFiles = [];
var selectedSupplies = []; var selectedSupplies = [];
@@ -114,7 +119,7 @@
{ {
@:uploadedFiles.push({ name: "@filesUploaded.Name", location: "@filesUploaded.Location" }); @:uploadedFiles.push({ name: "@filesUploaded.Name", location: "@filesUploaded.Location" });
} }
} }
function getCollisionRecordModelData() { function getCollisionRecordModelData() {
return { id: @Model.Id} return { id: @Model.Id}
} }

View File

@@ -16,7 +16,13 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-6 col-md-1"> @if (Model.ReminderRecordId != default)
{
<div class="col-4 col-md-1">
<i class="bi bi-bell"></i>
</div>
}
<div class="@(Model.ReminderRecordId != default ? "col-4" : "col-6") col-md-1">
@if (Model.ImportMode == ImportMode.ServiceRecord) @if (Model.ImportMode == ImportMode.ServiceRecord)
{ {
<i class="bi bi-card-checklist"></i> <i class="bi bi-card-checklist"></i>
@@ -30,7 +36,7 @@
<i class="bi bi-exclamation-octagon"></i> <i class="bi bi-exclamation-octagon"></i>
} }
</div> </div>
<div class="col-6 col-md-1"> <div class="@(Model.ReminderRecordId != default ? "col-4" : "col-6") col-md-1">
@if (Model.Priority == PlanPriority.Critical) @if (Model.Priority == PlanPriority.Critical)
{ {
<i class="bi bi-fire"></i> <i class="bi bi-fire"></i>

View File

@@ -85,6 +85,10 @@
<div class="modal-footer"> <div class="modal-footer">
@if (!isNew) @if (!isNew)
{ {
@if (Model.RequisitionHistory.Any())
{
<button type="button" class="btn btn-warning" onclick="toggleSupplyUsageHistory()"><i class="bi bi-shop"></i></button>
}
<button type="button" class="btn btn-danger" onclick="deletePlanRecord(@Model.Id)" style="margin-right:auto;">@translator.Translate(userLanguage, "Delete")</button> <button type="button" class="btn btn-danger" onclick="deletePlanRecord(@Model.Id)" style="margin-right:auto;">@translator.Translate(userLanguage, "Delete")</button>
} }
<button type="button" class="btn btn-secondary" onclick="hideAddPlanRecordModal()">@translator.Translate(userLanguage, "Cancel")</button> <button type="button" class="btn btn-secondary" onclick="hideAddPlanRecordModal()">@translator.Translate(userLanguage, "Cancel")</button>
@@ -97,7 +101,10 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item" href="#" onclick="savePlanRecordTemplate()">@translator.Translate(userLanguage, "Save as Template")</a></li> <li><a class="dropdown-item" href="#" onclick="savePlanRecordTemplate()">@translator.Translate(userLanguage, "Save as Template")</a></li>
<li><a class="dropdown-item" href="#" onclick="showPlanRecordTemplatesModal()">@translator.Translate(userLanguage, "View Templates")</a></li> @if (!Model.CreatedFromReminder)
{
<li><a class="dropdown-item" href="#" onclick="showPlanRecordTemplatesModal()">@translator.Translate(userLanguage, "View Templates")</a></li>
}
</ul> </ul>
</div> </div>
} }
@@ -106,6 +113,7 @@
<button type="button" class="btn btn-primary" onclick="savePlanRecordToVehicle(true)">@translator.Translate(userLanguage, "Edit Plan Record")</button> <button type="button" class="btn btn-primary" onclick="savePlanRecordToVehicle(true)">@translator.Translate(userLanguage, "Edit Plan Record")</button>
} }
</div> </div>
@await Html.PartialAsync("_SupplyRequisitionHistory", Model.RequisitionHistory)
<script> <script>
var uploadedFiles = []; var uploadedFiles = [];
var selectedSupplies = []; var selectedSupplies = [];
@@ -119,7 +127,9 @@
function getPlanRecordModelData() { function getPlanRecordModelData() {
return { return {
id: @Model.Id, id: @Model.Id,
dateCreated: decodeHTMLEntities('@(Model.DateCreated)') dateCreated: decodeHTMLEntities('@(Model.DateCreated)'),
reminderRecordId: decodeHTMLEntities('@Model.ReminderRecordId'),
createdFromReminder: @Model.CreatedFromReminder.ToString().ToLower()
} }
} }
</script> </script>

View File

@@ -29,6 +29,10 @@
<tr class="d-flex" id="supplyRows"> <tr class="d-flex" id="supplyRows">
<td class="col-8 text-truncate"> <td class="col-8 text-truncate">
@StaticHelper.TruncateStrings(planRecordTemplate.Description) @StaticHelper.TruncateStrings(planRecordTemplate.Description)
@if(planRecordTemplate.ReminderRecordId != default)
{
<i class="bi bi-bell ms-2"></i>
}
@if (planRecordTemplate.Files.Any()) @if (planRecordTemplate.Files.Any())
{ {
<i class="bi bi-paperclip ms-2"></i> <i class="bi bi-paperclip ms-2"></i>

View File

@@ -90,6 +90,10 @@
<div class="modal-footer"> <div class="modal-footer">
@if (!isNew) @if (!isNew)
{ {
@if (Model.IsRecurring)
{
<button type="button" class="btn btn-warning" onclick="createPlanRecordFromReminder(@Model.Id)">@translator.Translate(userLanguage, "Plan")</button>
}
<button type="button" class="btn btn-danger" onclick="deleteReminderRecord(@Model.Id)" style="margin-right:auto;">@translator.Translate(userLanguage, "Delete")</button> <button type="button" class="btn btn-danger" onclick="deleteReminderRecord(@Model.Id)" style="margin-right:auto;">@translator.Translate(userLanguage, "Delete")</button>
} }
<button type="button" class="btn btn-secondary" onclick="hideAddReminderRecordModal()">@translator.Translate(userLanguage, "Cancel")</button> <button type="button" class="btn btn-secondary" onclick="hideAddReminderRecordModal()">@translator.Translate(userLanguage, "Cancel")</button>

View File

@@ -94,3 +94,9 @@
</table> </table>
</div> </div>
</div> </div>
<div class="modal fade" data-bs-focus="false" id="planRecordModal" tabindex="-1" role="dialog" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content" id="planRecordModalContent">
</div>
</div>
</div>

View File

@@ -83,6 +83,10 @@
<div class="modal-footer"> <div class="modal-footer">
@if (!isNew) @if (!isNew)
{ {
@if (Model.RequisitionHistory.Any())
{
<button type="button" class="btn btn-warning" onclick="toggleSupplyUsageHistory()"><i class="bi bi-shop"></i></button>
}
<div class="btn-group" style="margin-right:auto;"> <div class="btn-group" style="margin-right:auto;">
<button type="button" class="btn btn-md mt-1 mb-1 btn-danger" onclick="deleteServiceRecord(@Model.Id)">@translator.Translate(userLanguage,"Delete")</button> <button type="button" class="btn btn-md mt-1 mb-1 btn-danger" onclick="deleteServiceRecord(@Model.Id)">@translator.Translate(userLanguage,"Delete")</button>
<button type="button" class="btn btn-md btn-danger btn-md mt-1 mb-1 dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false"> <button type="button" class="btn btn-md btn-danger btn-md mt-1 mb-1 dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
@@ -105,6 +109,7 @@
<button type="button" class="btn btn-primary" onclick="saveServiceRecordToVehicle(true)">@translator.Translate(userLanguage,"Edit Service Record")</button> <button type="button" class="btn btn-primary" onclick="saveServiceRecordToVehicle(true)">@translator.Translate(userLanguage,"Edit Service Record")</button>
} }
</div> </div>
@await Html.PartialAsync("_SupplyRequisitionHistory", Model.RequisitionHistory)
<script> <script>
var uploadedFiles = []; var uploadedFiles = [];
var selectedSupplies = []; var selectedSupplies = [];

View File

@@ -80,6 +80,10 @@
<div class="modal-footer"> <div class="modal-footer">
@if (!isNew) @if (!isNew)
{ {
@if (Model.RequisitionHistory.Any())
{
<button type="button" class="btn btn-warning" onclick="toggleSupplyUsageHistory()"><i class="bi bi-clock-history"></i></button>
}
<button type="button" class="btn btn-danger" onclick="deleteSupplyRecord(@Model.Id)" style="margin-right:auto;">@translator.Translate(userLanguage,"Delete")</button> <button type="button" class="btn btn-danger" onclick="deleteSupplyRecord(@Model.Id)" style="margin-right:auto;">@translator.Translate(userLanguage,"Delete")</button>
} }
<button type="button" class="btn btn-secondary" onclick="hideAddSupplyRecordModal()">@translator.Translate(userLanguage,"Cancel")</button> <button type="button" class="btn btn-secondary" onclick="hideAddSupplyRecordModal()">@translator.Translate(userLanguage,"Cancel")</button>
@@ -92,15 +96,16 @@
<button type="button" class="btn btn-primary" onclick="saveSupplyRecordToVehicle(true)">@translator.Translate(userLanguage,"Edit Supply Record")</button> <button type="button" class="btn btn-primary" onclick="saveSupplyRecordToVehicle(true)">@translator.Translate(userLanguage,"Edit Supply Record")</button>
} }
</div> </div>
@await Html.PartialAsync("_SupplyRequisitionHistory", Model.RequisitionHistory)
<script> <script>
var uploadedFiles = []; var uploadedFiles = [];
getUploadedFilesFromModel(); getUploadedFilesFromModel();
function getUploadedFilesFromModel() { function getUploadedFilesFromModel() {
@foreach (UploadedFiles filesUploaded in Model.Files) @foreach (UploadedFiles filesUploaded in Model.Files)
{ {
@:uploadedFiles.push({ name: "@filesUploaded.Name", location: "@filesUploaded.Location" }); @:uploadedFiles.push({ name: "@filesUploaded.Name", location: "@filesUploaded.Location" });
}
} }
}
function getSupplyRecordModelData() { function getSupplyRecordModelData() {
return { id: @Model.Id} return { id: @Model.Id}
} }

View File

@@ -0,0 +1,72 @@
@using CarCareTracker.Helper
@inject IConfigHelper config
@inject ITranslationHelper translator
@{
var userConfig = config.GetUserConfig(User);
var userLanguage = userConfig.UserLanguage;
}
@model List<SupplyUsageHistory>
<script>
var supplyUsageHistory = [];
</script>
<div id="supplyUsageHistoryModalContainer" class="d-none">
<div class="modal-header">
<h5 class="modal-title">@translator.Translate(userLanguage, "Supply Requisition History")</h5>
</div>
<div class="modal-body">
@if (Model.Any())
{
<div class="row">
<div class="col-12" style="max-height:50vh; overflow-y:auto;">
<table class="table table-hover">
<thead class="sticky-top">
<tr class="d-flex">
<th scope="col" class="col-2">@translator.Translate(userLanguage, "Date")</th>
@if(Model.Any(x=>!string.IsNullOrWhiteSpace(x.PartNumber))){
<th scope="col" class="col-2">@translator.Translate(userLanguage, "Part Number")</th>
<th scope="col" class="col-4">@translator.Translate(userLanguage, "Description")</th>
} else
{
<th scope="col" class="col-6">@translator.Translate(userLanguage, "Description")</th>
}
<th scope="col" class="col-2">@translator.Translate(userLanguage, "Quantity")</th>
<th scope="col" class="col-2">@translator.Translate(userLanguage, "Cost")</th>
</tr>
</thead>
<tbody>
@foreach (SupplyUsageHistory usageHistory in Model)
{
<script>
supplyUsageHistory.push({ date: decodeHTMLEntities("@usageHistory.Date.ToShortDateString()"), partNumber: decodeHTMLEntities('@usageHistory.PartNumber'), description: decodeHTMLEntities("@usageHistory.Description"), quantity: decodeHTMLEntities("@usageHistory.Quantity.ToString("F")"), cost: decodeHTMLEntities("@usageHistory.Cost.ToString("F")") })
</script>
<tr class="d-flex">
<td class="col-2">@StaticHelper.TruncateStrings(usageHistory.Date.ToShortDateString())</td>
@if (!string.IsNullOrWhiteSpace(usageHistory.PartNumber))
{
<td class="col-2 text-truncate">@StaticHelper.TruncateStrings(usageHistory.PartNumber)</td>
<td class="col-4 text-truncate">@StaticHelper.TruncateStrings(usageHistory.Description)</td>
} else
{
<td class="col-6 text-truncate">@StaticHelper.TruncateStrings(usageHistory.Description, 50)</td>
}
<td class="col-2">@usageHistory.Quantity.ToString("F")</td>
<td class="col-2">@usageHistory.Cost.ToString("C2")</td>
</tr>
}
</tbody>
</table>
</div>
</div>
}
else
{
<div class="row">
<div class="col-12">
<div class="text-center">
<h4>@translator.Translate(userLanguage, "No supply requisitions in history")</h4>
</div>
</div>
</div>
}
</div>
</div>

View File

@@ -83,6 +83,10 @@
<div class="modal-footer"> <div class="modal-footer">
@if (!isNew) @if (!isNew)
{ {
@if (Model.RequisitionHistory.Any())
{
<button type="button" class="btn btn-warning" onclick="toggleSupplyUsageHistory()"><i class="bi bi-shop"></i></button>
}
<div class="btn-group" style="margin-right:auto;"> <div class="btn-group" style="margin-right:auto;">
<button type="button" class="btn btn-md mt-1 mb-1 btn-danger" onclick="deleteUpgradeRecord(@Model.Id)">@translator.Translate(userLanguage,"Delete")</button> <button type="button" class="btn btn-md mt-1 mb-1 btn-danger" onclick="deleteUpgradeRecord(@Model.Id)">@translator.Translate(userLanguage,"Delete")</button>
<button type="button" class="btn btn-md btn-danger btn-md mt-1 mb-1 dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false"> <button type="button" class="btn btn-md btn-danger btn-md mt-1 mb-1 dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
@@ -105,6 +109,7 @@
<button type="button" class="btn btn-primary" onclick="saveUpgradeRecordToVehicle(true)">@translator.Translate(userLanguage,"Edit Upgrade Record")</button> <button type="button" class="btn btn-primary" onclick="saveUpgradeRecordToVehicle(true)">@translator.Translate(userLanguage,"Edit Upgrade Record")</button>
} }
</div> </div>
@await Html.PartialAsync("_SupplyRequisitionHistory", Model.RequisitionHistory)
<script> <script>
var uploadedFiles = []; var uploadedFiles = [];
var selectedSupplies = []; var selectedSupplies = [];

File diff suppressed because one or more lines are too long

View File

@@ -129,6 +129,7 @@ function getAndValidateCollisionRecordValues() {
supplies: selectedSupplies, supplies: selectedSupplies,
tags: collisionTags, tags: collisionTags,
addReminderRecord: addReminderRecord, addReminderRecord: addReminderRecord,
extraFields: extraFields.extraFields extraFields: extraFields.extraFields,
requisitionHistory: supplyUsageHistory
} }
} }

View File

@@ -307,3 +307,47 @@ function sortGarage(sender, isMobile) {
} }
} }
} }
let dragged = null;
let draggedId = 0;
function dragEnter(event) {
event.preventDefault();
}
function dragStart(event, vehicleId) {
dragged = event.target;
draggedId = vehicleId;
event.dataTransfer.setData('text/plain', draggedId);
}
function dragOver(event) {
event.preventDefault();
}
function dropBox(event, targetVehicleId) {
if (dragged.parentElement != event.target && event.target != dragged && draggedId != targetVehicleId) {
copyContributors(draggedId, targetVehicleId);
}
event.preventDefault();
}
function copyContributors(sourceVehicleId, destVehicleId) {
var sourceVehicleName = $(`#gridVehicle_${sourceVehicleId} .card-body`).children('h5').map((index, elem) => { return elem.innerText }).toArray().join(" ");
var destVehicleName = $(`#gridVehicle_${destVehicleId} .card-body`).children('h5').map((index, elem) => { return elem.innerText }).toArray().join(" ");
Swal.fire({
title: "Copy Collaborators?",
text: `Copy collaborators over from ${sourceVehicleName} to ${destVehicleName}?`,
showCancelButton: true,
confirmButtonText: "Copy",
confirmButtonColor: "#0d6efd"
}).then((result) => {
if (result.isConfirmed) {
$.post('/Vehicle/DuplicateVehicleCollaborators', { sourceVehicleId: sourceVehicleId, destVehicleId: destVehicleId }, function (data) {
if (data.success) {
successToast("Collaborators Copied");
loadGarage();
} else {
errorToast(data.message);
}
})
} else {
$("#workAroundInput").hide();
}
});
}

View File

@@ -25,6 +25,10 @@ function showEditPlanRecordModal(planRecordId) {
} }
function hideAddPlanRecordModal() { function hideAddPlanRecordModal() {
$('#planRecordModal').modal('hide'); $('#planRecordModal').modal('hide');
if (getPlanRecordModelData().createdFromReminder) {
//show reminder Modal
$("#reminderRecordModal").modal("show");
}
} }
function deletePlanRecord(planRecordId) { function deletePlanRecord(planRecordId) {
$("#workAroundInput").show(); $("#workAroundInput").show();
@@ -64,10 +68,12 @@ function savePlanRecordToVehicle(isEdit) {
if (data) { if (data) {
successToast(isEdit ? "Plan Record Updated" : "Plan Record Added."); successToast(isEdit ? "Plan Record Updated" : "Plan Record Added.");
hideAddPlanRecordModal(); hideAddPlanRecordModal();
saveScrollPosition(); if (!getPlanRecordModelData().createdFromReminder) {
getVehiclePlanRecords(formValues.vehicleId); saveScrollPosition();
if (formValues.addReminderRecord) { getVehiclePlanRecords(formValues.vehicleId);
setTimeout(function () { showAddReminderModal(formValues); }, 500); if (formValues.addReminderRecord) {
setTimeout(function () { showAddReminderModal(formValues); }, 500);
}
} }
} else { } else {
errorToast(genericErrorMessage()); errorToast(genericErrorMessage());
@@ -139,9 +145,6 @@ function savePlanRecordTemplate() {
$.post('/Vehicle/SavePlanRecordTemplateToVehicleId', { planRecord: formValues }, function (data) { $.post('/Vehicle/SavePlanRecordTemplateToVehicleId', { planRecord: formValues }, function (data) {
if (data.success) { if (data.success) {
successToast(data.message); successToast(data.message);
hideAddPlanRecordModal();
saveScrollPosition();
getVehiclePlanRecords(formValues.vehicleId);
} else { } else {
errorToast(data.message); errorToast(data.message);
} }
@@ -157,6 +160,7 @@ function getAndValidatePlanRecordValues() {
var planDateCreated = getPlanRecordModelData().dateCreated; var planDateCreated = getPlanRecordModelData().dateCreated;
var vehicleId = GetVehicleId().vehicleId; var vehicleId = GetVehicleId().vehicleId;
var planRecordId = getPlanRecordModelData().id; var planRecordId = getPlanRecordModelData().id;
var reminderRecordId = getPlanRecordModelData().reminderRecordId;
//validation //validation
var hasError = false; var hasError = false;
var extraFields = getAndValidateExtraFields(); var extraFields = getAndValidateExtraFields();
@@ -188,7 +192,9 @@ function getAndValidatePlanRecordValues() {
priority: planPriority, priority: planPriority,
progress: planProgress, progress: planProgress,
importMode: planType, importMode: planType,
extraFields: extraFields.extraFields extraFields: extraFields.extraFields,
requisitionHistory: supplyUsageHistory,
reminderRecordId: reminderRecordId
} }
} }
//drag and drop stuff. //drag and drop stuff.

View File

@@ -218,3 +218,25 @@ function getAndValidateReminderRecordValues() {
customMonthInterval: customMonthInterval customMonthInterval: customMonthInterval
} }
} }
function createPlanRecordFromReminder(reminderRecordId) {
//get values
var formValues = getAndValidateReminderRecordValues();
//validate
if (formValues.hasError) {
errorToast("Please check the form data");
return;
}
var planModelInput = {
id: 0,
createdFromReminder: true,
vehicleId: formValues.vehicleId,
reminderRecordId: reminderRecordId,
description: formValues.description,
notes: formValues.notes
};
$.post('/Vehicle/GetAddPlanRecordPartialView', { planModel: planModelInput }, function (data) {
$("#reminderRecordModal").modal("hide");
$("#planRecordModalContent").html(data);
$("#planRecordModal").modal("show");
});
}

View File

@@ -129,6 +129,7 @@ function getAndValidateServiceRecordValues() {
supplies: selectedSupplies, supplies: selectedSupplies,
tags: serviceTags, tags: serviceTags,
addReminderRecord: addReminderRecord, addReminderRecord: addReminderRecord,
extraFields: extraFields.extraFields extraFields: extraFields.extraFields,
requisitionHistory: supplyUsageHistory
} }
} }

View File

@@ -415,3 +415,11 @@ function getAndValidateExtraFields() {
}); });
return { hasError: hasError, extraFields: outputData }; return { hasError: hasError, extraFields: outputData };
} }
function toggleSupplyUsageHistory() {
var container = $("#supplyUsageHistoryModalContainer");
if (container.hasClass("d-none")) {
container.removeClass("d-none");
} else {
container.addClass("d-none");
}
}

View File

@@ -130,6 +130,7 @@ function getAndValidateSupplyRecordValues() {
quantity: supplyQuantity, quantity: supplyQuantity,
files: uploadedFiles, files: uploadedFiles,
tags: supplyTags, tags: supplyTags,
extraFields: extraFields.extraFields extraFields: extraFields.extraFields,
requisitionHistory: supplyUsageHistory
} }
} }

View File

@@ -129,6 +129,7 @@ function getAndValidateUpgradeRecordValues() {
supplies: selectedSupplies, supplies: selectedSupplies,
tags: upgradeTags, tags: upgradeTags,
addReminderRecord: addReminderRecord, addReminderRecord: addReminderRecord,
extraFields: extraFields.extraFields extraFields: extraFields.extraFields,
requisitionHistory: supplyUsageHistory
} }
} }