From ba88450febc5ef9ddd4b20d5c34179136f562c5e Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Tue, 6 Jan 2026 10:14:09 -0500 Subject: [PATCH] feat(client): add ViewModelMappingExtensions for Core<->Client mapping Add extension methods to convert between Core and Client view models: - SearchViewModel: Core (enum Status) <-> Client (string Status) - SearchCriteria: Core (primitive lists) <-> Client (full ViewModels) - JdeUserViewModel -> OperatorViewModel Handles structural differences in criteria where Core uses primitive lists (List, List) and Client uses full objects. --- .../Extensions/ViewModelMappingExtensions.cs | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 NEW/src/JdeScoping.Client/Extensions/ViewModelMappingExtensions.cs diff --git a/NEW/src/JdeScoping.Client/Extensions/ViewModelMappingExtensions.cs b/NEW/src/JdeScoping.Client/Extensions/ViewModelMappingExtensions.cs new file mode 100644 index 0000000..d8c1bd1 --- /dev/null +++ b/NEW/src/JdeScoping.Client/Extensions/ViewModelMappingExtensions.cs @@ -0,0 +1,140 @@ +using JdeScoping.Client.Models; +using JdeScoping.Core.Models.Enums; +using JdeScoping.Core.Models.Search; +using CoreSearch = JdeScoping.Core.ViewModels.SearchViewModel; +using CoreItem = JdeScoping.Core.ViewModels.ItemViewModel; +using CoreWorkOrder = JdeScoping.Core.ViewModels.WorkOrderViewModel; +using CoreProfitCenter = JdeScoping.Core.ViewModels.ProfitCenterViewModel; +using CoreWorkCenter = JdeScoping.Core.ViewModels.WorkCenterViewModel; +using CoreLot = JdeScoping.Core.ViewModels.LotViewModel; +using CorePartOp = JdeScoping.Core.ViewModels.PartOperationViewModel; +using CoreJdeUser = JdeScoping.Core.ViewModels.JdeUserViewModel; + +namespace JdeScoping.Client.Extensions; + +/// +/// Extension methods for mapping between Core and Client view models. +/// +public static class ViewModelMappingExtensions +{ + /// + /// Maps Core SearchViewModel to Client SearchViewModel. + /// + public static SearchViewModel ToClient(this CoreSearch vm) => new() + { + Id = vm.Id, + Name = vm.Name, + UserName = vm.UserName, + Status = vm.Status.ToString(), + SubmitDt = vm.SubmitDt, + StartDt = vm.StartDt, + EndDt = vm.EndDt, + Criteria = vm.Criteria?.ToClientCriteria() ?? new() + }; + + /// + /// Maps Client SearchViewModel to Core SearchViewModel. + /// + public static CoreSearch ToCore(this SearchViewModel vm) => new() + { + Id = vm.Id, + Name = vm.Name, + UserName = vm.UserName, + Status = Enum.TryParse(vm.Status, out var status) ? status : SearchStatus.New, + SubmitDt = vm.SubmitDt, + StartDt = vm.StartDt, + EndDt = vm.EndDt, + Criteria = vm.Criteria.ToCoreCriteria() + }; + + /// + /// Maps Core SearchCriteria to Client SearchCriteriaViewModel. + /// Core uses primitive lists; Client uses full view model objects. + /// + public static SearchCriteriaViewModel ToClientCriteria(this SearchCriteria criteria) + { + var client = new SearchCriteriaViewModel + { + MinimumDt = criteria.MinimumDt, + MaximumDt = criteria.MaximumDt, + ExtractMisData = criteria.ExtractMisData + }; + + // Map work orders (Core has just numbers, Client has full WorkOrderViewModel) + client.WorkOrders = criteria.WorkOrderNumbers + .Select(n => new CoreWorkOrder { WorkOrderNumber = n }) + .ToList(); + + // Map items (Core has just item number strings, Client has full ItemViewModel) + client.Items = criteria.ItemNumbers + .Select(n => new CoreItem { ItemNumber = n }) + .ToList(); + + // Map profit centers (Core has just code strings, Client has full ProfitCenterViewModel) + client.ProfitCenters = criteria.ProfitCenters + .Select(pc => new CoreProfitCenter { Code = pc }) + .ToList(); + + // Map work centers (Core has just code strings, Client has full WorkCenterViewModel) + client.WorkCenters = criteria.WorkCenters + .Select(wc => new CoreWorkCenter { Code = wc }) + .ToList(); + + // Map operators (Core has just user ID strings, Client has full OperatorViewModel) + client.Operators = criteria.OperatorIDs + .Select(id => new OperatorViewModel { UserId = id }) + .ToList(); + + // Map component lots (Core uses LotViewModel, Client uses ComponentLotViewModel) + client.ComponentLots = criteria.ComponentLotNumbers + .Select(l => new ComponentLotViewModel { LotNumber = l.LotNumber, ItemNumber = l.ItemNumber }) + .ToList(); + + // Map part operations (both use PartOperationViewModel from Core) + client.PartOperations = criteria.PartOperations.ToList(); + + return client; + } + + /// + /// Maps Client SearchCriteriaViewModel to Core SearchCriteria. + /// Client uses full view model objects; Core uses primitive lists. + /// + public static SearchCriteria ToCoreCriteria(this SearchCriteriaViewModel criteria) => new() + { + MinimumDt = criteria.MinimumDt, + MaximumDt = criteria.MaximumDt, + ExtractMisData = criteria.ExtractMisData, + WorkOrderNumbers = criteria.WorkOrders.Select(wo => wo.WorkOrderNumber).ToList(), + ItemNumbers = criteria.Items.Select(i => i.ItemNumber).ToList(), + ProfitCenters = criteria.ProfitCenters.Select(pc => pc.Code).ToList(), + WorkCenters = criteria.WorkCenters.Select(wc => wc.Code).ToList(), + OperatorIDs = criteria.Operators.Select(o => o.UserId).ToList(), + ComponentLotNumbers = criteria.ComponentLots + .Select(l => new CoreLot { LotNumber = l.LotNumber, ItemNumber = l.ItemNumber }) + .ToList(), + PartOperations = criteria.PartOperations.ToList() + }; + + /// + /// Maps Core JdeUserViewModel to Client OperatorViewModel. + /// + public static OperatorViewModel ToClientOperator(this CoreJdeUser vm) => new() + { + AddressNumber = (int)vm.AddressNumber, + UserId = vm.UserId, + FullName = vm.FullName + }; + + /// + /// Maps a collection of Core SearchViewModels to Client SearchViewModels. + /// + public static List ToClientList(this IEnumerable list) => + list.Select(s => s.ToClient()).ToList(); + + /// + /// Maps a collection of Core JdeUserViewModels to Client OperatorViewModels. + /// + public static List ToClientOperatorList(this IEnumerable list) => + list.Select(u => u.ToClientOperator()).ToList(); +}