diff --git a/server/AyaNova/biz/FormFieldReference.cs b/server/AyaNova/biz/FormFieldReference.cs index 3ed81fc9..b6839417 100644 --- a/server/AyaNova/biz/FormFieldReference.cs +++ b/server/AyaNova/biz/FormFieldReference.cs @@ -822,23 +822,23 @@ namespace AyaNova.Biz //WORKORDER List l = new List(); - l.Add(new FormField { TKey = "WorkOrderSummary", FieldKey = "Notes" }); - l.Add(new FormField { TKey = "WorkOrderStatus", FieldKey = "LastStatusId" }); + l.Add(new FormField { TKey = "WorkOrderSummary", ModelProperty = "Notes" }); + l.Add(new FormField { TKey = "WorkOrderStatus", ModelProperty = "LastStatusId" }); l.Add(new FormField { TKey = "Address", FieldKey = "Address" }); - l.Add(new FormField { TKey = "WorkOrderCloseByDate", FieldKey = "CompleteByDate" }); - l.Add(new FormField { TKey = "Project", FieldKey = "ProjectId" }); - l.Add(new FormField { TKey = "Contract", FieldKey = "ContractId" }); - l.Add(new FormField { TKey = "WorkOrderInvoiceNumber", FieldKey = "InvoiceNumber" }); - l.Add(new FormField { TKey = "WorkOrderServiceDate", FieldKey = "ServiceDate" }); - l.Add(new FormField { TKey = "WorkOrderCustomerContactName", FieldKey = "CustomerContactName" }); - l.Add(new FormField { TKey = "WorkOrderCustomerReferenceNumber", FieldKey = "CustomerReferenceNumber" }); - l.Add(new FormField { TKey = "WorkOrderInternalReferenceNumber", FieldKey = "InternalReferenceNumber" }); - l.Add(new FormField { TKey = "WorkOrderOnsite", FieldKey = "Onsite" }); - l.Add(new FormField { TKey = "CustomerSignature", FieldKey = "CustomerSignature" }); - l.Add(new FormField { TKey = "TechSignature", FieldKey = "TechSignature" }); - l.Add(new FormField { TKey = "Tags", FieldKey = "Tags" }); - l.Add(new FormField { TKey = "Wiki", FieldKey = "Wiki" }); - l.Add(new FormField { TKey = "Attachments", FieldKey = "Attachments", Requireable = false }); + l.Add(new FormField { TKey = "WorkOrderCloseByDate", ModelProperty = "CompleteByDate" }); + l.Add(new FormField { TKey = "Project", ModelProperty = "ProjectId" }); + l.Add(new FormField { TKey = "Contract", ModelProperty = "ContractId" }); + l.Add(new FormField { TKey = "WorkOrderInvoiceNumber", ModelProperty = "InvoiceNumber" }); + l.Add(new FormField { TKey = "WorkOrderServiceDate", ModelProperty = "ServiceDate" }); + l.Add(new FormField { TKey = "WorkOrderCustomerContactName", ModelProperty = "CustomerContactName" }); + l.Add(new FormField { TKey = "WorkOrderCustomerReferenceNumber", ModelProperty = "CustomerReferenceNumber" }); + l.Add(new FormField { TKey = "WorkOrderInternalReferenceNumber", ModelProperty = "InternalReferenceNumber" }); + l.Add(new FormField { TKey = "WorkOrderOnsite", ModelProperty = "Onsite" }); + l.Add(new FormField { TKey = "CustomerSignature" }); + l.Add(new FormField { TKey = "TechSignature" }); + l.Add(new FormField { TKey = "Tags" }); + l.Add(new FormField { TKey = "Wiki" }); + l.Add(new FormField { TKey = "Attachments", Requireable = false }); l.Add(new FormField { TKey = "WorkOrderCustom1", FieldKey = "WorkOrderCustom1", IsCustomField = true }); l.Add(new FormField { TKey = "WorkOrderCustom2", FieldKey = "WorkOrderCustom2", IsCustomField = true }); l.Add(new FormField { TKey = "WorkOrderCustom3", FieldKey = "WorkOrderCustom3", IsCustomField = true }); @@ -1102,7 +1102,7 @@ namespace AyaNova.Biz l.Add(new FormField { TKey = "Sequence", FieldKey = "WorkOrderItemSequence", TKeySection = "WorkOrderItem", Requireable = false }); l.Add(new FormField { TKey = "WorkOrderItemTechNotes", FieldKey = "WorkOrderItemTechNotes", TKeySection = "WorkOrderItem", ModelProperty = "TechNotes" }); l.Add(new FormField { TKey = "Tags", FieldKey = "WorkOrderItemTags", TKeySection = "WorkOrderItem", ModelProperty = "Tags" }); - l.Add(new FormField { TKey = "Wiki", FieldKey = "WorkOrderItemWiki", TKeySection = "WorkOrderItem", ModelProperty = "Wiki" }); + l.Add(new FormField { TKey = "Wiki", FieldKey = "WorkOrderItemWiki", TKeySection = "WorkOrderItem", ModelProperty = "Wiki", Requireable = false }); l.Add(new FormField { TKey = "Attachments", FieldKey = "WorkOrderItemAttachments", TKeySection = "WorkOrderItem", Requireable = false }); l.Add(new FormField { TKey = "WorkOrderItemWorkOrderStatusID", FieldKey = "WorkOrderItemWorkOrderStatusID", TKeySection = "WorkOrderItem", ModelProperty = "WorkOrderItemStatusId" }); l.Add(new FormField { TKey = "WorkOrderItemPriorityID", FieldKey = "WorkOrderItemPriorityID", TKeySection = "WorkOrderItem", ModelProperty = "WorkOrderItemPriorityId" }); @@ -1376,10 +1376,10 @@ namespace AyaNova.Biz l.Add(new FormField { TKey = "WorkOrderCustom16", FieldKey = "WorkOrderCustom16", IsCustomField = true }); //PM ITEM - l.Add(new FormField { TKey = "Sequence", FieldKey = "WorkOrderItemSequence", TKeySection = "WorkOrderItem", Requireable = false }); + l.Add(new FormField { TKey = "Sequence", FieldKey = "WorkOrderItemSequence", TKeySection = "WorkOrderItem", Requireable = false }); l.Add(new FormField { TKey = "WorkOrderItemTechNotes", FieldKey = "WorkOrderItemTechNotes", TKeySection = "WorkOrderItem", ModelProperty = "TechNotes" }); l.Add(new FormField { TKey = "Tags", FieldKey = "WorkOrderItemTags", TKeySection = "WorkOrderItem", ModelProperty = "Tags" }); - l.Add(new FormField { TKey = "Wiki", FieldKey = "WorkOrderItemWiki", TKeySection = "WorkOrderItem", ModelProperty = "Wiki" }); + l.Add(new FormField { TKey = "Wiki", FieldKey = "WorkOrderItemWiki", TKeySection = "WorkOrderItem", ModelProperty = "Wiki", Requireable = false }); l.Add(new FormField { TKey = "Attachments", FieldKey = "WorkOrderItemAttachments", TKeySection = "WorkOrderItem", Requireable = false }); l.Add(new FormField { TKey = "WorkOrderItemWorkOrderStatusID", FieldKey = "WorkOrderItemWorkOrderStatusID", TKeySection = "WorkOrderItem", ModelProperty = "WorkOrderItemStatusId" }); l.Add(new FormField { TKey = "WorkOrderItemPriorityID", FieldKey = "WorkOrderItemPriorityID", TKeySection = "WorkOrderItem", ModelProperty = "WorkOrderItemPriorityId" }); @@ -1416,7 +1416,7 @@ namespace AyaNova.Biz l.Add(new FormField { TKey = "WorkOrderItemOutsideServiceList", FieldKey = "WorkOrderItemOutsideServiceList", TKeySection = "WorkOrderItem", Requireable = false }); //PM ITEM UNIT - l.Add(new FormField { TKey = "WorkOrderItemUnitNotes", FieldKey = "WorkOrderItemUnitNotes", TKeySection = "WorkOrderItemUnit", ModelProperty = "Notes" }); + l.Add(new FormField { TKey = "WorkOrderItemUnitNotes", FieldKey = "WorkOrderItemUnitNotes", TKeySection = "WorkOrderItemUnit", ModelProperty = "Notes" }); l.Add(new FormField { TKey = "UnitModelVendorID", FieldKey = "UnitModelVendorID", TKeySection = "WorkOrderItemUnit", Requireable = false }); l.Add(new FormField { TKey = "UnitModelName", FieldKey = "UnitModelName", TKeySection = "WorkOrderItemUnit", Requireable = false }); l.Add(new FormField { TKey = "UnitDescription", FieldKey = "UnitDescription", TKeySection = "WorkOrderItemUnit", Requireable = false }); @@ -1442,7 +1442,7 @@ namespace AyaNova.Biz l.Add(new FormField { TKey = "WorkOrderItemUnitCustom16", FieldKey = "WorkOrderItemUnitCustom16", IsCustomField = true, TKeySection = "WorkOrderItemUnit" }); //PM ITEM SCHEDULED USER - l.Add(new FormField { TKey = "WorkOrderItemScheduledUserEstimatedQuantity", FieldKey = "WorkOrderItemScheduledUserEstimatedQuantity", TKeySection = "WorkOrderItemScheduledUser", Requireable = false }); + l.Add(new FormField { TKey = "WorkOrderItemScheduledUserEstimatedQuantity", FieldKey = "WorkOrderItemScheduledUserEstimatedQuantity", TKeySection = "WorkOrderItemScheduledUser", Requireable = false }); l.Add(new FormField { TKey = "WorkOrderItemScheduledUserServiceRateID", FieldKey = "WorkOrderItemScheduledUserServiceRateID", TKeySection = "WorkOrderItemScheduledUser", ModelProperty = "ServiceRateId" }); l.Add(new FormField { TKey = "WorkOrderItemScheduledUserStartDate", FieldKey = "WorkOrderItemScheduledUserStartDate", TKeySection = "WorkOrderItemScheduledUser", ModelProperty = "StartDate" }); l.Add(new FormField { TKey = "WorkOrderItemScheduledUserStopDate", FieldKey = "WorkOrderItemScheduledUserStopDate", TKeySection = "WorkOrderItemScheduledUser", ModelProperty = "StopDate" }); @@ -1471,7 +1471,7 @@ namespace AyaNova.Biz l.Add(new FormField { TKey = "LineTotal", FieldKey = "PartLineTotalViz", TKeySection = "WorkOrderItemPart", Requireable = false }); //PM ITEM PART REQUEST - l.Add(new FormField { TKey = "WorkOrderItemPartRequestPartID", FieldKey = "WorkOrderItemPartRequestPartID", TKeySection = "WorkOrderItemPartRequests", Requireable = false }); + l.Add(new FormField { TKey = "WorkOrderItemPartRequestPartID", FieldKey = "WorkOrderItemPartRequestPartID", TKeySection = "WorkOrderItemPartRequests", Requireable = false }); l.Add(new FormField { TKey = "WorkOrderItemPartRequestPartWarehouseID", FieldKey = "WorkOrderItemPartRequestPartWarehouseID", TKeySection = "WorkOrderItemPartRequests", Requireable = false }); l.Add(new FormField { TKey = "WorkOrderItemPartRequestQuantity", FieldKey = "WorkOrderItemPartRequestQuantity", TKeySection = "WorkOrderItemPartRequests", Requireable = false }); l.Add(new FormField { TKey = "PartUPC", FieldKey = "PartRequestPartUPC", TKeySection = "WorkOrderItemPartRequests", Requireable = false }); @@ -1500,7 +1500,7 @@ namespace AyaNova.Biz l.Add(new FormField { TKey = "LineTotal", FieldKey = "LaborLineTotalViz", TKeySection = "WorkOrderItemLabor", Requireable = false }); //PM ITEM TRAVEL - l.Add(new FormField { TKey = "WorkOrderItemTravelStartDate", FieldKey = "WorkOrderItemTravelStartDate", TKeySection = "WorkOrderItemTravel", ModelProperty = "TravelStartDate" }); + l.Add(new FormField { TKey = "WorkOrderItemTravelStartDate", FieldKey = "WorkOrderItemTravelStartDate", TKeySection = "WorkOrderItemTravel", ModelProperty = "TravelStartDate" }); l.Add(new FormField { TKey = "WorkOrderItemTravelStopDate", FieldKey = "WorkOrderItemTravelStopDate", TKeySection = "WorkOrderItemTravel", ModelProperty = "TravelStopDate" }); l.Add(new FormField { TKey = "WorkOrderItemTravelServiceRateID", FieldKey = "WorkOrderItemTravelServiceRateID", TKeySection = "WorkOrderItemTravel", ModelProperty = "TravelRateId" }); l.Add(new FormField { TKey = "WorkOrderItemTravelDetails", FieldKey = "WorkOrderItemTravelDetails", TKeySection = "WorkOrderItemTravel", ModelProperty = "TravelDetails" }); @@ -1636,18 +1636,33 @@ namespace AyaNova.Biz public class FormField { + private string tKey; + //CLIENT / SERVER Unique identifier used at BOTH client and server //MUST MATCH MODEL PROPERTY NAME EXACTLY UNLESS ModelProperty is set OR REQUIRED FIELD VALIDATION WON"T WORK + //The model name is used for validation and the fieldKey sometimes is not the model name in big forms with repeating model names in which case + //the fieldkey will be unique and the ModelProperty will be set instead public string FieldKey { get; set; } - //This exists to handle things like workorderitemtags which - //need to use a unique fieldkey but it can't match the model property becuase then + //This exists to handle scenario of repeated identical model property multiple times on workorder quote pm forms + //e.g. need to use a unique fieldkey but it can't match the model property becuase then //it would need to be "Tags" but there is already a "Tags" on the workorder header and in units - //so here we can specify an exact property tag to check + //so here we can specify an exact property tag to check. RequiredfieldsValidator will use this instead when set to issue errors public string ModelProperty { get; set; } = null; - //CLIENT Use only for display in customization form - public string TKey { get; set; } + //CLIENT Use only for display in customization form, translation key to show translated name on UI customize form + public string TKey + { + get => tKey; + set + { + tKey = value; + if (this.FieldKey == null)//save having to type out fieldkey when it's identical to tkey + { + this.FieldKey = value; + } + } + } //CLIENT Use only for display in customization form to disambiguate things like //Tags in main workorder and Tags in Workorder Item and Tags in Unit (all on same form) diff --git a/server/AyaNova/biz/RequiredFieldsValidator.cs b/server/AyaNova/biz/RequiredFieldsValidator.cs index 6ccb3dc3..fbb61aca 100644 --- a/server/AyaNova/biz/RequiredFieldsValidator.cs +++ b/server/AyaNova/biz/RequiredFieldsValidator.cs @@ -88,9 +88,11 @@ namespace AyaNova.Biz { //It's a simple property on the main object //use reflection to get the underlying value from the proposed object to be saved + //issue the error on the *Models* property name to mirror how all other server error handling and validation works + //so that client end consumes it properly (fieldkey is just for the UI and showing / hiding overall form values) object propertyValue = proposedObject.GetType().GetProperty(RequiredPropertyName).GetValue(proposedObject, null); if (propertyValue == null) - biz.AddError(ApiErrorCode.VALIDATION_CUSTOM_REQUIRED_EMPTY, FF.FieldKey); + biz.AddError(ApiErrorCode.VALIDATION_CUSTOM_REQUIRED_EMPTY, RequiredPropertyName); else { @@ -98,12 +100,12 @@ namespace AyaNova.Biz { if (((System.Collections.Generic.List)propertyValue).Count == 0) { - biz.AddError(ApiErrorCode.VALIDATION_CUSTOM_REQUIRED_EMPTY, FF.FieldKey); + biz.AddError(ApiErrorCode.VALIDATION_CUSTOM_REQUIRED_EMPTY, RequiredPropertyName); } } else if (string.IsNullOrWhiteSpace(propertyValue.ToString())) - biz.AddError(ApiErrorCode.VALIDATION_CUSTOM_REQUIRED_EMPTY, FF.FieldKey); + biz.AddError(ApiErrorCode.VALIDATION_CUSTOM_REQUIRED_EMPTY, RequiredPropertyName); } } }