From bed61324d69bf70d36eb201fda3ae938d66b5107 Mon Sep 17 00:00:00 2001 From: mschill Date: Mon, 20 Jan 2025 14:43:54 -0500 Subject: [PATCH] C2025-003 Enhanced Copy/Paste Upgrade - Add ability to copy/paste over enhanced master documents --- .../Extension/ItemInsertExt.cs | 221 ++++++++++++------ .../Volian.Controls.Library/StepTabRibbon.cs | 21 +- 2 files changed, 150 insertions(+), 92 deletions(-) diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ItemInsertExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ItemInsertExt.cs index 9838ca98..5d39a5e0 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/ItemInsertExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ItemInsertExt.cs @@ -2650,97 +2650,174 @@ namespace VEPROMS.CSLA.Library firstTrans = false; if (!CanDeleteObject()) throw new System.Security.SecurityException("User not authorized to remove a Item"); - // B2016-009 check source and desintation types and display message box if needed + // B2016-009 check source and destination types and display message box if needed // C2022-017 moved the CheckSourceDestinationType call to btnPasteReplace_Click in StepTabRibbon // B2023-101 Handle Paste Replace when procedure to be replaced has Incoming Transitions, i.e. do a separate try/catch for this case ItemInfo newItemInfo = null; - try + using (ItemInfo copyItemInfo = ItemInfo.Get(copyStartID)) { - // C2017-031: Support for paste/replace an enhanced step, if this is replacing enhanced, do a specific query - if (itemInfo.IsEnhancedStep) + try { - newItemInfo = ItemInfo.CopyPasteReplaceEnhancedItemInfoFetch(copyStartID, itemInfo); - if (newItemInfo == null) return null; + // C2017-031: Support for paste/replace an enhanced step, if this is replacing enhanced, do a specific query + if (itemInfo.IsEnhancedStep) + { + newItemInfo = ItemInfo.CopyPasteReplaceEnhancedItemInfoFetch(copyStartID, itemInfo); + if (newItemInfo == null) return null; + } + //C2025-003 Enhanced Copy/Paste Upgrade - Added support for paste/replace on a master step + else if (itemInfo.HasEnhancedLinkedStep || copyItemInfo.HasEnhancedLinkedStep) + { + DialogResult rslt = DialogResult.No; + + SectionConfig secCfg = itemInfo.ActiveSection.MyConfig as SectionConfig; + if (copyItemInfo.HasEnhancedLinkedStep && secCfg.MyEnhancedDocuments.Count > 0) + rslt = FlexibleMessageBox.Show("The step you are copying contains linked background documents." + + "\r\n\r\nDo you also wish to make a copy of the background documents?", + "Paste background documents", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + //unlink and remove any background documents attached to where you are copying to + //and then delete them + //if selected want to replace BG step (DialogResult.Yes) + if (itemInfo.HasEnhancedLinkedStep && rslt == DialogResult.Yes) + { + foreach (EnhancedDocument ed in itemInfo.GetMyEnhancedDocuments()) + { + using (ItemInfo exEnh = ItemInfo.Get(ed.ItemID)) + { + exEnh.DoUnlinkEnhanced(exEnh, 0, false); + DeleteItemAndChildren(exEnh); + } + + } + } + + //do copy/paste replace of the master step + newItemInfo = ItemInfo.CopyPasteReplaceItemInfoFetch(copyStartID, itemInfo); + if (newItemInfo == null) return null; + + //copy any background documents + //if selected want to replace BG step (DialogResult.Yes) + if (copyItemInfo.HasEnhancedLinkedStep && rslt == DialogResult.Yes) + { + foreach (EnhancedDocument ed in copyItemInfo.GetMyEnhancedDocuments()) + { + using (ItemInfo exEnh = newItemInfo.DoAddMissingEnhancedItems(ed.Type)) + { + PasteReplace(exEnh, ed.ItemID, chgid, ref firstTrans); + } + + } + } + else if (rslt == DialogResult.No) + { + //if selected didn't want to copy BG documents (DialogResult.No) + //need to unlink BG doc from old removed content (what was pasted over top of) + //re-link BG document to new paste replace master doc + //this should also auto update the text of the main linked item + //to match the new master doc wording + + //get original BG documents + EnhancedDocuments orig_eds = itemInfo.GetMyEnhancedDocuments(); + + //remove link from pre-existing BG docs + foreach (EnhancedDocument ed in orig_eds) + { + using (ItemInfo exEnh = ItemInfo.Get(ed.ItemID)) + { exEnh.DoUnlinkEnhanced(exEnh, 0, false); } + } + + //remove link from steps just copied + ItemInfo.PasteClearEnhanced(newItemInfo); + + //re-link pre-existing BG docs to newly replaced master step + foreach (EnhancedDocument ed in orig_eds) + { + using (ItemInfo orig_ed_item = ItemInfo.Get(ed.ItemID)) + { newItemInfo.DoCreateLinksEnhancedSingleItem(orig_ed_item, ed.Type); } + } + + } + } + else + { + newItemInfo = ItemInfo.CopyPasteReplaceItemInfoFetch(copyStartID, itemInfo); if (newItemInfo == null) return null; + } } - else + catch (Exception ex1) { - newItemInfo = ItemInfo.CopyPasteReplaceItemInfoFetch(copyStartID, itemInfo); if (newItemInfo == null) return null; - } - } - catch (Exception ex1) - { - if (ex1.Message.Contains("has External Transitions and has no next step") + if (ex1.Message.Contains("has External Transitions and has no next step") || ex1.Message.Contains("has External Transitions to Procedure") || ex1.Message.Contains("has External Transitions to it's children")) - { - FlexibleMessageBox.Show("This procedure has external transition references to it that must be resolved before doing the Paste/Replace.\r\nRight Click on the procedure and select the Incoming Transitions menu option to find these references and resolve them.", "Paste Replace Failed", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); - return null; + { + FlexibleMessageBox.Show("This procedure has external transition references to it that must be resolved before doing the Paste/Replace.\r\nRight Click on the procedure and select the Incoming Transitions menu option to find these references and resolve them.", "Paste Replace Failed", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); + return null; + } } - } - try - { - // Delete business objects, including remove from tree - ItemInfo.DeleteItemInfoAndChildren(itemInfo.ItemID); // Dispose ItemInfo and Children - using (Item item = Get(newItemInfo.ItemID)) ItemInfo.Refresh(item); - ItemInfo.PasteSetChangeId(newItemInfo, chgid); - ItemInfo.PasteClearEnhanced(newItemInfo); - if (newItemInfo.NextItem != null) using (Item item = newItemInfo.NextItem.Get()) ItemInfo.Refresh(item); - newItemInfo.RefreshNextItems(); - // if inserting after a caution or note, refreshes tabs. This will adjust bullets - // of any previous cautions or notes. - if (newItemInfo.IsCaution || newItemInfo.IsNote) newItemInfo.ResetOrdinal(); - newItemInfo.UpdateTransitionText(); - newItemInfo.UpdateROText(); - newItemInfo.UpdatePastedStepTransitionText(); + try + { + // Delete business objects, including remove from tree + ItemInfo.DeleteItemInfoAndChildren(itemInfo.ItemID); // Dispose ItemInfo and Children + using (Item item = Get(newItemInfo.ItemID)) ItemInfo.Refresh(item); + ItemInfo.PasteSetChangeId(newItemInfo, chgid); + if (!copyItemInfo.HasEnhancedLinkedStep && !itemInfo.HasEnhancedLinkedStep) ItemInfo.PasteClearEnhanced(newItemInfo); + if (newItemInfo.NextItem != null) using (Item item = newItemInfo.NextItem.Get()) ItemInfo.Refresh(item); + newItemInfo.RefreshNextItems(); + // if inserting after a caution or note, refreshes tabs. This will adjust bullets + // of any previous cautions or notes. + if (newItemInfo.IsCaution || newItemInfo.IsNote) newItemInfo.ResetOrdinal(); + newItemInfo.UpdateTransitionText(); + newItemInfo.UpdateROText(); + newItemInfo.UpdatePastedStepTransitionText(); - // Add to tree - if (newItemInfo.NextItem != null) - { - using (ItemInfo itm = ItemInfo.GetNonCached(newItemInfo.NextItem.ItemID)) + // Add to tree + if (newItemInfo.NextItem != null) { - itm.OnNewSiblingBefore(new ItemInfoInsertEventArgs(newItemInfo, ItemInfo.EAddpingPart.Before)); + using (ItemInfo itm = ItemInfo.GetNonCached(newItemInfo.NextItem.ItemID)) + { + itm.OnNewSiblingBefore(new ItemInfoInsertEventArgs(newItemInfo, ItemInfo.EAddpingPart.Before)); + } } - } - else if (newItemInfo.PreviousID != null) - { - using (ItemInfo itm2 = ItemInfo.GetNonCached((int)newItemInfo.PreviousID)) + else if (newItemInfo.PreviousID != null) { - itm2.OnNewSiblingAfter(new ItemInfoInsertEventArgs(newItemInfo, ItemInfo.EAddpingPart.After)); + using (ItemInfo itm2 = ItemInfo.GetNonCached((int)newItemInfo.PreviousID)) + { + itm2.OnNewSiblingAfter(new ItemInfoInsertEventArgs(newItemInfo, ItemInfo.EAddpingPart.After)); + } } + else + { + // B2024-045, 049 and 050: if not a single procedure replace, update user interface by using the 'OnNewChild'. Single + // procedure's MyParent is null because its parent is a working draft (docversion) since MyParent's type is iteminfo. + // For the single procedure case, the user interface code in vlntreeview will update the tree. + if (newItemInfo.MyParent != null) + newItemInfo.MyParent.OnNewChild(new ItemInfoInsertEventArgs(newItemInfo, ItemInfo.EAddpingPart.Child)); + } + return newItemInfo; } - else + catch (Exception ex) { - // B2024-045, 049 and 050: if not a single procedure replace, update user interface by using the 'OnNewChild'. Single - // procedure's MyParent is null because its parent is a working draft (docversion) since MyParent's type is iteminfo. - // For the single procedure case, the user interface code in vlntreeview will update the tree. - if (newItemInfo.MyParent != null) - newItemInfo.MyParent.OnNewChild(new ItemInfoInsertEventArgs(newItemInfo, ItemInfo.EAddpingPart.Child)); + ItemInfo iii = itemInfo.HandleSqlExceptionOnDelete(ex); + if (iii == itemInfo) return null;// If self returned then return null + if (iii != null) + { + firstTrans = true; // B2017-179 set the firstTrans to true and return the itminfo of the first transition location that needs resolved + return iii; + } + if (!HandleSqlExceptionOnCopy(ex)) + { + if (ex.Message.Contains("has External Transitions and has no next step") + || ex.Message.Contains("has External Transitions to Procedure") + || ex.Message.Contains("has External Transitions to it's children") + || ex.Message.Contains("This step has been deleted")) + throw ex; + + FlexibleMessageBox.Show("Details were written to the Error Log.", "Paste Replace Failed", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); + return itemInfo; + } + else + return itemInfo; } - return newItemInfo; - } - catch (Exception ex) - { - ItemInfo iii = itemInfo.HandleSqlExceptionOnDelete(ex); - if (iii == itemInfo) return null;// If self returned then return null - if (iii != null) - { - firstTrans = true; // B2017-179 set the firstTrans to true and return the itminfo of the first transition location that needs resolved - return iii; - } - if (!HandleSqlExceptionOnCopy(ex)) - { - if (ex.Message.Contains("has External Transitions and has no next step") - || ex.Message.Contains("has External Transitions to Procedure") - || ex.Message.Contains("has External Transitions to it's children") - || ex.Message.Contains("This step has been deleted") - ) - throw ex; - FlexibleMessageBox.Show("Details were written to the Error Log.", "Paste Replace Failed", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); - return itemInfo; - } - else - return itemInfo; } } #endregion diff --git a/PROMS/Volian.Controls.Library/StepTabRibbon.cs b/PROMS/Volian.Controls.Library/StepTabRibbon.cs index ba65b348..9834448d 100644 --- a/PROMS/Volian.Controls.Library/StepTabRibbon.cs +++ b/PROMS/Volian.Controls.Library/StepTabRibbon.cs @@ -1806,7 +1806,7 @@ namespace Volian.Controls.Library //B20170-158 Don't allow a step to replace a linked step //B2017-180: The fix for B2017-158 also needed the 'HasEnhancedLinkedStep' to check if the copied step is a source step // C2017-031: Support for paste/replace an enhanced step, enable button - btnPasteReplace.Enabled = btnCMPasteReplace.Enabled = enable && ((!MyItemInfo.IsEnhancedStep && !MyItemInfo.HasEnhancedLinkedStep) || (MyItemInfo.IsEnhancedStep)); + btnPasteReplace.Enabled = btnCMPasteReplace.Enabled = enable; } private void SetPasteButtonEnabled() { @@ -1866,25 +1866,6 @@ namespace Volian.Controls.Library if (stepToCfg.MyEnhancedDocuments != null && stepToCfg.MyEnhancedDocuments.Count > 0 && stepToCfg.MyEnhancedDocuments[0].Type != 0) toSourceHasEnhancedLinks = true; } } - // enhanced: if 'from' step is not enhanced, only allow paste before/after - if (MyItemInfo.IsHigh && !MyItemInfo.IsEnhancedStep) - { - stepToCfg = MyItemInfo.MyConfig as StepConfig; - if (stepToCfg.MyEnhancedDocuments != null && stepToCfg.MyEnhancedDocuments.Count > 0 && stepToCfg.MyEnhancedDocuments[0].Type != 0) - { - // Current selected step is source (i.e. has enhanced links to enhanced steps) - // check if 'from' step is non. If so, allow paste before/after but not replace - if (tmp.MyDisplayTabControl.MyCopyStep.IsHigh) - { - StepConfig fromCfg = tmp.MyDisplayTabControl.MyCopyStep.MyConfig as StepConfig; - if (fromCfg != null && (fromCfg.MyEnhancedDocuments==null || fromCfg.MyEnhancedDocuments.Count==0)) - { - btnPasteReplace.Enabled = btnCMPasteReplace.Enabled = false; - return; - } - } - } - } //copy item is high level step // Allow a High Level step to be pasted to a sub-step, but not to a table, figure, section or procedure type if (tmp.MyDisplayTabControl.MyCopyStep.IsHigh && (MyItemInfo.IsTable || MyItemInfo.IsFigure || MyItemInfo.IsSection || MyItemInfo.IsProcedure)) -- 2.47.2