From f9738451dba12929a4bb77263190ecf4d3724301 Mon Sep 17 00:00:00 2001 From: mschill Date: Mon, 23 Feb 2026 15:25:32 -0500 Subject: [PATCH] C2026-010 Add Audit History to Setting Change Bars --- PROMS/VEPROMS User Interface/PROMSFixes.Sql | 159 +++++++++++++++++- .../dlgApproveProcedure.cs | 16 +- .../dlgSetChangeBarStartDate.cs | 33 +++- .../frmVEPROMS.Designer.cs | 2 +- .../Minimal/ChangeBarAuditHistory.cs | 72 ++++++++ .../VEPROMS.CSLA.Library.csproj | 1 + .../Volian.Controls.Library/DisplayHistory.cs | 44 ++++- .../DisplayHistory.designer.cs | Bin 47916 -> 54536 bytes .../DisplayHistory.resx | 3 + 9 files changed, 313 insertions(+), 17 deletions(-) create mode 100644 PROMS/VEPROMS.CSLA.Library/Minimal/ChangeBarAuditHistory.cs diff --git a/PROMS/VEPROMS User Interface/PROMSFixes.Sql b/PROMS/VEPROMS User Interface/PROMSFixes.Sql index 93ef133c..4d6b672e 100644 --- a/PROMS/VEPROMS User Interface/PROMSFixes.Sql +++ b/PROMS/VEPROMS User Interface/PROMSFixes.Sql @@ -24578,6 +24578,161 @@ IF (@@Error = 0) PRINT 'Procedure Creation: [GetCurrentApprovedRevisions] Succee ELSE PRINT 'Procedure Creation: [GetCurrentApprovedRevisions] Error on Creation' GO + +/* +========================================================================================================== +-- Begin: C2026-010 Add Audit Ability for ChangeBars +-- Author: Matthew Schill +-- Create date: 02/17/2026 +========================================================================================================== +*/ + /* + ---------------------------------------------------------------------------------- + Tables: + ---------------------------------------------------------------------------------- + [ChangeBarAudits] + + ---------------------------------------------------------------------------------- + Indexes: + ---------------------------------------------------------------------------------- + [IX_ChangeBarAudits_ItemID] on [dbo].[ChangeBarAudits] + + + + */ + + + IF Not Exists(SELECT * FROM sys.objects Where name = 'ChangeBarAudits' AND type in (N'U')) + Begin + + SET ANSI_NULLS ON + SET QUOTED_IDENTIFIER ON + + /****** Create Table to hold Audit Information ******/ + CREATE TABLE [dbo].[ChangeBarAudits]( + [AuditID] [bigint] IDENTITY(1,1) NOT NULL, + [ItemID] [bigint] NOT NULL, + [Text] [nvarchar](max) NULL, + [DTS] [datetime] NOT NULL, + [UserID] [nvarchar](100) NOT NULL, + [UnitIndex] [int] NULL, + CONSTRAINT [PK_ChangeBarAudits] PRIMARY KEY CLUSTERED + ( + [AuditID] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + + IF (@@Error = 0) PRINT 'Table Creation: [ChangeBarAudits] Succeeded' + ELSE PRINT 'Table Creation: [ChangeBarAudits] Error on Creation' + + /****** Table was not previously created - so intially populate with info from Approvals ******/ + INSERT into ChangeBarAudits([ItemID],[Text],[DTS],[UserID],[UnitIndex]) + select --rr.RevisionID, + rr.ItemID, + Text = CASE WHEN r1.value('@Index','int') <> 0 AND UnitName IS NOT NULL THEN + '(Unit ' + UnitName + ') ' + ELSE + '' + END + + 'Approved by (' + rr.UserID + ') on (' + + CAST(rr.DTS AS VARCHAR) + ')', + rr.DTS, + rr.UserID, + UnitIndex = r1.value('@Index','int') + -- , UnitName + from revisions rr + inner join versions vv on rr.revisionid = vv.revisionid + inner join stages ss on vv.stageid = ss.stageid + outer apply rr.config.nodes('Config/Applicability') t1(r1) + outer apply + ( Select r2.value('@Name','varchar') UnitName + FROM + (select DocVerSions.ItemID, cast(config as xml) xconfig from DocVersions + inner join + vefn_AllSiblingItems(rr.ItemID) Sib ON DocVerSions.ItemID = Sib.ItemID) SDV + cross apply + xconfig.nodes('Config/Slaves/Slave') t2(r2) + WHERE r2.value('@index','varchar') = r1.value('@Index','int') + ) UN + where ss.isapproved = 1 + order by rr.ItemID, rr.RevisionID desc + + IF (@@Error = 0) PRINT '[ChangeBarAudits] Initial Population Succeeded' + ELSE PRINT '[ChangeBarAudits] Initial Population Error' + + /****** Create Index to get ChangeBar Audit Information for Item (ItemID = ProcedureID) ******/ + CREATE NONCLUSTERED INDEX [IX_ChangeBarAudits_ItemID] ON [dbo].[ChangeBarAudits] + ( + [ItemID] ASC + ) + INCLUDE ([AuditID], [Text], [DTS], [UnitIndex]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + IF (@@Error = 0) PRINT 'Index Creation: [IX_ChangeBarAudits_ItemID] Succeeded' + ELSE PRINT 'Index Creation: [IX_ChangeBarAudits_ItemID] Error on Creation' + + End + + -- ============================================= + -- Description: Gets ChangeBar Audit History by item + -- ============================================= + IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[GetChangeBarAuditHistoryByItem]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1) + DROP PROCEDURE [GetChangeBarAuditHistoryByItem]; + + GO + + CREATE PROCEDURE [dbo].[GetChangeBarAuditHistoryByItem] + ( + @ItemID AS bigint + ) + AS + BEGIN + Select * FROM ChangeBarAudits where ItemID = @ItemID + order by DTS desc + + RETURN + END + + IF (@@Error = 0) PRINT 'Procedure Creation: [GetChangeBarAuditHistoryByItem] Succeeded' + ELSE PRINT 'Procedure Creation: [GetChangeBarAuditHistoryByItem] Error on Creation' + GO + + -- ============================================= + -- Description: Adds ChangeBar Audit History + -- ============================================= + IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[AddChangeBarAuditHistory]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1) + DROP PROCEDURE [AddChangeBarAuditHistory]; + + GO + + CREATE PROCEDURE [dbo].[AddChangeBarAuditHistory] + ( + @ItemID AS bigint, + @Description As nvarchar(max), + @DTS AS Datetime, + @UserID As nvarchar(100), + @UnitIndex AS bigint = NULL + ) + AS + BEGIN + + INSERT into ChangeBarAudits([ItemID],[Text],[DTS],[UserID],[UnitIndex]) + VALUES (@ItemID, @Description, @DTS, @UserID, @UnitIndex) + + RETURN + END + + IF (@@Error = 0) PRINT 'Procedure Creation: [AddChangeBarAuditHistory] Succeeded' + ELSE PRINT 'Procedure Creation: [AddChangeBarAuditHistory] Error on Creation' + GO + +/* +========================================================================================================== +-- End: C2026-010 Add Audit Ability for ChangeBars +========================================================================================================== +*/ + + /* --------------------------------------------------------------------------- | ADD New Code Before this Block | @@ -24611,8 +24766,8 @@ BEGIN TRY -- Try Block DECLARE @RevDate varchar(255) DECLARE @RevDescription varchar(255) - set @RevDate = '02/09/2026 7:00 AM' - set @RevDescription = 'Added procedure for getting current revisions' + set @RevDate = '02/18/2026 7:00 AM' + set @RevDescription = 'Added Audit Ability for ChangeBars' Select cast(@RevDate as datetime) RevDate, @RevDescription RevDescription PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription diff --git a/PROMS/VEPROMS User Interface/dlgApproveProcedure.cs b/PROMS/VEPROMS User Interface/dlgApproveProcedure.cs index 0dd507e5..c554aef5 100644 --- a/PROMS/VEPROMS User Interface/dlgApproveProcedure.cs +++ b/PROMS/VEPROMS User Interface/dlgApproveProcedure.cs @@ -1135,6 +1135,7 @@ namespace VEPROMS ViewPDF = ViewPDF && MyProcedures.Count == 1; StringBuilder sb = new StringBuilder(); StageInfo nsi = StageInfo.GetJustStage(RevStage); + DateTime now = DateTime.Now; //using variable so dates are consistent foreach (ApprovalProcedure ap in MyProcedures) //spin thru looking for updating current revision { // ric: current revision info record, not new one being created. @@ -1207,7 +1208,7 @@ namespace VEPROMS cfg.History_StartDate = myDTS; // if there is a slave, date found from above code cfg.Applicability_Index = ap.ProcInfo.MyDocVersion.DocVersionConfig.SelectedSlave; //cfg.Save(); - revision = Revision.MakeRevision(pi.ItemID, RevType, ap.RevNumber, ap.RevDate, RevNote, cfg.ToString(), DateTime.Now, Volian.Base.Library.VlnSettings.UserID); + revision = Revision.MakeRevision(pi.ItemID, RevType, ap.RevNumber, ap.RevDate, RevNote, cfg.ToString(), now, Volian.Base.Library.VlnSettings.UserID); // revision.MyConfig.History_StartDate = pi.DTS; // revision.MyConfig.Save(); // revision = revision.Save(); @@ -1234,7 +1235,7 @@ namespace VEPROMS RevisionConfig cfg = new RevisionConfig(); cfg.History_StartDate = pi.DTS; // todo: this should probably be myDTS, found during fix of B2019-051. //cfg.Save(); - revision = Revision.MakeRevision(pi.ItemID, RevType, ap.RevNumber, ap.RevDate, RevNote, cfg.ToString(), DateTime.Now, Volian.Base.Library.VlnSettings.UserID); + revision = Revision.MakeRevision(pi.ItemID, RevType, ap.RevNumber, ap.RevDate, RevNote, cfg.ToString(), now, Volian.Base.Library.VlnSettings.UserID); // revision.MyConfig.History_StartDate = pi.DTS; // revision.MyConfig.Save(); // revision = revision.Save(); @@ -1253,7 +1254,7 @@ namespace VEPROMS byte[] summaryBuf = null; //B2017-149 Allow the user to choose if they want the Summary of Changes report created during the approval process if (doSumChg) summaryBuf = CreateSummary(ref pi, summaryPDF, myDTS); - DateTime currentDTS = DateTime.Now; + DateTime currentDTS = now; Check check = Check.MakeCheck(revision, Stage.GetJustStage(RevStage), RevisionInfo.BuildRevisionChecks(pi), currentDTS, VlnSettings.UserID); //make pdf with promsprinter and get byte stream // Moved to end so that Item and Content are saved at the same time @@ -1319,10 +1320,13 @@ namespace VEPROMS version.ApprovedXML = xd.OuterXml; version.Save(); dlg.Dispose(); - UpdateProcedureConfig(pi, ap.RevNumber, ap.RevDate, DateTime.Now, selectedSlave); + UpdateProcedureConfig(pi, ap.RevNumber, ap.RevDate, now, selectedSlave); - // Clear the change bar override for this procedure: - pi.ClearChangeBarOverrides(); + //CSM - C2026-010 - Add Audit Record for Change Bar Audit History + ChangeBarAuditHistory.AddAudit(pi.ItemID, $"{(selectedSlave > 0 ? $"(Unit {pi.MyDocVersion.UnitNames[selectedSlave - 1]}) " : "")}Approved by ({VlnSettings.UserID}) on ({now})", now, VlnSettings.UserID, selectedSlave); + + // Clear the change bar override for this procedure: + pi.ClearChangeBarOverrides(); //B2019-140 Change bars do not get refreshed when approval is run. ProcedureInfo newproc = ItemInfo.ResetProcedure(pi.ItemID); diff --git a/PROMS/VEPROMS User Interface/dlgSetChangeBarStartDate.cs b/PROMS/VEPROMS User Interface/dlgSetChangeBarStartDate.cs index c574c293..a9ba9321 100644 --- a/PROMS/VEPROMS User Interface/dlgSetChangeBarStartDate.cs +++ b/PROMS/VEPROMS User Interface/dlgSetChangeBarStartDate.cs @@ -1,8 +1,10 @@ using System; +using System.Collections.Generic; using System.Data; using System.Text; using System.Windows.Forms; using VEPROMS.CSLA.Library; +using Volian.Base.Library; using Volian.Controls.Library; namespace VEPROMS @@ -29,7 +31,7 @@ namespace VEPROMS { cbdt = DateTime.Now.ToString("MM/dd/yyyy") + " " + DateTime.Now.ToString("HH:mm:ss"); dateTimeInput1.Value = DateTime.Parse(cbdt); - return; + return; } else { @@ -64,10 +66,14 @@ namespace VEPROMS private void btnOK_Click(object sender, EventArgs e) { MyProcConfig.Print_ChangeBarDate = dateTimeInput1.Value.ToString("MM/dd/yyyy HH:mm:ss");// ("MM/dd/yyyy HH:mm:ss"); - } + + //CSM - C2026-010 - Add Audit Record for Change Bar Audit History + ChangeBarAuditHistory.AddAudit(MyProcInfo.ItemID, $"Set ChangeBars set to ({ dateTimeInput1.Value.ToString("MM/dd/yyyy HH:mm:ss")}) by ({ VlnSettings.UserID}) on ({DateTime.Now})", DateTime.Now, VlnSettings.UserID, 0); + + } - private void btnNow_Click(object sender, EventArgs e) + private void btnNow_Click(object sender, EventArgs e) { dateTimeInput1.Value = DateTime.Now; } @@ -84,11 +90,16 @@ namespace VEPROMS { MyProcConfig.Print_ChangeBarDate = ""; DialogResult = DialogResult.OK; + + //CSM - C2026-010 - Add Audit Record for Change Bar Audit History + ChangeBarAuditHistory.AddAudit(MyProcInfo.ItemID, $"Reset ChangeBars performed by ({VlnSettings.UserID}) on ({DateTime.Now}). ChangeBars reset to show all changes.", DateTime.Now, VlnSettings.UserID, 0); + Close(); } } else if (RevisionData.HasUnits(dt)) { + //any with units string maxDTS = RevisionData.MaxDTS(dt).ToString("MM/dd/yyyy HH:mm:ss"); @@ -107,15 +118,22 @@ namespace VEPROMS //Change the overall ChangeBarDate MyProcConfig.Print_ChangeBarDate = maxDTS; - //Change the ChangeBarDate for each unit - foreach (DataRow r in dt.Rows) + //Change the ChangeBarDate for each unit + foreach (DataRow r in dt.Rows) { MyProcConfig.SelectedSlave = Convert.ToInt32(r["UnitID"]); MyProcConfig.Print_ChangeBarDate = Convert.ToDateTime(r["DTS"]).ToString("MM / dd / yyyy HH: mm: ss"); + + //CSM - C2026-010 - Add Audit Record for Change Bar Audit History + ChangeBarAuditHistory.AddAudit(MyProcInfo.ItemID, $"Reset ChangeBars performed by ({VlnSettings.UserID}) on ({DateTime.Now}). ChangeBars reset to show since last approval ({Convert.ToDateTime(r["DTS"]):MM/dd/yyyy HH:mm:ss}) for (Unit {r["UnitName"]})", DateTime.Now, VlnSettings.UserID, MyProcConfig.SelectedSlave); + } MyProcConfig.SelectedSlave = 0; - DialogResult = DialogResult.OK; + + //CSM - C2026-010 - Add Audit Record for Change Bar Audit History + ChangeBarAuditHistory.AddAudit(MyProcInfo.ItemID, $"Reset ChangeBars performed by ({VlnSettings.UserID}) on ({DateTime.Now}). ChangeBars reset to show since last approval ({maxDTS})", DateTime.Now, VlnSettings.UserID, 0); + Close(); } } @@ -127,6 +145,9 @@ namespace VEPROMS { MyProcConfig.Print_ChangeBarDate = maxDTS; DialogResult = DialogResult.OK; + + //CSM - C2026-010 - Add Audit Record for Change Bar Audit History + ChangeBarAuditHistory.AddAudit(MyProcInfo.ItemID, $"Reset ChangeBars performed by ({VlnSettings.UserID}) on ({DateTime.Now}). ChangeBars reset to show since last approval ({maxDTS})", DateTime.Now, VlnSettings.UserID, 0); Close(); } } diff --git a/PROMS/VEPROMS User Interface/frmVEPROMS.Designer.cs b/PROMS/VEPROMS User Interface/frmVEPROMS.Designer.cs index e94335f3..d2f33d9d 100644 --- a/PROMS/VEPROMS User Interface/frmVEPROMS.Designer.cs +++ b/PROMS/VEPROMS User Interface/frmVEPROMS.Designer.cs @@ -877,7 +877,7 @@ namespace VEPROMS this.infoPanel.ExpandOnTitleClick = true; this.infoPanel.Location = new System.Drawing.Point(614, 57); this.infoPanel.Name = "infoPanel"; - this.infoPanel.Size = new System.Drawing.Size(230, 490); + this.infoPanel.Size = new System.Drawing.Size(300, 490); this.infoPanel.Style.Alignment = System.Drawing.StringAlignment.Center; this.infoPanel.Style.BackColor1.ColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBackground; this.infoPanel.Style.BackColor2.ColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBackground2; diff --git a/PROMS/VEPROMS.CSLA.Library/Minimal/ChangeBarAuditHistory.cs b/PROMS/VEPROMS.CSLA.Library/Minimal/ChangeBarAuditHistory.cs new file mode 100644 index 00000000..cf1be7b0 --- /dev/null +++ b/PROMS/VEPROMS.CSLA.Library/Minimal/ChangeBarAuditHistory.cs @@ -0,0 +1,72 @@ +using System; +using Csla.Data; +using System.Data; +using System.Data.SqlClient; + +//CSM - C2026-010 - Minimal Class for Managing Change Bar Audit History +namespace VEPROMS.CSLA.Library +{ + public static class ChangeBarAuditHistory + { + + #region Add Audit Record for ChangeBar History + public static void AddAudit(int itemID, string description, DateTime dts, string userID, int unitIndex) + { + try + { + using (SqlConnection cn = Database.VEPROMS_SqlConnection) + { + using (SqlCommand cm = cn.CreateCommand()) + { + cm.CommandType = CommandType.StoredProcedure; + cm.CommandText = "AddChangeBarAuditHistory"; + cm.Parameters.AddWithValue("@ItemID", itemID); + cm.Parameters.AddWithValue("@Description", description); + cm.Parameters.AddWithValue("@DTS", dts); + cm.Parameters.AddWithValue("@UserID", userID); + if (unitIndex != 0) cm.Parameters.AddWithValue("@UnitIndex", unitIndex); + + cm.CommandTimeout = 0; + cm.ExecuteNonQuery(); + } + } + } + catch (Exception ex) + { + throw new DbCslaException("Error in ChangeBarAuditHistory.AddAudit: ", ex); + } + } + + #endregion + + #region Get Change Bar Audit History + public static DataTable GetChangeBarAuditHistory(int itemID) + { + try + { + using (SqlConnection cn = Database.VEPROMS_SqlConnection) + { + using (SqlCommand cm = cn.CreateCommand()) + { + cm.CommandType = CommandType.StoredProcedure; + cm.CommandText = "GetChangeBarAuditHistoryByItem"; + cm.Parameters.AddWithValue("@ItemID", itemID); + cm.CommandTimeout = Database.DefaultTimeout; + using (SqlDataAdapter da = new SqlDataAdapter(cm)) + { + DataTable dt = new DataTable(); + da.Fill(dt); + return dt; + } + } + } + } + catch (Exception ex) + { + throw new DbCslaException("Error in ChangeBarAuditHistory.GetChangeBarAuditHistoryByItem: retrieving data failed", ex); + } + } + #endregion + + } +} diff --git a/PROMS/VEPROMS.CSLA.Library/VEPROMS.CSLA.Library.csproj b/PROMS/VEPROMS.CSLA.Library/VEPROMS.CSLA.Library.csproj index 2234b8df..1b9a09b2 100644 --- a/PROMS/VEPROMS.CSLA.Library/VEPROMS.CSLA.Library.csproj +++ b/PROMS/VEPROMS.CSLA.Library/VEPROMS.CSLA.Library.csproj @@ -389,6 +389,7 @@ + diff --git a/PROMS/Volian.Controls.Library/DisplayHistory.cs b/PROMS/Volian.Controls.Library/DisplayHistory.cs index a190e4f7..e00facf0 100644 --- a/PROMS/Volian.Controls.Library/DisplayHistory.cs +++ b/PROMS/Volian.Controls.Library/DisplayHistory.cs @@ -56,7 +56,20 @@ namespace Volian.Controls.Library set { if (DesignMode) return; // B2019-043 need to check if we are just saving changes to the user interface - if (value is ProcedureInfo && _MyProcedureInfo is ProcedureInfo && value.ItemID == _MyProcedureInfo.ItemID) + + //CSM - C2026-010 - Set/Show Change Bar Audit History + if (value != null) + { + lbChangeBarHistory.DataSource = ChangeBarAuditHistory.GetChangeBarAuditHistory(value.ItemID); + lbChangeBarHistory.ValueMember = "AuditID"; + lbChangeBarHistory.DisplayMember = "Text"; + } + else + { + lbChangeBarHistory.DataSource = null; + } + + if (value is ProcedureInfo && _MyProcedureInfo is ProcedureInfo && value.ItemID == _MyProcedureInfo.ItemID) return; _MyProcedureInfo = value; if (value == null) return; @@ -184,6 +197,15 @@ namespace Volian.Controls.Library InitializeComponent(); myRTB.FormatFont = null; RefreshRequired = true; + + if (MyProcedureInfo != null) + { + lbChangeBarHistory.DataSource = ChangeBarAuditHistory.GetChangeBarAuditHistory(MyProcedureInfo.ItemID); + } + else + { + lbChangeBarHistory.DataSource = null; + } } private void lbChanges_VisibleChanged(object sender, System.EventArgs e) @@ -1075,7 +1097,25 @@ namespace Volian.Controls.Library { tvAudits.Height = ((tcpDetail.Height - btnRestore.Height) / 4) * 3; } - public void RefreshChangeList() + + //CSM - C2026-010 - Set/Show Change Bar Audit History + //Display a Tooltip for what was in the list + private void LbChangeBarHistory_MouseMove(object sender, MouseEventArgs e) + { + // Just use the item's value for the tooltip. + int index = lbChangeBarHistory.IndexFromPoint(e.Location); + + if (index != ListBox.NoMatches) + { + DataRow rw = (lbChangeBarHistory.Items[index] as DataRowView)?.Row; + + // Display the item's value as a tooltip. + if (tipCBHistory.GetToolTip(lbChangeBarHistory) != rw["Text"].ToString()) + tipCBHistory.SetToolTip(lbChangeBarHistory, rw["Text"].ToString()); + } + } + + public void RefreshChangeList() { myTimer.Enabled = false; myTimer.Enabled = true; diff --git a/PROMS/Volian.Controls.Library/DisplayHistory.designer.cs b/PROMS/Volian.Controls.Library/DisplayHistory.designer.cs index a7c9d046dea58df145d0af16a254bc22de6f65b8..5740460f7e88e131e3aab69c6ad8827aa95464c7 100644 GIT binary patch delta 1073 zcmZ`&OKcKR6n$e$rKTcND7Jx=nfifZEdvoO>86#KR-_VQ6B83l0SVTc0#=Rf#+aCh zyOtB<#wafQlvY!CrVBL2&z{7MD`RxmmBEdPsSDo#H7N|6mpk{Id*^=6UHiQ&ooiWN z(m)t6aZWte+(Wrtt2;r$VWS4s1C5FwBIEj%83wGTDNTE)e z)oiFBi5*=tBuTsstPl6>on)yJMno+w=`V9~9oXFO!*tX@ z{RUG9vX)kSw{^4PKCgQ5Ry>S%aV@>sx2eJ%i@u)^l&mJ`6FydSFVYDs z7WsoWdD!gks2cqxm!aWxe1I9`Z*^} zMf)o~Fk&hy(!chD95Y47r^;(AIIY!hBVHX-({lX9Hk)@X$T8*~ZU}kX7_;-Qbs4u_ zp+SCl3>V#6RdxLLpPy^GGP#>(>kJ*ARa`UgJ&p5EoK558Nz4sx|9xx4)0FARoy>UJ zT3kdzK76z(EoJt~m_dTnr%0$-p^z|4G@&%g#hiZj^ diff --git a/PROMS/Volian.Controls.Library/DisplayHistory.resx b/PROMS/Volian.Controls.Library/DisplayHistory.resx index 28034095..f248cb6d 100644 --- a/PROMS/Volian.Controls.Library/DisplayHistory.resx +++ b/PROMS/Volian.Controls.Library/DisplayHistory.resx @@ -188,4 +188,7 @@ 17, 17 + + 119, 17 + \ No newline at end of file