Compare commits

...

8 Commits

9 changed files with 540 additions and 54 deletions

View File

@@ -24231,6 +24231,39 @@ GO
==========================================================================================================
*/
-- C2025-009 Report for tracking PROMS Users / Security
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[getUserAcessControl]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1)
DROP PROCEDURE [getUserAcessControl];
GO
/****** Object: StoredProcedure [dbo].[getUserAcessControl] Script Date: 9/5/2025 6:51:42 AM ******/
-- =============================================
-- Author: Matthew Schill
-- Create date: 09/05/2025
-- Description: Get Data on When Users were added to PROMS and when they were added to Security Groups
-- =============================================
CREATE PROCEDURE [dbo].[getUserAcessControl]
AS
BEGIN
SELECT Users.UserID,
WhenUserAddedToPROMS = Users.[DTS],
GroupName = Groups.GroupName,
WhenUserAddedToGroup = Memberships.[DTS],
WhoAddedUserToGroup = CASE WHEN
Memberships.UsrID = Users.UsrID
AND Users.UsrID = Users.UserID
THEN 'INITIAL_SETUP'
ELSE Memberships.UsrID END,
DateUserRemovedFromGroup = Memberships.EndDate
FROM Memberships
inner join Groups on Memberships.GID = Groups.GID
right outer join Users on Users.UID = Memberships.UID
order by UserID, Memberships.[DTS]
RETURN
END
/*
---------------------------------------------------------------------------
| ADD New Code Before this Block |
@@ -24264,8 +24297,8 @@ BEGIN TRY -- Try Block
DECLARE @RevDate varchar(255)
DECLARE @RevDescription varchar(255)
set @RevDate = '08/18/2025 2:07 PM'
set @RevDescription = 'Updated Index maintenance that occurs after RO FST Load to improve RO Performance'
set @RevDate = '09/05/2025 7:00 AM'
set @RevDescription = 'Added stored procedure for User Access Control Report'
Select cast(@RevDate as datetime) RevDate, @RevDescription RevDescription
PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription

View File

@@ -121,6 +121,10 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\3rdPartyLibraries\Log4Net\log4net.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
<EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Data">

View File

@@ -9,6 +9,8 @@ using Volian.Controls.Library;
using DevComponents.DotNetBar;
using JR.Utils.GUI.Forms;
using System.Linq;
using System.Data;
using xls = Microsoft.Office.Interop.Excel;
namespace VEPROMS
{
@@ -275,6 +277,13 @@ namespace VEPROMS
setupProgessSteps1();
}
//C2025-009 Report for tracking PROMS Users / security
private void sideNavItmReports_Click(object sender, EventArgs e)
{
GenToolType = E_GenToolType.Reports;
setupProgessSteps1();
}
// C2017-030 new Tools user interface
private void sideNavItmExit_Click(object sender, EventArgs e)
{
@@ -287,7 +296,8 @@ namespace VEPROMS
private enum E_GenToolType : int
{
Check = 0,
Users = 3
Users = 3,
Reports = 5
};
private E_GenToolType GenToolType = 0;
@@ -314,8 +324,8 @@ namespace VEPROMS
progressSteps1.Visible = true;
progressSteps1.Refresh();
break;
case E_GenToolType.Users:
case E_GenToolType.Reports:
splitContainer3.Panel2Collapsed = true;
progressSteps1.Visible = false;
break;
@@ -415,7 +425,133 @@ namespace VEPROMS
ClearStepProgress();
}
//C2025-009 Report for tracking PROMS Users / security
//UACfilename will hold the filename for cases when scheduled for later
private string UACfilename;
//C2025-009 Report for tracking PROMS Users / security
private void btnUAC_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(UACfilename))
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Excel XLS (*.xlsx)|*.xlsx";
sfd.FileName = "UACReport.xlsx";
if (sfd.ShowDialog() == DialogResult.OK)
{
UACfilename = sfd.FileName;
}
}
if (!CheckProcessLater()) return; // delay processing if set//B2017-221 Allow the batch dialog to close when waiting to process.
txtProcess.Clear();
txtResults.Clear();
if (!string.IsNullOrEmpty(UACfilename))
{
Generate_UAC_Report(UACfilename);
}
UACfilename = null;
}
//C2025-009 Report for tracking PROMS Users / security
//Get Datatable of results then loop through outputting into excel
private void Generate_UAC_Report(string filename)
{
this.Cursor = Cursors.WaitCursor;
DateTime pStart = DateTime.Now;
txtProcess.AppendText("Generate User Access Control Report in PROMS");
txtProcess.AppendText(Environment.NewLine);
txtProcess.AppendText(string.Format("Started: {0}", pStart.ToString("MM/dd/yyyy @ HH:mm")));
txtProcess.AppendText(Environment.NewLine);
Application.DoEvents();
txtResults.Clear();
txtResults.AppendText("Generating User Access Control Report");
using (DataTable dt = UserReports.GetUserAccessControlData())
{
// Start Excel and get Application object.
xls.Application excel = new xls.Application
{
// Make Excel invisible and disable alerts.
Visible = false,
DisplayAlerts = false
};
// Create a new Workbook.
xls.Workbook excelworkBook = excel.Workbooks.Add();
// Create a Worksheet.
var workSheet = (xls.Worksheet)excelworkBook.ActiveSheet;
workSheet.Name = "UAC Report";
// column headings
for (var i = 0; i < dt.Columns.Count; i++)
{
workSheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
}
// rows
for (var i = 0; i < dt.Rows.Count; i++)
{
for (var j = 0; j < dt.Columns.Count; j++)
{
workSheet.Cells[i + 2, j + 1] = dt.Rows[i][j];
}
}
//resize the columns to match the data
workSheet.Columns.AutoFit();
//freeze the top row, and highlight those cells
workSheet.Application.ActiveWindow.SplitRow = 1;
workSheet.Application.ActiveWindow.FreezePanes = true;
workSheet.Cells.Range[workSheet.Cells[1, 1], workSheet.Cells[1, dt.Columns.Count]].Interior.Color = xls.XlRgbColor.rgbLightBlue;
//save the excel file
excelworkBook.SaveAs(filename);
excelworkBook.Close();
excel.Quit();
//release any in use com objects
releaseObject(workSheet);
releaseObject(excelworkBook);
releaseObject(excel);
}
DateTime pEnd = DateTime.Now;
txtProcess.AppendText(string.Format("Completed: {0}", pEnd.ToString("MM/dd/yyyy @ HH:mm")));
Application.DoEvents();
this.Cursor = Cursors.Default;
MessageBox.Show("Generate User Access Control Report Completed", "User Access Control Report");
}
//C2025-009 Report for tracking PROMS Users / security
//for releasing any Excel com objects still in memory
private void releaseObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception ex)
{
obj = null;
MessageBox.Show("Exception Occurred while releasing object " + ex.ToString());
}
finally
{
GC.Collect();
}
}
//C2025-011 RO Update Tool Memory Enhancements
private void txtProcess_TextChanged(object sender, EventArgs e)
{

View File

@@ -51,6 +51,9 @@
this.expandableSplitter1 = new DevComponents.DotNetBar.ExpandableSplitter();
this.panelEx1 = new DevComponents.DotNetBar.PanelEx();
this.sideNav1 = new DevComponents.DotNetBar.Controls.SideNav();
this.sideNavPanel6 = new DevComponents.DotNetBar.Controls.SideNavPanel();
this.sideNavPanel5 = new DevComponents.DotNetBar.Controls.SideNavPanel();
this.btn_ShowUsers = new DevComponents.DotNetBar.ButtonX();
this.sideNavPanel1 = new DevComponents.DotNetBar.Controls.SideNavPanel();
this.warningBox3 = new DevComponents.DotNetBar.Controls.WarningBox();
this.labelX7 = new DevComponents.DotNetBar.LabelX();
@@ -62,12 +65,11 @@
this.swCkOrphanDataRecs = new DevComponents.DotNetBar.Controls.SwitchButton();
this.labelX1 = new DevComponents.DotNetBar.LabelX();
this.btnRunCheck = new DevComponents.DotNetBar.ButtonX();
this.sideNavPanel5 = new DevComponents.DotNetBar.Controls.SideNavPanel();
this.btn_ShowUsers = new DevComponents.DotNetBar.ButtonX();
this.sideNavItem1 = new DevComponents.DotNetBar.Controls.SideNavItem();
this.separator1 = new DevComponents.DotNetBar.Separator();
this.sideNavItmCheck = new DevComponents.DotNetBar.Controls.SideNavItem();
this.sideNavItmUsers = new DevComponents.DotNetBar.Controls.SideNavItem();
this.sideNavItmReports = new DevComponents.DotNetBar.Controls.SideNavItem();
this.sideNavItmExit = new DevComponents.DotNetBar.Controls.SideNavItem();
this.panelEx4 = new DevComponents.DotNetBar.PanelEx();
this.progressSteps1 = new DevComponents.DotNetBar.ProgressSteps();
@@ -78,6 +80,7 @@
this.lblAdmToolProgressType = new DevComponents.DotNetBar.LabelX();
this.buttonItem1 = new DevComponents.DotNetBar.ButtonItem();
this.superTooltip1 = new DevComponents.DotNetBar.SuperTooltip();
this.btnUAC = new DevComponents.DotNetBar.ButtonX();
((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).BeginInit();
this.splitContainer3.Panel1.SuspendLayout();
this.splitContainer3.Panel2.SuspendLayout();
@@ -89,8 +92,9 @@
this.pnlLater.SuspendLayout();
this.panelEx1.SuspendLayout();
this.sideNav1.SuspendLayout();
this.sideNavPanel1.SuspendLayout();
this.sideNavPanel6.SuspendLayout();
this.sideNavPanel5.SuspendLayout();
this.sideNavPanel1.SuspendLayout();
this.panelEx4.SuspendLayout();
this.SuspendLayout();
//
@@ -416,8 +420,9 @@
// sideNav1
//
this.sideNav1.BackColor = System.Drawing.SystemColors.Control;
this.sideNav1.Controls.Add(this.sideNavPanel1);
this.sideNav1.Controls.Add(this.sideNavPanel6);
this.sideNav1.Controls.Add(this.sideNavPanel5);
this.sideNav1.Controls.Add(this.sideNavPanel1);
this.sideNav1.Dock = System.Windows.Forms.DockStyle.Fill;
this.sideNav1.EnableClose = false;
this.sideNav1.EnableMaximize = false;
@@ -426,6 +431,7 @@
this.separator1,
this.sideNavItmCheck,
this.sideNavItmUsers,
this.sideNavItmReports,
this.sideNavItmExit});
this.sideNav1.Location = new System.Drawing.Point(0, 0);
this.sideNav1.Name = "sideNav1";
@@ -434,6 +440,40 @@
this.sideNav1.TabIndex = 3;
this.sideNav1.Text = "sideNav1";
//
// sideNavPanel6
//
this.sideNavPanel6.Controls.Add(this.btnUAC);
this.sideNavPanel6.Dock = System.Windows.Forms.DockStyle.Fill;
this.sideNavPanel6.Location = new System.Drawing.Point(88, 31);
this.sideNavPanel6.Name = "sideNavPanel6";
this.sideNavPanel6.Size = new System.Drawing.Size(292, 493);
this.sideNavPanel6.TabIndex = 14;
//
// sideNavPanel5
//
this.sideNavPanel5.Controls.Add(this.btn_ShowUsers);
this.sideNavPanel5.Dock = System.Windows.Forms.DockStyle.Fill;
this.sideNavPanel5.Location = new System.Drawing.Point(88, 31);
this.sideNavPanel5.Name = "sideNavPanel5";
this.sideNavPanel5.Size = new System.Drawing.Size(292, 493);
this.sideNavPanel5.TabIndex = 14;
this.sideNavPanel5.Visible = false;
//
// btn_ShowUsers
//
this.btn_ShowUsers.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btn_ShowUsers.Checked = true;
this.btn_ShowUsers.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btn_ShowUsers.Location = new System.Drawing.Point(57, 37);
this.btn_ShowUsers.Name = "btn_ShowUsers";
this.btn_ShowUsers.Size = new System.Drawing.Size(171, 23);
this.btn_ShowUsers.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.superTooltip1.SetSuperTooltip(this.btn_ShowUsers, new DevComponents.DotNetBar.SuperTooltipInfo("Show Users", "", "This will return all of the users currently with open sessions in the database an" +
"d the details of any items they have checked out.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(200, 80)));
this.btn_ShowUsers.TabIndex = 0;
this.btn_ShowUsers.Text = "Show Users";
this.btn_ShowUsers.Click += new System.EventHandler(this.btn_ShowUsers_Click);
//
// sideNavPanel1
//
this.sideNavPanel1.Controls.Add(this.warningBox3);
@@ -451,6 +491,7 @@
this.sideNavPanel1.Name = "sideNavPanel1";
this.sideNavPanel1.Size = new System.Drawing.Size(292, 493);
this.sideNavPanel1.TabIndex = 2;
this.sideNavPanel1.Visible = false;
//
// warningBox3
//
@@ -600,31 +641,6 @@
this.btnRunCheck.Text = "Run Check";
this.btnRunCheck.Click += new System.EventHandler(this.btnRunCheck_Click);
//
// sideNavPanel5
//
this.sideNavPanel5.Controls.Add(this.btn_ShowUsers);
this.sideNavPanel5.Dock = System.Windows.Forms.DockStyle.Fill;
this.sideNavPanel5.Location = new System.Drawing.Point(88, 31);
this.sideNavPanel5.Name = "sideNavPanel5";
this.sideNavPanel5.Size = new System.Drawing.Size(292, 493);
this.sideNavPanel5.TabIndex = 14;
this.sideNavPanel5.Visible = false;
//
// btn_ShowUsers
//
this.btn_ShowUsers.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btn_ShowUsers.Checked = true;
this.btn_ShowUsers.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btn_ShowUsers.Location = new System.Drawing.Point(57, 37);
this.btn_ShowUsers.Name = "btn_ShowUsers";
this.btn_ShowUsers.Size = new System.Drawing.Size(171, 23);
this.btn_ShowUsers.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.superTooltip1.SetSuperTooltip(this.btn_ShowUsers, new DevComponents.DotNetBar.SuperTooltipInfo("Show Users", "", "This will return all of the users currently with open sessions in the database an" +
"d the details of any items they have checked out.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(200, 80)));
this.btn_ShowUsers.TabIndex = 0;
this.btn_ShowUsers.Text = "Show Users";
this.btn_ShowUsers.Click += new System.EventHandler(this.btn_ShowUsers_Click);
//
// sideNavItem1
//
this.sideNavItem1.IsSystemMenu = true;
@@ -644,7 +660,6 @@
//
// sideNavItmCheck
//
this.sideNavItmCheck.Checked = true;
this.sideNavItmCheck.Name = "sideNavItmCheck";
this.sideNavItmCheck.Panel = this.sideNavPanel1;
this.sideNavItmCheck.Symbol = "";
@@ -659,6 +674,15 @@
this.sideNavItmUsers.Text = "Users";
this.sideNavItmUsers.Click += new System.EventHandler(this.sideNavItmUsers_Click);
//
// sideNavItmReports
//
this.sideNavItmReports.Checked = true;
this.sideNavItmReports.Name = "sideNavItmReports";
this.sideNavItmReports.Panel = this.sideNavPanel6;
this.sideNavItmReports.Symbol = "";
this.sideNavItmReports.Text = "Reports";
this.sideNavItmReports.Click += new System.EventHandler(this.sideNavItmReports_Click);
//
// sideNavItmExit
//
this.sideNavItmExit.Name = "sideNavItmExit";
@@ -761,6 +785,20 @@
this.superTooltip1.DefaultTooltipSettings = new DevComponents.DotNetBar.SuperTooltipInfo("", "", "", null, null, DevComponents.DotNetBar.eTooltipColor.Gray);
this.superTooltip1.LicenseKey = "F962CEC7-CD8F-4911-A9E9-CAB39962FC1F";
//
// btnUAC
//
this.btnUAC.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btnUAC.Checked = true;
this.btnUAC.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btnUAC.Location = new System.Drawing.Point(35, 30);
this.btnUAC.Name = "btnUAC";
this.btnUAC.Size = new System.Drawing.Size(187, 23);
this.btnUAC.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.btnUAC.TabIndex = 0;
this.btnUAC.Text = "Run User Access Control Report";
this.superTooltip1.SetSuperTooltip(this.btnUAC, new DevComponents.DotNetBar.SuperTooltipInfo("UAC Report", "", "This will return a report containing info on when users were added to PROMS and when users were added to specific PROMS security groups.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray));
this.btnUAC.Click += new System.EventHandler(this.btnUAC_Click);
//
// frmGenTools
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -790,15 +828,16 @@
this.panelEx1.ResumeLayout(false);
this.sideNav1.ResumeLayout(false);
this.sideNav1.PerformLayout();
this.sideNavPanel1.ResumeLayout(false);
this.sideNavPanel6.ResumeLayout(false);
this.sideNavPanel5.ResumeLayout(false);
this.sideNavPanel1.ResumeLayout(false);
this.panelEx4.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.SplitContainer splitContainer3;
#endregion
private System.Windows.Forms.SplitContainer splitContainer3;
private DevComponents.DotNetBar.PanelEx panelEx3;
private System.Windows.Forms.TextBox txtResults;
private System.Windows.Forms.Panel panel1;
@@ -829,11 +868,13 @@
private DevComponents.DotNetBar.ButtonX btnRunCheck;
private DevComponents.DotNetBar.Controls.SideNavPanel sideNavPanel5;
private DevComponents.DotNetBar.ButtonX btn_ShowUsers;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItem1;
private DevComponents.DotNetBar.Controls.SideNavPanel sideNavPanel6;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItem1;
private DevComponents.DotNetBar.Separator separator1;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmCheck;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmUsers;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmExit;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmReports;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmExit;
private DevComponents.DotNetBar.LabelX lblAdmToolProgressType;
private DevComponents.DotNetBar.ProgressSteps progressSteps1;
private DevComponents.DotNetBar.StepItem stepItem1;
@@ -847,7 +888,8 @@
private DevComponents.DotNetBar.PanelEx panelEx4;
private DevComponents.DotNetBar.Controls.WarningBox warningBox3;
private DevComponents.DotNetBar.ButtonItem buttonItem1;
}
private DevComponents.DotNetBar.ButtonX btnUAC;
}
}

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="superTooltip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="warningBox3.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>

View File

@@ -71,9 +71,12 @@ namespace VEPROMS
this.labelItem10 = new DevComponents.DotNetBar.LabelItem();
this.bottomProgBar = new DevComponents.DotNetBar.ProgressBarItem();
this.labelItem9 = new DevComponents.DotNetBar.LabelItem();
this.lblPreEditView = new DevComponents.DotNetBar.LabelItem();
this.lblEditView = new DevComponents.DotNetBar.LabelItem();
this.labelItem11 = new DevComponents.DotNetBar.LabelItem();
this.btnItemInfo = new DevComponents.DotNetBar.ButtonItem();
this.btnFilter = new DevComponents.DotNetBar.ButtonItem();
this.txtFilter = new DevComponents.DotNetBar.TextBoxItem();
this.lblItemID = new DevComponents.DotNetBar.LabelItem();
this.lblResolution = new DevComponents.DotNetBar.LabelItem();
this.btnEditItem = new DevComponents.DotNetBar.ButtonItem();
@@ -524,19 +527,22 @@ namespace VEPROMS
this.bottomBar.Font = new System.Drawing.Font("Segoe UI", 9F);
this.bottomBar.IsMaximized = false;
this.bottomBar.Items.AddRange(new DevComponents.DotNetBar.BaseItem[] {
this.labelItem10,
this.btnFilter,
this.txtFilter,
this.labelItem10,
this.bottomProgBar,
this.labelItem9,
this.lblEditView,
this.labelItem11,
this.btnItemInfo,
this.lblItemID,
this.lblResolution,
this.btnEditItem,
this.lblUser,
this.lblLastChange,
this.btnStepRTF,
this.btnFixMSWord});
this.lblPreEditView,
this.lblEditView,
this.labelItem11,
this.btnItemInfo,
this.lblItemID,
this.lblResolution,
this.btnEditItem,
this.lblUser,
this.lblLastChange,
this.btnStepRTF,
this.btnFixMSWord});
this.bottomBar.Location = new System.Drawing.Point(5, 573);
this.bottomBar.Name = "bottomBar";
this.bottomBar.Size = new System.Drawing.Size(1185, 25);
@@ -546,6 +552,21 @@ namespace VEPROMS
this.bottomBar.TabStop = false;
this.bottomBar.Text = "bar1";
//
// btnFilter
//
this.btnFilter.Name = "btnFilter";
this.btnFilter.Text = "Tree View Search:";
this.btnFilter.Click += SubmitFilter;
//
// txtFilter
//
this.txtFilter.TextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F);
this.txtFilter.Name = "txtFilter";
this.txtFilter.TextBoxWidth = 120;
this.txtFilter.TextBox.TabIndex = 0;
this.txtFilter.TextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.FilterEnterKey);
this.superTooltip1.SetSuperTooltip(this.txtFilter, new DevComponents.DotNetBar.SuperTooltipInfo("Filter", "", "This will filter the Procedure Tree in PROMS to Procedures containing entered words in the Procedure Number or Title. Press enter or the Tree View Search button to submit.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray));
//
// txtSearch
//
this.txtSearch.Dock = System.Windows.Forms.DockStyle.Right;
@@ -647,6 +668,11 @@ namespace VEPROMS
this.lblEditView.ForeColor = System.Drawing.SystemColors.MenuText;
this.lblEditView.Name = "lblEditView";
this.lblEditView.Text = "Edit";
// lblEditView
//
this.lblPreEditView.BorderSide = DevComponents.DotNetBar.eBorderSide.Left;
this.lblPreEditView.BorderType = DevComponents.DotNetBar.eBorderType.Bump;
this.lblPreEditView.Name = "lblPreEditView";
//
// labelItem11
//
@@ -1646,9 +1672,9 @@ namespace VEPROMS
this.ResumeLayout(false);
}
#endregion
#endregion
private DevComponents.DotNetBar.RibbonControl ribbonControl1;
private DevComponents.DotNetBar.RibbonControl ribbonControl1;
private DevComponents.DotNetBar.Office2007StartButton office2007StartButton1;
private DevComponents.DotNetBar.ItemContainer itemContainer1;
private DevComponents.DotNetBar.ItemContainer itemContainer2;
@@ -1744,8 +1770,11 @@ namespace VEPROMS
private DevComponents.DotNetBar.TabItem tabItemLibDocs;
private Volian.Controls.Library.DisplayTags displayTags;
private Volian.Controls.Library.DisplaySearch displaySearch1;
private DevComponents.DotNetBar.LabelItem lblPreEditView;
private DevComponents.DotNetBar.LabelItem lblEditView;
private DevComponents.DotNetBar.ButtonItem btnItemInfo;
private DevComponents.DotNetBar.ButtonItem btnFilter;
private DevComponents.DotNetBar.TextBoxItem txtFilter;
private DevComponents.DotNetBar.ButtonItem btnFixMSWord;
private Volian.Controls.Library.DisplayBookMarks displayBookMarks;
//private DevComponents.DotNetBar.LabelItem lblLocked;

View File

@@ -22,6 +22,9 @@ using Volian.Base.Library;
using Volian.Print.Library;
using JR.Utils.GUI.Forms;
using System.Diagnostics;
using System.Linq;
using System.Collections.Concurrent;
using System.Threading.Tasks;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
@@ -2771,6 +2774,199 @@ namespace VEPROMS
}
}
//C2024-036 IntelliSense
// Recursively Expand the Tree
// up to the procedure level
// Since items are only loaded as they are expanded,
// this is needed to search for matching text.
private void LoadAllProcedures(VETreeNode tn)
{
if (tn == null || tn.VEObject.IsProcedure)
return;
if (!tn.IsExpanded)
{ tn.Expand(); }
foreach (var nde in tn.Nodes)
LoadAllProcedures((VETreeNode)nde);
}
//C2024-036 IntelliSense
// Return a list containing all
// items in the Tree that match the entered text
// + any item that is a parent of those.
private List<IVEDrillDownReadOnly> GetMatchingTreeNodes(VETreeNode tn, string texttomatch)
{
List<IVEDrillDownReadOnly> matches = new List<IVEDrillDownReadOnly>();
//add any item that matches text
//and all parents back up to the top most item
if (tn.Text.ToLower().Contains(texttomatch.ToLower()))
{
matches.Add(tn.VEObject);
VETreeNode parent_tn = (VETreeNode) tn.Parent;
while (parent_tn != null)
{
if (!matches.Contains(parent_tn.VEObject))
{ matches.Add(parent_tn.VEObject); }
parent_tn = (VETreeNode)parent_tn.Parent;
}
}
if (!tn.VEObject.IsProcedure)
{
//if not at a procedure level,
//loop through sub items
//to check those for matches
foreach (VETreeNode nde in tn.Nodes.OfType<VETreeNode>())
{
if (nde.Text != "Dummy VETreeNode(IVEDrillDownReadOnly o)")
{
List<IVEDrillDownReadOnly> tmpmatches = GetMatchingTreeNodes(nde, texttomatch);
matches.AddRange(from mtch in tmpmatches
where !matches.Contains(mtch)
select mtch);
}
}
}
return matches;
}
//C2024-036 IntelliSense
// Recursively loop through the Child Nodes
// in the TreeView
// remove anything not in the list
private bool FilterTreeNodes(VETreeNode tn, List<IVEDrillDownReadOnly> filterlist)
{
if (tn == null)
return false;
if (!filterlist.Contains(tn.VEObject) && (tn != (VETreeNode) tv.Nodes[0])) //Note:Always keep the top node
{
return true;
}
else if (!tn.VEObject.IsProcedure)
{
//if not a procedure
//mark the sub-items that need removal
List<TreeNode> lst = (from VETreeNode nde in tn.Nodes.OfType<VETreeNode>()
where FilterTreeNodes(nde, filterlist)
select (TreeNode) nde).ToList();
//remove all items in the removal list
//need to do this separately as can't modify the collection while looping through it above
while (lst.Count > 0)
{
tn.Nodes.Remove(lst[0]);
lst.Remove(lst[0]);
}
//found a folder that matched that has no matching procedures
//if this is case, allow folder to be expanded
if (tn.Nodes.Count == 0 && filterlist.Contains(tn.VEObject))
{
tn.ChildrenLoaded = false;
tn.RefreshNode();
}
}
return false;
}
//C2024-036 IntelliSense
//Collection to block for task to complete
private BlockingCollection<string> blockingQueueFilter = new BlockingCollection<string>();
//C2024-036 IntelliSense
// When Text Changes, Perform the filtering
// Note that uses a blocking collection
// in case multiple events fire at the same time
// this is to prevent incorrect behavior when
//doing something like hitting backspace a bunch
private void SubmitFilter(object sender, EventArgs e)
{
//Consumer
Task.Run(() =>
{
//Blocks until a new filter is available
while (!blockingQueueFilter.IsCompleted)
{
string fltrtxt = blockingQueueFilter.Take();
ProcessFilter(fltrtxt);
}
});
//Producer
Task.Run(() => { blockingQueueFilter.Add(txtFilter?.Text); });
}
//C2024-036 IntelliSense
// When Enter Key is pressed in the TextBox
private void FilterEnterKey(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r') // enter key pressed
{
e.Handled = true;
SubmitFilter(sender, e);
}
}
//C2024-036 IntelliSense
// When Text Changes, Perform the filtering
// Note that uses Invoke to
// avoid multi-threaded problems
//with the blocking collection
private void ProcessFilter(string fltrtxt)
{
//Step 1: reload the base tree
VETreeNode tbase = (VETreeNode)tv.Nodes[0];
tbase.ChildrenLoaded = false;
this.Invoke((Action) (() => { tbase.RefreshNode(); }));
if (!string.IsNullOrEmpty(fltrtxt))
{
//Step 2: Expand all TreeNodes
this.Invoke((Action)(() => { LoadAllProcedures(tbase); }));
//Step 3: get items that match filter to those containing the title or number
List<IVEDrillDownReadOnly> filterlist = GetMatchingTreeNodes(tbase, fltrtxt);
//Step 4: filter to those containing the title or number
this.Invoke((Action)(() => {FilterTreeNodes(tbase, filterlist);}));
//Step 5: refresh the view
this.Invoke((Action)(() => {tv.Update();}));
//Step 6: select 1st procedure in tree view
this.Invoke((Action)(() => {SelectFirstProcedure(filterlist);}));
}
//Step 7: set progress bar as done
this.Invoke((Action)(() => {ProgBarText = "Filtering Complete";}));
}
//C2024-036 IntelliSense
//Gives Focus to last child in first section of treeview
//then given focus to treeview
//so that can click enter and open 1st found item/procedure
void SelectFirstProcedure(List<IVEDrillDownReadOnly> filterlist)
{
TreeNode tn = tv.Nodes[0];
while (tn.Nodes.Count > 0 && filterlist.Contains(((VETreeNode) tn).VEObject))
{
tn = tn.Nodes[0];
}
tv.SelectedNode = tn;
tv.Enabled = true;
tv.SelectedNode.Collapse();
tv.Focus();
}
void btnPrevious_Click(object sender, EventArgs e)
{
CurrentID = FindPreviousLine();

View File

@@ -0,0 +1,42 @@
using System;
using Csla.Data;
using System.Data;
using System.Data.SqlClient;
//CSM - C2025-009 - Minimal Class for User based Reports
namespace VEPROMS.CSLA.Library
{
public static class UserReports
{
#region Get User Reports
//CSM - C2025-009 Report for tracking PROMS Users / security
public static DataTable GetUserAccessControlData()
{
try
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "getUserAcessControl";
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 getUserAcessControl Report: retrieving data failed", ex);
}
}
#endregion
}
}

View File

@@ -388,6 +388,7 @@
<Compile Include="Generated\ZTransition.cs" />
<Compile Include="Generated\ZTransitionInfo.cs" />
<Compile Include="Minimal\AnnotationstypeSections.cs" />
<Compile Include="Minimal\UserReports.cs" />
<Compile Include="Minimal\UserSettings.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="VEObjects\VEDrillDown.cs" />