/// <summary> /// Performs the drop operation for a <see cref="RequirementsGroup"/> payload /// </summary> /// <param name="requirementGroup"> /// The <see cref="RequirementsGroup"/> that was dropped into this <see cref="RequirementsGroup"/> /// </param> /// <param name="dropInfo">The <see cref="IDropInfo"/></param> private async Task OnRequirementGroupDrop(RequirementsGroup requirementGroup, IDropInfo dropInfo) { if (dropInfo.KeyStates == (DragDropKeyStates.LeftMouseButton | DragDropKeyStates.ControlKey)) { // ordered-move var model = (EngineeringModel)this.Thing.TopContainer; var orderPt = OrderHandlerService.GetOrderParameterType(model); if (orderPt == null) { return; } var orderService = new RequirementsGroupOrderHandlerService(this.Session, orderPt); var transaction = orderService.Insert(requirementGroup, this.Thing, dropInfo.IsDroppedAfter ? InsertKind.InsertAfter : InsertKind.InsertBefore); await this.Session.Write(transaction.FinalizeTransaction()); } else { var context = TransactionContextResolver.ResolveContext(this.Thing); var transaction = new ThingTransaction(context); var previousRequirementSpec = requirementGroup.GetContainerOfType <RequirementsSpecification>(); var currentRequirementSpec = this.Thing.GetContainerOfType <RequirementsSpecification>(); // Add this RequirementGroup to the RequirementGroup represented by this RowViewModel var requirementGroupClone = requirementGroup.Clone(false); var containerRequirementGroupClone = this.Thing.Clone(false); containerRequirementGroupClone.Group.Add(requirementGroupClone); transaction.CreateOrUpdate(containerRequirementGroupClone); if (previousRequirementSpec != currentRequirementSpec) { // Update the requirements that were inside any of the groups that have been dropped var previousRequirementSpecRow = (RequirementsSpecificationRowViewModel) ((RequirementsBrowserViewModel)this.TopParentRow.ContainerViewModel).ReqSpecificationRows .Single(x => x.Thing == previousRequirementSpec); var droppedRequirementGroups = requirementGroup.ContainedGroup().ToList(); droppedRequirementGroups.Add(requirementGroup); foreach (var keyValuePair in previousRequirementSpecRow.requirementContainerGroupCache) { if (!droppedRequirementGroups.Contains(keyValuePair.Value)) { continue; } var requirementClone = keyValuePair.Key.Clone(false); requirementClone.Group = null; transaction.CreateOrUpdate(requirementClone); } } await this.DalWrite(transaction); } }
/// <summary> /// Performs the drop operation for a <see cref="RequirementsGroup"/> payload /// </summary> /// <param name="requirementGroupPayload"> /// The <see cref="RequirementsGroup"/> that was dropped into this <see cref="RequirementsSpecification"/> /// </param> private async Task OnRequirementGroupDrop(RequirementsGroup requirementGroupPayload) { var firstRow = this.ContainedRows.OfType <RequirementsGroupRowViewModel>().FirstOrDefault(); if (firstRow == null) { var context = TransactionContextResolver.ResolveContext(this.Thing); var transaction = new ThingTransaction(context); var previousRequirementSpec = requirementGroupPayload.GetContainerOfType <RequirementsSpecification>(); // Add the RequirementGroup to the RequirementsSpecification represented by this RowViewModel var requirementsSpecificationClone = this.Thing.Clone(false); requirementsSpecificationClone.Group.Add(requirementGroupPayload); transaction.CreateOrUpdate(requirementsSpecificationClone); if (previousRequirementSpec != this.Thing) { // Update the requirements that were inside any of the groups that have been dropped var previousRequirementSpecRow = (RequirementsSpecificationRowViewModel)((RequirementsBrowserViewModel)this.ContainerViewModel) .ReqSpecificationRows.Single(x => x.Thing == previousRequirementSpec); var droppedRequirementGroups = requirementGroupPayload.ContainedGroup().ToList(); droppedRequirementGroups.Add(requirementGroupPayload); foreach (var keyValuePair in previousRequirementSpecRow.requirementContainerGroupCache) { if (!droppedRequirementGroups.Contains(keyValuePair.Value)) { continue; } var requirementClone = keyValuePair.Key.Clone(false); requirementClone.Group = null; transaction.CreateOrUpdate(requirementClone); } } await this.DalWrite(transaction); } else { // insert before first var model = (EngineeringModel)this.Thing.TopContainer; var orderPt = OrderHandlerService.GetOrderParameterType(model); if (orderPt == null) { return; } var orderService = new RequirementsGroupOrderHandlerService(this.Session, orderPt); var transaction = orderService.Insert(requirementGroupPayload, firstRow.Thing, InsertKind.InsertBefore); await this.Session.Write(transaction.FinalizeTransaction()); } }
public void TestInsertBeforeWithMissingOrderValue() { var service = new RequirementsGroupOrderHandlerService(this.session.Object, this.orderType); var transaction = service.Insert(this.grp3, this.grp4, InsertKind.InsertBefore); var added = transaction.AddedThing.ToList(); var updated = transaction.UpdatedThing.ToList(); Assert.AreEqual(2, added.OfType <RequirementsContainerParameterValue>().Count()); Assert.AreEqual(3, updated.Count); var gr3Clone = (RequirementsGroup)updated.Single(x => x.Key.Iid == this.grp3.Iid).Value; var orderGr3 = (RequirementsContainerParameterValue)added.Single(x => gr3Clone.ParameterValue.Contains(x)); var gr4Clone = (RequirementsGroup)updated.Single(x => x.Key.Iid == this.grp4.Iid).Value; var orderGr4 = (RequirementsContainerParameterValue)added.Single(x => gr4Clone.ParameterValue.Contains(x)); var grp1Clone = (RequirementsGroup)updated.Single(x => x.Key.Iid == this.grp1.Iid).Value; Assert.IsTrue(int.Parse(orderGr4.Value[0]) > int.Parse(orderGr3.Value[0])); Assert.IsTrue(grp1Clone.Group.Contains(gr3Clone)); }