From d74beddb35c4f925919c661b8b996da59dcb85d6 Mon Sep 17 00:00:00 2001 From: Developer01 Date: Wed, 13 May 2026 09:52:20 +0200 Subject: [PATCH] Cockpit-Navigation: DevExpress TreeList integriert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Das Hauptfenster nutzt nun eine moderne, hierarchische Cockpit-Navigation auf Basis der DevExpress TreeList. Die TreeList ersetzt die bisherige alleinige Navigation über die NavBar und lädt ihre Struktur dynamisch aus der Datenbank. Knoten können asynchron Zähler nachladen und verschiedene Typen (Übersicht, Profil, SQL) abbilden. Die Datenlade-Logik wurde für die TreeList angepasst und erweitert. UI und Ressourcen wurden modernisiert, die TreeList ist für zukünftige Erweiterungen vorbereitet. Die NavBar bleibt erhalten, ist aber nicht mehr Hauptnavigation. --- app/TaskFlow/My Project/licenses.licx | 25 +- .../Translations/frmMain_Strings.Designer.vb | 2 +- .../Translations/frmMain_Strings.en.resx | 42 +- .../Translations/frmMain_Strings.fr.resx | 42 +- .../Translations/frmMain_Strings.resx | 2 +- app/TaskFlow/frmMain.Designer.vb | 126 ++++-- app/TaskFlow/frmMain.resx | 176 ++++++-- app/TaskFlow/frmMain.vb | 382 ++++++++++++++++-- 8 files changed, 635 insertions(+), 162 deletions(-) diff --git a/app/TaskFlow/My Project/licenses.licx b/app/TaskFlow/My Project/licenses.licx index 81c59ed..1bfb691 100644 --- a/app/TaskFlow/My Project/licenses.licx +++ b/app/TaskFlow/My Project/licenses.licx @@ -1,15 +1,16 @@ -DevExpress.XtraEditors.Repository.RepositoryItemComboBox, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraEditors.Repository.RepositoryItemProgressBar, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraCharts.ChartControl, DevExpress.XtraCharts.v21.2.UI, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraVerticalGrid.PropertyGridControl, DevExpress.XtraVerticalGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraEditors.PictureEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraEditors.LookUpEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraEditors.ComboBoxEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraBars.Ribbon.RibbonControl, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraNavBar.NavBarControl, DevExpress.XtraNavBar.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraDataLayout.DataLayoutControl, DevExpress.XtraLayout.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraLayout.LayoutControl, DevExpress.XtraLayout.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraEditors.TextEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.ComboBoxEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.Repository.RepositoryItemComboBox, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraDataLayout.DataLayoutControl, DevExpress.XtraLayout.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.PictureEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraVerticalGrid.PropertyGridControl, DevExpress.XtraVerticalGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraTreeList.TreeList, DevExpress.XtraTreeList.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraBars.Ribbon.RibbonControl, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.Repository.RepositoryItemProgressBar, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraCharts.ChartControl, DevExpress.XtraCharts.v21.2.UI, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraNavBar.NavBarControl, DevExpress.XtraNavBar.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/app/TaskFlow/Translations/frmMain_Strings.Designer.vb b/app/TaskFlow/Translations/frmMain_Strings.Designer.vb index cc4f09d..2958b7e 100644 --- a/app/TaskFlow/Translations/frmMain_Strings.Designer.vb +++ b/app/TaskFlow/Translations/frmMain_Strings.Designer.vb @@ -92,7 +92,7 @@ Namespace My.Resources End Property ''' - ''' Sucht eine lokalisierte Zeichenfolge, die Aktuell keine Workflowdaten vorhanden! {0} ähnelt. + ''' Sucht eine lokalisierte Zeichenfolge, die Aktuell keine Workflowdaten vorhanden - {0} ähnelt. ''' Friend Shared ReadOnly Property Aktuell_keine_Workflowdaten_vorhanden___0_() As String Get diff --git a/app/TaskFlow/Translations/frmMain_Strings.en.resx b/app/TaskFlow/Translations/frmMain_Strings.en.resx index b32a79e..fc6ac88 100644 --- a/app/TaskFlow/Translations/frmMain_Strings.en.resx +++ b/app/TaskFlow/Translations/frmMain_Strings.en.resx @@ -120,36 +120,27 @@ Attention: + + Currently no workflow data available - {0} + + + Current license has expired or is invalid! + Logged in users: {0} Number of licenses: {0} - - Please close the currently open workflow! - - - Bigger - - - Smaller - - - Normal - - - Currently no workflow data available! {0} - - - Current license has expired or is invalid! - Please configure a database connection! Please contact your administrator! + + Please close the currently open workflow! + Please select a profile! @@ -177,9 +168,18 @@ Deactivate ({0}) Ghost Mode + + Bigger + NOTE: Debug mode is switched on! + + IDB Active + + + Smaller + Last synchronization: {0} @@ -189,6 +189,9 @@ Mass completion could not be executed because windream could not be initialised! + + Normal + Next activity check: {0} {1} @@ -213,7 +216,4 @@ {0} Processes - - IDB Active - \ No newline at end of file diff --git a/app/TaskFlow/Translations/frmMain_Strings.fr.resx b/app/TaskFlow/Translations/frmMain_Strings.fr.resx index cf64f82..28a971b 100644 --- a/app/TaskFlow/Translations/frmMain_Strings.fr.resx +++ b/app/TaskFlow/Translations/frmMain_Strings.fr.resx @@ -120,36 +120,27 @@ Attention: + + Actuellement, aucune donnée de workflow n'est disponible - {0} + + + La licence actuelle a expiré ou n'est plus valable ! + Nombre d'utilisateurs connectés: {0} Nombre de licences: {0} - - Veuillez fermer le workflow ouvert ! - - - Plus grand - - - Petit - - - Normal - - - Actuellement, aucune donnée de workflow n'est disponible ! {0} - - - La licence actuelle a expiré ou n'est plus valable ! - Veuillez configurer une connexion à la base de données ! Veuillez contacter votre administrateur ! + + Veuillez fermer le workflow ouvert ! + Veuillez sélectionner un profil ! @@ -177,9 +168,18 @@ Désactiver ({0}) le Mode Fantôme + + Plus grand + REMARQUE : le mode de débogage est activé ! + + IDB Aktif + + + Petit + Dernière synchronisation : {0} @@ -189,6 +189,9 @@ La clôture en masse n'a pas pu être exécutée parce que windream n'a pas pu être initialisé ! + + Normal + Prochaine vérification d'activité : {0} {1} @@ -213,7 +216,4 @@ {0} Opérations - - IDB Aktif - \ No newline at end of file diff --git a/app/TaskFlow/Translations/frmMain_Strings.resx b/app/TaskFlow/Translations/frmMain_Strings.resx index 9b6af05..64fcfbf 100644 --- a/app/TaskFlow/Translations/frmMain_Strings.resx +++ b/app/TaskFlow/Translations/frmMain_Strings.resx @@ -121,7 +121,7 @@ Achtung: - Aktuell keine Workflowdaten vorhanden! {0} + Aktuell keine Workflowdaten vorhanden - {0} Aktuelle Lizenz ist abgelaufen oder ungültig! diff --git a/app/TaskFlow/frmMain.Designer.vb b/app/TaskFlow/frmMain.Designer.vb index b4318a4..495bf4c 100644 --- a/app/TaskFlow/frmMain.Designer.vb +++ b/app/TaskFlow/frmMain.Designer.vb @@ -28,8 +28,7 @@ Partial Class frmMain Me.DD_DMSLiteDataSet = New taskFLOW.DD_DMSLiteDataSet() Me.TableAdapterManager = New taskFLOW.DD_DMSLiteDataSetTableAdapters.TableAdapterManager() Me.Panel1 = New System.Windows.Forms.Panel() - Me.GridControlWorkflows = New DevExpress.XtraGrid.GridControl() - Me.GridViewWorkflows = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.TreeList_Cockpit = New DevExpress.XtraTreeList.TreeList() Me.RibbonControl1 = New DevExpress.XtraBars.Ribbon.RibbonControl() Me.bbtniRefresh = New DevExpress.XtraBars.BarButtonItem() Me.bbtniMonitor = New DevExpress.XtraBars.BarButtonItem() @@ -99,6 +98,9 @@ Partial Class frmMain Me.RibbonPageGroup8 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RepositoryItemTrackBar1 = New DevExpress.XtraEditors.Repository.RepositoryItemTrackBar() Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() + Me.ImageCollection1 = New DevExpress.Utils.ImageCollection(Me.components) + Me.GridControlWorkflows = New DevExpress.XtraGrid.GridControl() + Me.GridViewWorkflows = New DevExpress.XtraGrid.Views.Grid.GridView() Me.Panel2 = New System.Windows.Forms.Panel() Me.lblCaptionMainGrid = New System.Windows.Forms.Label() Me.NavBarControl1 = New DevExpress.XtraNavBar.NavBarControl() @@ -196,12 +198,14 @@ Partial Class frmMain Me.BarButtonItem9 = New DevExpress.XtraBars.BarButtonItem() CType(Me.DD_DMSLiteDataSet, System.ComponentModel.ISupportInitialize).BeginInit() Me.Panel1.SuspendLayout() - CType(Me.GridControlWorkflows, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.GridViewWorkflows, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TreeList_Cockpit, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.RepositoryItemProgressBar1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.cmbGridFontSize, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.RepositoryItemTrackBar1, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.ImageCollection1, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridControlWorkflows, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridViewWorkflows, System.ComponentModel.ISupportInitialize).BeginInit() Me.Panel2.SuspendLayout() CType(Me.NavBarControl1, System.ComponentModel.ISupportInitialize).BeginInit() Me.cmsNavPane.SuspendLayout() @@ -247,48 +251,36 @@ Partial Class frmMain 'Panel1 ' Me.Panel1.BackColor = System.Drawing.Color.Transparent + Me.Panel1.Controls.Add(Me.TreeList_Cockpit) Me.Panel1.Controls.Add(Me.GridControlWorkflows) Me.Panel1.Controls.Add(Me.Panel2) Me.Panel1.Controls.Add(Me.NavBarControl1) resources.ApplyResources(Me.Panel1, "Panel1") Me.Panel1.Name = "Panel1" ' - 'GridControlWorkflows + 'TreeList_Cockpit ' - resources.ApplyResources(Me.GridControlWorkflows, "GridControlWorkflows") - Me.GridControlWorkflows.MainView = Me.GridViewWorkflows - Me.GridControlWorkflows.MenuManager = Me.RibbonControl1 - Me.GridControlWorkflows.Name = "GridControlWorkflows" - Me.GridControlWorkflows.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridViewWorkflows}) - ' - 'GridViewWorkflows - ' - Me.GridViewWorkflows.Appearance.EvenRow.BackColor = System.Drawing.Color.Azure - Me.GridViewWorkflows.Appearance.EvenRow.Options.UseBackColor = True - Me.GridViewWorkflows.Appearance.FooterPanel.Font = CType(resources.GetObject("GridViewWorkflows.Appearance.FooterPanel.Font"), System.Drawing.Font) - Me.GridViewWorkflows.Appearance.FooterPanel.Options.UseFont = True - Me.GridViewWorkflows.Appearance.ViewCaption.Font = CType(resources.GetObject("GridViewWorkflows.Appearance.ViewCaption.Font"), System.Drawing.Font) - Me.GridViewWorkflows.Appearance.ViewCaption.ForeColor = System.Drawing.Color.Black - Me.GridViewWorkflows.Appearance.ViewCaption.Options.UseFont = True - Me.GridViewWorkflows.Appearance.ViewCaption.Options.UseForeColor = True - Me.GridViewWorkflows.Appearance.ViewCaption.Options.UseTextOptions = True - Me.GridViewWorkflows.Appearance.ViewCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Near - Me.GridViewWorkflows.GridControl = Me.GridControlWorkflows - Me.GridViewWorkflows.Name = "GridViewWorkflows" - Me.GridViewWorkflows.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.[False] - Me.GridViewWorkflows.OptionsBehavior.AllowDeleteRows = DevExpress.Utils.DefaultBoolean.[False] - Me.GridViewWorkflows.OptionsBehavior.AllowFixedGroups = DevExpress.Utils.DefaultBoolean.[True] - Me.GridViewWorkflows.OptionsBehavior.AllowGroupExpandAnimation = DevExpress.Utils.DefaultBoolean.[True] - Me.GridViewWorkflows.OptionsBehavior.Editable = False - Me.GridViewWorkflows.OptionsClipboard.CopyColumnHeaders = DevExpress.Utils.DefaultBoolean.[False] - Me.GridViewWorkflows.OptionsSelection.MultiSelect = True - Me.GridViewWorkflows.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.CellSelect - Me.GridViewWorkflows.OptionsView.ColumnAutoWidth = False - Me.GridViewWorkflows.OptionsView.EnableAppearanceEvenRow = True - Me.GridViewWorkflows.OptionsView.ShowAutoFilterRow = True - Me.GridViewWorkflows.OptionsView.ShowErrorPanel = DevExpress.Utils.DefaultBoolean.[True] - Me.GridViewWorkflows.OptionsView.ShowHorizontalLines = DevExpress.Utils.DefaultBoolean.[False] - Me.GridViewWorkflows.OptionsView.ShowVerticalLines = DevExpress.Utils.DefaultBoolean.[False] + resources.ApplyResources(Me.TreeList_Cockpit, "TreeList_Cockpit") + Me.TreeList_Cockpit.ImageIndexFieldName = "ICON_INDEX" + Me.TreeList_Cockpit.KeyFieldName = "PK_CFG_COCKPIT_DEFINITION_ID" + Me.TreeList_Cockpit.MenuManager = Me.RibbonControl1 + Me.TreeList_Cockpit.Name = "TreeList_Cockpit" + Me.TreeList_Cockpit.OptionsBehavior.Editable = False + Me.TreeList_Cockpit.OptionsBehavior.PopulateServiceColumns = True + Me.TreeList_Cockpit.OptionsBehavior.ReadOnly = True + Me.TreeList_Cockpit.OptionsLayout.AddNewColumns = False + Me.TreeList_Cockpit.OptionsMenu.ShowExpandCollapseItems = False + Me.TreeList_Cockpit.OptionsSelection.EnableAppearanceFocusedCell = False + Me.TreeList_Cockpit.OptionsView.ShowColumns = False + Me.TreeList_Cockpit.OptionsView.ShowFilterPanelMode = DevExpress.XtraTreeList.ShowFilterPanelMode.Never + Me.TreeList_Cockpit.OptionsView.ShowFirstLines = False + Me.TreeList_Cockpit.OptionsView.ShowHorzLines = False + Me.TreeList_Cockpit.OptionsView.ShowIndentAsRowStyle = True + Me.TreeList_Cockpit.OptionsView.ShowIndicator = False + Me.TreeList_Cockpit.OptionsView.ShowVertLines = False + Me.TreeList_Cockpit.OptionsView.TreeLineStyle = DevExpress.XtraTreeList.LineStyle.Dark + Me.TreeList_Cockpit.ParentFieldName = "Parent_ID" + Me.TreeList_Cockpit.SelectImageList = Me.ImageCollection1 ' 'RibbonControl1 ' @@ -863,6 +855,51 @@ Partial Class frmMain Me.RibbonStatusBar1.Name = "RibbonStatusBar1" Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1 ' + 'ImageCollection1 + ' + resources.ApplyResources(Me.ImageCollection1, "ImageCollection1") + Me.ImageCollection1.ImageStream = CType(resources.GetObject("ImageCollection1.ImageStream"), DevExpress.Utils.ImageCollectionStreamer) + Me.ImageCollection1.Images.SetKeyName(0, "splittablecells_32x32.png") + Me.ImageCollection1.Images.SetKeyName(1, "bosaleitem_32x32.png") + Me.ImageCollection1.Images.SetKeyName(2, "bar2_32x32.png") + ' + 'GridControlWorkflows + ' + resources.ApplyResources(Me.GridControlWorkflows, "GridControlWorkflows") + Me.GridControlWorkflows.MainView = Me.GridViewWorkflows + Me.GridControlWorkflows.MenuManager = Me.RibbonControl1 + Me.GridControlWorkflows.Name = "GridControlWorkflows" + Me.GridControlWorkflows.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridViewWorkflows}) + ' + 'GridViewWorkflows + ' + Me.GridViewWorkflows.Appearance.EvenRow.BackColor = System.Drawing.Color.Azure + Me.GridViewWorkflows.Appearance.EvenRow.Options.UseBackColor = True + Me.GridViewWorkflows.Appearance.FooterPanel.Font = CType(resources.GetObject("GridViewWorkflows.Appearance.FooterPanel.Font"), System.Drawing.Font) + Me.GridViewWorkflows.Appearance.FooterPanel.Options.UseFont = True + Me.GridViewWorkflows.Appearance.ViewCaption.Font = CType(resources.GetObject("GridViewWorkflows.Appearance.ViewCaption.Font"), System.Drawing.Font) + Me.GridViewWorkflows.Appearance.ViewCaption.ForeColor = System.Drawing.Color.Black + Me.GridViewWorkflows.Appearance.ViewCaption.Options.UseFont = True + Me.GridViewWorkflows.Appearance.ViewCaption.Options.UseForeColor = True + Me.GridViewWorkflows.Appearance.ViewCaption.Options.UseTextOptions = True + Me.GridViewWorkflows.Appearance.ViewCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Near + Me.GridViewWorkflows.GridControl = Me.GridControlWorkflows + Me.GridViewWorkflows.Name = "GridViewWorkflows" + Me.GridViewWorkflows.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.[False] + Me.GridViewWorkflows.OptionsBehavior.AllowDeleteRows = DevExpress.Utils.DefaultBoolean.[False] + Me.GridViewWorkflows.OptionsBehavior.AllowFixedGroups = DevExpress.Utils.DefaultBoolean.[True] + Me.GridViewWorkflows.OptionsBehavior.AllowGroupExpandAnimation = DevExpress.Utils.DefaultBoolean.[True] + Me.GridViewWorkflows.OptionsBehavior.Editable = False + Me.GridViewWorkflows.OptionsClipboard.CopyColumnHeaders = DevExpress.Utils.DefaultBoolean.[False] + Me.GridViewWorkflows.OptionsSelection.MultiSelect = True + Me.GridViewWorkflows.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.CellSelect + Me.GridViewWorkflows.OptionsView.ColumnAutoWidth = False + Me.GridViewWorkflows.OptionsView.EnableAppearanceEvenRow = True + Me.GridViewWorkflows.OptionsView.ShowAutoFilterRow = True + Me.GridViewWorkflows.OptionsView.ShowErrorPanel = DevExpress.Utils.DefaultBoolean.[True] + Me.GridViewWorkflows.OptionsView.ShowHorizontalLines = DevExpress.Utils.DefaultBoolean.[False] + Me.GridViewWorkflows.OptionsView.ShowVerticalLines = DevExpress.Utils.DefaultBoolean.[False] + ' 'Panel2 ' Me.Panel2.Controls.Add(Me.lblCaptionMainGrid) @@ -878,9 +915,9 @@ Partial Class frmMain ' Me.NavBarControl1.ActiveGroup = Me.NavBarGroupProfiles Me.NavBarControl1.ContextMenuStrip = Me.cmsNavPane - resources.ApplyResources(Me.NavBarControl1, "NavBarControl1") Me.NavBarControl1.Groups.AddRange(New DevExpress.XtraNavBar.NavBarGroup() {Me.NavBarGroupMore, Me.NavBarGroupProfiles}) Me.NavBarControl1.Items.AddRange(New DevExpress.XtraNavBar.NavBarItem() {Me.NavBarItemOverview}) + resources.ApplyResources(Me.NavBarControl1, "NavBarControl1") Me.NavBarControl1.Name = "NavBarControl1" Me.NavBarControl1.OptionsNavPane.ExpandedWidth = CType(resources.GetObject("resource.ExpandedWidth"), Integer) Me.NavBarControl1.PaintStyleKind = DevExpress.XtraNavBar.NavBarViewKind.NavigationPane @@ -911,7 +948,6 @@ Partial Class frmMain 'NavBarGroupMore ' resources.ApplyResources(Me.NavBarGroupMore, "NavBarGroupMore") - Me.NavBarGroupMore.Expanded = True Me.NavBarGroupMore.GroupStyle = DevExpress.XtraNavBar.NavBarGroupStyle.LargeIconsText Me.NavBarGroupMore.ImageOptions.LargeImage = CType(resources.GetObject("NavBarGroupMore.ImageOptions.LargeImage"), System.Drawing.Image) Me.NavBarGroupMore.ItemLinks.AddRange(New DevExpress.XtraNavBar.NavBarItemLink() {New DevExpress.XtraNavBar.NavBarItemLink(Me.NavBarItemOverview)}) @@ -1621,12 +1657,14 @@ Partial Class frmMain Me.StatusBar = Me.RibbonStatusBar1 CType(Me.DD_DMSLiteDataSet, System.ComponentModel.ISupportInitialize).EndInit() Me.Panel1.ResumeLayout(False) - CType(Me.GridControlWorkflows, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.GridViewWorkflows, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TreeList_Cockpit, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.RepositoryItemProgressBar1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.cmbGridFontSize, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.RepositoryItemTrackBar1, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.ImageCollection1, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridControlWorkflows, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridViewWorkflows, System.ComponentModel.ISupportInitialize).EndInit() Me.Panel2.ResumeLayout(False) Me.Panel2.PerformLayout() CType(Me.NavBarControl1, System.ComponentModel.ISupportInitialize).EndInit() @@ -1812,4 +1850,6 @@ Partial Class frmMain Friend WithEvents BSIVERSION1 As DevExpress.XtraBars.BarStaticItem Friend WithEvents barbtnitmsaveLogfiles As DevExpress.XtraBars.BarButtonItem Friend WithEvents bsitmCount As DevExpress.XtraBars.BarStaticItem + Friend WithEvents TreeList_Cockpit As DevExpress.XtraTreeList.TreeList + Friend WithEvents ImageCollection1 As DevExpress.Utils.ImageCollection End Class diff --git a/app/TaskFlow/frmMain.resx b/app/TaskFlow/frmMain.resx index f2b33a3..a2cb716 100644 --- a/app/TaskFlow/frmMain.resx +++ b/app/TaskFlow/frmMain.resx @@ -125,7 +125,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADw - CAAAAk1TRnQBSQFMAgEBAgEAAQgBDAEIAQwBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CAAAAk1TRnQBSQFMAgEBAgEAASABDAEgAQwBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -172,19 +172,12 @@ 179, 17 - - - Fill - - - 233, 24 + + Tahoma, 9.75pt - - Microsoft Sans Serif, 8.25pt - - - Segoe UI, 12pt + + 3, 6 Aktualisieren @@ -1538,8 +1531,128 @@ 4 + + 760, 54 + + + 24, 24 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFpEZXZFeHByZXNzLlV0aWxzLnYyMS4yLCBWZXJzaW9uPTIxLjIu + NC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI4OGQxNzU0ZDcwMGU0OWEMAwAAAFFT + eXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRv + a2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAAChEZXZFeHByZXNzLlV0aWxzLkltYWdlQ29sbGVjdGlvblN0 + cmVhbWVyAgAAAAlJbWFnZVNpemUERGF0YQQHE1N5c3RlbS5EcmF3aW5nLlNpemUDAAAAAgIAAAAF/P// + /xNTeXN0ZW0uRHJhd2luZy5TaXplAgAAAAV3aWR0aAZoZWlnaHQAAAgIAwAAABgAAAAYAAAACQUAAAAP + BQAAAPQRAAACCgYAAIlQTkcNChoKAAAADUlIRFIAAAAYAAAAGAgGAAAA4Hc9+AAAAAFzUkdCAK7OHOkA + AAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAFn0lEQVRIS72WaVBTVxiGL1W7bzPd + pHamta1VK+NoW2stY611bIutS1vqgqxGkEFgAIkbAuKCYgTZVYoLqyJJMAoIRVHZAgGCiODKlrCDQBay + kOXtnJsbCLSd6a/emXeSSSbP8+U73zn3UtT/dFlRFPWMRaZMytR/yTSLPDsp5HeES1mFpt6xCbv08Mz+ + rCZuaFYTN+RCI3dfZiM3KLORuye9kbs77R6Xfb6exz5Xzws4U0fHL1nM802q4fmcruF5nxLxvRIr+Z4J + lXyPhEq+e7yQ73rshgMjoaxCMxo2NkkVMF9GJgYj0CSVw2A00u/1RiP0BlNG9UYIqjroV63OCI3OAM2o + ESqdAX0yDVgx5Xzmn1BWQWn1mxqlinEwCMwEzBf3QEeADFSrN0DDAI/xm6AaNUA1qseIxgCFRg+5Wg9J + vwpuUWU5FEU9TwTP7EkRO9yTKmgwqZRUbBIAebU9NFxLw5lKdQaoRw2I4DVBpTVgRGuAUqMfE7T3j8Al + suTymGDn2WoHrrALiQUtSCxoRfy1FsTlNyM27wlY6V5Y9cdC2J1egB9OzsfKBBusiJuH5TFzsezEHCyN + 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 + + + + 227, 352 + + + 11 + + + TreeList_Cockpit + + + DevExpress.XtraTreeList.TreeList, DevExpress.XtraTreeList.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + + Panel1 + + + 0 + + + 398, 24 + + + Microsoft Sans Serif, 8.25pt + + + Segoe UI, 12pt + - 1240, 656 + 1075, 656 10 @@ -1554,7 +1667,7 @@ Panel1 - 0 + 1 lblCaptionMainGrid @@ -1568,9 +1681,6 @@ 0 - - Top - 233, 0 @@ -1590,7 +1700,7 @@ Panel1 - 1 + 2 weitere Profile @@ -1656,9 +1766,6 @@ System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Left - Hauptansicht @@ -1776,13 +1883,13 @@ - 0, 0 + 12, 375 - 233 + 196 - 233, 680 + 196, 245 5 @@ -1800,8 +1907,9 @@ Panel1 - 2 + 3 + Fill @@ -2309,12 +2417,6 @@ taskFLOW.DD_DMSLiteDataSetTableAdapters.TableAdapterManager, DD_DMSLiteDataSet.Designer.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - GridViewWorkflows - - - DevExpress.XtraGrid.Views.Grid.GridView, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - bbtniRefresh @@ -2717,6 +2819,18 @@ DevExpress.XtraEditors.Repository.RepositoryItemTrackBar, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + ImageCollection1 + + + DevExpress.Utils.ImageCollection, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + + GridViewWorkflows + + + DevExpress.XtraGrid.Views.Grid.GridView, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + NavBarGroupProfiles diff --git a/app/TaskFlow/frmMain.vb b/app/TaskFlow/frmMain.vb index 6dd7227..0c7c182 100644 --- a/app/TaskFlow/frmMain.vb +++ b/app/TaskFlow/frmMain.vb @@ -41,7 +41,7 @@ Public Class frmMain Private GridCursorLocation As System.Drawing.Point Private GRID_LOAD_TYPE As String = "OVERVIEW" Private GRID_INV_COL_REMOVED As Boolean = False - Private NO_WORKFLOWITEMS As Boolean = False + Private NO_WORKFLOW_ITEMS As Boolean = False Private InResetlayout As Boolean = False Private RefreshHelper As RefreshHelper Private _FormValidator As frmValidator @@ -72,6 +72,9 @@ Public Class frmMain Private Const FA_NONE = "NONE" Public Const NAVBAR_CLICKED = "NAVBAR LINK CLICKED" + Private CUSTOM_OVERVIEW_SQL As String = String.Empty + Private COCKPIT_CONFIG_ID As Integer = 0 + Private Class S Inherits My.Resources.frmMain_Strings @@ -399,6 +402,10 @@ Public Class frmMain LOGGER.Error(ex) MsgBox("Unexpected Error in LoadForm - Step 4: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Attention:") End Try + + Load_Treeview() + + LoadNavBar() AddHandler NavBarControl1.LinkClicked, AddressOf navBar_LinkClicked If Not IsNothing(CURR_DT_VWPM_PROFILE_AH_WORKFLOW) Then @@ -542,6 +549,124 @@ Public Class frmMain FormOpenClose = False End Sub + Private Sub Load_Treeview() + Try + Dim oSQL = $"SELECT * FROM [dbo].[FNTF_GET_COCKPIT_DEFINITION] ({USER_ID},'{USER_LANGUAGE}')" + Dim oDT_STRUCTURE_NODES As DataTable = DatabaseFallback.GetDatatableECM(oSQL) + If Not IsNothing(oDT_STRUCTURE_NODES) Then + If oDT_STRUCTURE_NODES.Rows.Count > 0 Then + TreeList_Cockpit.BeginUpdate() + Try + TreeList_Cockpit.DataSource = oDT_STRUCTURE_NODES + TreeList_Cockpit.KeyFieldName = "PK_CFG_COCKPIT_DEFINITION_ID" + TreeList_Cockpit.ParentFieldName = "PARENT_ID" + TreeList_Cockpit.Columns("PK_RESULT_ID").SortOrder = SortOrder.Ascending + + + ' ===== MODERNES DESIGN ===== + ' Schriftgröße und -art + TreeList_Cockpit.Appearance.Row.Font = New Font("Segoe UI", 12, FontStyle.Regular) + TreeList_Cockpit.Appearance.FocusedRow.Font = New Font("Segoe UI", 12, FontStyle.Bold) + TreeList_Cockpit.Appearance.HideSelectionRow.Font = New Font("Segoe UI", 12, FontStyle.Regular) + + ' Modernes Farbschema (passend zum Office2019-Skin) + TreeList_Cockpit.Appearance.Row.BackColor = Color.White + TreeList_Cockpit.Appearance.Row.ForeColor = Color.FromArgb(50, 50, 50) + TreeList_Cockpit.Appearance.FocusedRow.BackColor = Color.FromArgb(210, 230, 255) + TreeList_Cockpit.Appearance.FocusedRow.ForeColor = Color.FromArgb(20, 20, 20) + TreeList_Cockpit.Appearance.HideSelectionRow.BackColor = Color.FromArgb(225, 235, 250) + TreeList_Cockpit.Appearance.HideSelectionRow.ForeColor = Color.FromArgb(50, 50, 50) + + ' Zeilenhöhe erhöhen für bessere Lesbarkeit + TreeList_Cockpit.RowHeight = 28 + + + Dim oVisibleColumns As New System.Collections.Generic.HashSet(Of String)(StringComparer.OrdinalIgnoreCase) From {"NAME"} + For Each oColumn As DevExpress.XtraTreeList.Columns.TreeListColumn In TreeList_Cockpit.Columns + oColumn.Visible = oVisibleColumns.Contains(oColumn.FieldName) + Next + Finally + TreeList_Cockpit.EndUpdate() + End Try + ' AddHandler TreeList1.GetSelectImage, AddressOf TreeList1_GetSelectImage + TreeList_Cockpit.Refresh() ' ✅ Erzwingt sofortiges Neuzeichnen der Icons + + + ' ===== ANZAHL ASYNCHRON NACHLADEN ===== + If oDT_STRUCTURE_NODES.Columns.Contains("SQL_QUERY_COUNT") Then + AppendCountsToTreeAsync() + End If + End If + End If + Catch ex As Exception + LOGGER.Error(ex) + End Try + End Sub + + Private Async Sub AppendCountsToTreeAsync() + Try + LOGGER.Debug("AppendCountsToTreeAsync: Starting background count queries...") + + ' Alle Knoten mit ihren SQL-Befehlen im UI-Thread über NodesIterator einsammeln + Dim oWorkItems As New List(Of (Node As DevExpress.XtraTreeList.Nodes.TreeListNode, SQL As String, OriginalName As String)) + + TreeList_Cockpit.NodesIterator.DoOperation( + Sub(oNode As DevExpress.XtraTreeList.Nodes.TreeListNode) + Dim oSqlCount As Object = oNode.GetValue("SQL_QUERY_COUNT") + If oSqlCount IsNot Nothing AndAlso Not IsDBNull(oSqlCount) AndAlso Not String.IsNullOrWhiteSpace(oSqlCount.ToString()) Then + Dim oPreparedSQL As String = PrepareSQLWithReplacements(oSqlCount.ToString()) + Dim oName As String = oNode.GetValue("NAME")?.ToString() + If Not String.IsNullOrWhiteSpace(oName) Then + oWorkItems.Add((oNode, oPreparedSQL, oName)) + End If + Else + LOGGER.Debug($"AppendCountsToTreeAsync: Node [{oNode.GetValue("NAME")}] has no valid SQL_QUERY_COUNT, skipping.") + End If + End Sub) + + If oWorkItems.Count = 0 Then + Exit Sub + End If + + LOGGER.Debug($"AppendCountsToTreeAsync: {oWorkItems.Count} node(s) with SQL_QUERY_COUNT found") + + ' DB-Abfragen parallel im Hintergrund ausführen + Dim oResults As New List(Of (Node As DevExpress.XtraTreeList.Nodes.TreeListNode, OriginalName As String, Count As String)) + + Await Task.Run(Sub() + For Each oItem In oWorkItems + Try + Dim oResult As Object = DatabaseFallback.GetScalarValueECM(oItem.SQL) + If oResult IsNot Nothing AndAlso Not IsDBNull(oResult) Then + SyncLock oResults + oResults.Add((oItem.Node, oItem.OriginalName, oResult.ToString())) + End SyncLock + End If + Catch ex As Exception + LOGGER.Warn($"AppendCountsToTreeAsync: Count query failed for node [{oItem.OriginalName}] - {ex.Message}") + End Try + Next + End Sub) + + ' Ergebnisse zurück im UI-Thread auf die Knoten schreiben + TreeList_Cockpit.BeginUpdate() + Try + For Each oResult In oResults + oResult.Node.SetValue("NAME", $"{oResult.OriginalName} ({oResult.Count})") + LOGGER.Debug($"AppendCountsToTreeAsync: Node [{oResult.OriginalName}] → [{oResult.OriginalName} ({oResult.Count})]") + Next + Finally + TreeList_Cockpit.EndUpdate() + End Try + + TreeList_Cockpit.Refresh() + LOGGER.Debug("AppendCountsToTreeAsync: Finished") + + Catch ex As Exception + LOGGER.Error(ex) + End Try + End Sub + Private Function IsPositionVisible(position As System.Drawing.Point) As Boolean For Each scr As Screen In Screen.AllScreens If scr.WorkingArea.Contains(position) Then @@ -686,14 +811,21 @@ Public Class frmMain End Function Private Function GetLayoutName_GridMain() - Dim Filename As String = String.Format("DevExpressGridViewOverview_UserLayout_{0}_{1}.xml", GRID_LOAD_TYPE, USER_LANGUAGE) + Dim oLoadTypeSuffix As String = GRID_LOAD_TYPE + + ' Bei mehreren Gesamtübersichten die COCKPIT_CONFIG_ID als Suffix anhängen + If GRID_LOAD_TYPE = "OVERVIEW" AndAlso COCKPIT_CONFIG_ID > 0 Then + oLoadTypeSuffix = $"OVERVIEW_{COCKPIT_CONFIG_ID}" + End If + + Dim Filename As String = String.Format("DevExpressGridViewOverview_UserLayout_{0}_{1}.xml", oLoadTypeSuffix, USER_LANGUAGE) LOGGER.Debug($"LayoutFilename is: {Filename}") Return System.IO.Path.Combine(USER_CONFIG_DIRECTORY, Filename) End Function Private Sub SaveGridLayout() Timer_Inactivity_Reset_Disable("SaveGridLayout") - If NO_WORKFLOWITEMS = True Then + If NO_WORKFLOW_ITEMS = True Then Exit Sub End If @@ -708,7 +840,7 @@ Public Class frmMain End Sub Private Sub RestoreLayout() - If NO_WORKFLOWITEMS = True Then + If NO_WORKFLOW_ITEMS = True Then Exit Sub End If @@ -1090,13 +1222,13 @@ Public Class frmMain Dim oCOUNT = DT_CURR_WF_ITEMS.Rows.Count ' Workflowitems-Status setzen - NO_WORKFLOWITEMS = (oCOUNT = 0) + NO_WORKFLOW_ITEMS = (oCOUNT = 0) ' Caption IMMER aktualisieren (vor Hash-Prüfung!) UpdateGridCaption() ' Datenquelle bei leeren Items zurücksetzen - If NO_WORKFLOWITEMS Then + If NO_WORKFLOW_ITEMS Then GridControlWorkflows.Visible = False bindsourcegrid.DataSource = Nothing GridControlWorkflows.DataSource = Nothing @@ -1463,12 +1595,13 @@ Public Class frmMain End If If Not loadSuccess Then - LOGGER.Warn("Daten konnten nicht geladen werden") + LOGGER.Warn($"LoadProfileData for Profile-ID [{CURRENT_CLICKED_PROFILE_ID}] - Title [{CURRENT_CLICKED_PROFILE_TITLE}] failed or has no Data - exiting Decide_Load") Exit Function End If ' ========== NACHBEARBEITUNG ========== ApplyPostLoadSettings() + GridIsLoaded = True ' ========== CAPTION FINAL SICHERSTELLEN ========== ' ApplyPostLoadSettings kann durch Spalten-Events den Caption überschreiben, @@ -1514,6 +1647,7 @@ Public Class frmMain End If Try + GridControlWorkflows_Visible() ' ========== GRID UPDATES VORBEREITEN ========== If GridControlWorkflows.Visible Then GridControlWorkflows.BeginUpdate() @@ -1525,7 +1659,7 @@ Public Class frmMain ' ========== PROFILE VALIDIEREN ========== If BASEDATA_DT_VW_PROFILE_USER.Rows.Count = 0 Then LOGGER.Info("Attention: No profiles for user: '" & USER_USERNAME & "' configured!", False) - NO_WORKFLOWITEMS = True + NO_WORKFLOW_ITEMS = True bsiMessage.Caption = "NO PROFILES FOR USER" bsiMessage.ItemAppearance.Normal.BackColor = Color.Red bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black @@ -1550,10 +1684,18 @@ Public Class frmMain End If ' ========== SQL VORBEREITEN ========== - Dim oSQLOverview = BASEDATA_DT_CONFIG.Rows(0).Item("SQL_PROFILE_MAIN_VIEW") + Dim oSQLOverview As String + If Not String.IsNullOrWhiteSpace(CUSTOM_OVERVIEW_SQL) Then + LOGGER.Debug($"[LoadOverviewData] Using CUSTOM_OVERVIEW_SQL from TreeList node") + oSQLOverview = CUSTOM_OVERVIEW_SQL + CUSTOM_OVERVIEW_SQL = String.Empty + Else + oSQLOverview = BASEDATA_DT_CONFIG.Rows(0).Item("SQL_PROFILE_MAIN_VIEW") + End If If IsDBNull(oSQLOverview) OrElse Not oSQLOverview.ToString.Contains("GROUP_TEXT") Then - NO_WORKFLOWITEMS = True + LOGGER.Warn("Overview SQL is Null or not properly configured (missing or GROUP_TEXT column) - cannot load overview data") + NO_WORKFLOW_ITEMS = True GridControlWorkflows.Visible = False bindsourcegrid.DataSource = Nothing GridControlWorkflows.DataSource = Nothing @@ -1583,7 +1725,7 @@ Public Class frmMain End If If IsNothing(DT_CURR_WF_ITEMS) Then - NO_WORKFLOWITEMS = True + NO_WORKFLOW_ITEMS = True GridControlWorkflows.Visible = False Return False End If @@ -1591,10 +1733,10 @@ Public Class frmMain LOGGER.Debug($"Datatable CURR_DT_OVERVIEW loaded: {DT_CURR_WF_ITEMS.Rows.Count} rows") ' ========== DATEN VERARBEITEN ========== - NO_WORKFLOWITEMS = (DT_CURR_WF_ITEMS.Rows.Count = 0) + NO_WORKFLOW_ITEMS = (DT_CURR_WF_ITEMS.Rows.Count = 0) UpdateGridCaption() - If NO_WORKFLOWITEMS Then + If NO_WORKFLOW_ITEMS Then GridControlWorkflows.Visible = False bindsourcegrid.DataSource = Nothing GridControlWorkflows.DataSource = Nothing @@ -1687,14 +1829,13 @@ Public Class frmMain Load_Profiles_for_User() Dim expression As String = "GUID = " & CURRENT_CLICKED_PROFILE_ID - Dim foundRow As DataRow = CURR_DT_VWPM_PROFILE_ACTIVE.Select(expression).FirstOrDefault() + + Dim foundRow As DataRow = CURRENT_DT_PROFILES.Select(expression).FirstOrDefault() If foundRow Is Nothing Then + LOGGER.Warn($"LoadProfileData for Profile-ID [{CURRENT_CLICKED_PROFILE_ID}] - Title [{CURRENT_CLICKED_PROFILE_TITLE}] not found - exiting Decide_Load") Return False End If - ' === FIX: Grid sichtbar machen bevor BeginUpdate === - GridControlWorkflows_Visible() - If GridControlWorkflows.Visible Then GridControlWorkflows.BeginUpdate() gridUpdateStarted = True @@ -1709,22 +1850,22 @@ Public Class frmMain DT_CURR_WF_ITEMS = Await DatabaseFallback.GetDatatableECMAsync(oSQL) If IsNothing(DT_CURR_WF_ITEMS) Then - LOGGER.Warn("Daten konnten nicht geladen werden für Profil: " & CURRENT_CLICKED_PROFILE_TITLE) + LOGGER.Warn($"LoadProfileData for Profile-ID [{CURRENT_CLICKED_PROFILE_ID}] - Title [{CURRENT_CLICKED_PROFILE_TITLE}] failed - exiting Decide_Load") Return False End If ' ========== DATEN VERARBEITEN ========== - NO_WORKFLOWITEMS = (DT_CURR_WF_ITEMS.Rows.Count = 0) + NO_WORKFLOW_ITEMS = (DT_CURR_WF_ITEMS.Rows.Count = 0) UpdateGridCaption() - If NO_WORKFLOWITEMS Then + If NO_WORKFLOW_ITEMS Then GridControlWorkflows.Visible = False bindsourcegrid.DataSource = Nothing GridControlWorkflows.DataSource = Nothing LOGGER.Info("Keine Workflow-Items für Profil: " & CURRENT_CLICKED_PROFILE_TITLE) Return False End If - + GridControlWorkflows_Visible() ' ========== BASIC VIEW ERSTELLEN ========== Await CreateBasicViewForProfile() LOGGER.Debug("Basic View für Profil erstellt: " & CURRENT_CLICKED_PROFILE_TITLE) @@ -2602,7 +2743,7 @@ Public Class frmMain ' ========== DATEN VALIDIEREN ========== If BASEDATA_DT_VW_PROFILE_USER.Rows.Count = 0 Then LOGGER.Info("Attention: No profiles for user: '" & USER_USERNAME & "' configured!", False) - NO_WORKFLOWITEMS = True + NO_WORKFLOW_ITEMS = True bsiMessage.Caption = "NO PROFILES FOR USER" bsiMessage.ItemAppearance.Normal.BackColor = Color.Red bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black @@ -2637,7 +2778,7 @@ Public Class frmMain If oSQLOverview.ToString.Contains("GROUP_TEXT") = False Then LOGGER.Info($"SQL SO FAR: {oSQLOverview} ") FormHelper.ShowInfoMessage("Incomplete Overview-Source (No Group-Columns). Column", omsgTitleWarning) - NO_WORKFLOWITEMS = True + NO_WORKFLOW_ITEMS = True GridControlWorkflows.Visible = False bindsourcegrid.DataSource = Nothing GridControlWorkflows.DataSource = Nothing @@ -2667,8 +2808,8 @@ Public Class frmMain If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds Dim rowCount = If(DT_CURR_WF_ITEMS IsNot Nothing, DT_CURR_WF_ITEMS.Rows.Count, 0) - If elapsed > 4000 Then - LOGGER.Warn($"[PERF LGO] ⚠️ Datenbank-Abfrage Overview LANGSAM: {elapsed}ms ({rowCount} Zeilen) (Schwellwert: 4000ms) - SQL prüfen!") + If elapsed > 4500 Then + LOGGER.Warn($"[PERF LGO] ⚠️ Datenbank-Abfrage Overview LANGSAM: {elapsed}ms ({rowCount} Zeilen) (Schwellwert: 4500ms) - SQL prüfen!") Else LOGGER.Info($"[PERF LGO] Datenbank-Abfrage Overview: {elapsed}ms ({rowCount} Zeilen)") End If @@ -2676,7 +2817,7 @@ Public Class frmMain End If If IsNothing(DT_CURR_WF_ITEMS) Then - NO_WORKFLOWITEMS = True + NO_WORKFLOW_ITEMS = True GridControlWorkflows.Visible = False GridControlWorkflows.DataSource = Nothing Try @@ -2694,10 +2835,10 @@ Public Class frmMain Dim oChanged = GET_LAST_CHANGED(DT_CURR_WF_ITEMS) Dim oCOUNT = DT_CURR_WF_ITEMS.Rows.Count - NO_WORKFLOWITEMS = (oCOUNT = 0) + NO_WORKFLOW_ITEMS = (oCOUNT = 0) UpdateGridCaption() - If NO_WORKFLOWITEMS Then + If NO_WORKFLOW_ITEMS Then GridControlWorkflows.Visible = False bindsourcegrid.DataSource = Nothing GridControlWorkflows.DataSource = Nothing @@ -3287,8 +3428,19 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G CurrNavBarGroup = NavBarControl1.Groups(1) FormShown = True Timer_Inactivity_Reset_Disable("Decide_Load") - LOGGER.Debug("FormShown..Now Decide_Load...") - Await Decide_Load(True) + + ' ===== ERSTEN KNOTEN AUSWÄHLEN (löst FocusedNodeChanged → Decide_Load aus) ===== + Dim oFirstNode As DevExpress.XtraTreeList.Nodes.TreeListNode = TreeList_Cockpit.Nodes.FirstOrDefault() + If oFirstNode IsNot Nothing Then + LOGGER.Debug($"Selecting first TreeList node: [{oFirstNode.GetValue("NAME")}]") + TreeList_Cockpit.FocusedNode = oFirstNode + ' FocusedNodeChanged nicht zuverlässig bei programmatischer Zuweisung → direkt aufrufen + Await ProcessTreeListNodeAsync(oFirstNode) + Else + LOGGER.Debug("No TreeList nodes found - falling back to Decide_Load") + Await Decide_Load(True) + End If + If GridViewWorkflows.GroupCount = 0 And Not IsNothing(GridViewWorkflows.Columns("GROUP_TEXT")) Then LOGGER.Info("NO GROUPS AFTER SHOWN_Decide Load...") Create_GroupBy_Parts() @@ -3698,7 +3850,7 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G End Sub Private Sub UpdateGridCaption() Try - LOGGER.Debug($"UpdateGridCaption called - GRID_LOAD_TYPE: [{GRID_LOAD_TYPE}], CURRENT_CLICKED_PROFILE_TITLE: [{CURRENT_CLICKED_PROFILE_TITLE}], NO_WORKFLOWITEMS: [{NO_WORKFLOWITEMS}]") + LOGGER.Debug($"UpdateGridCaption called - GRID_LOAD_TYPE: [{GRID_LOAD_TYPE}], CURRENT_CLICKED_PROFILE_TITLE: [{CURRENT_CLICKED_PROFILE_TITLE}], NO_WORKFLOWITEMS: [{NO_WORKFLOW_ITEMS}]") If GRID_LOAD_TYPE = "OVERVIEW" Then ' Übersicht-Caption lblCaptionMainGrid.Text = S.Gesamtübersicht @@ -3711,7 +3863,7 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G ElseIf GRID_LOAD_TYPE.StartsWith("PROFILE#") Then ' Profil-Caption If Not String.IsNullOrEmpty(CURRENT_CLICKED_PROFILE_TITLE) Then - If NO_WORKFLOWITEMS Then + If NO_WORKFLOW_ITEMS Then lblCaptionMainGrid.Text = String.Format(S.Aktuell_keine_Workflowdaten_vorhanden___0_, CURRENT_CLICKED_PROFILE_TITLE) Else lblCaptionMainGrid.Text = CURRENT_CLICKED_PROFILE_TITLE @@ -4192,4 +4344,170 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G Private Sub barbtnitmsaveLogfiles_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles barbtnitmsaveLogfiles.ItemClick ClassAllgemeineFunktionen.Save_Logfiles() End Sub + + Private Async Function ProcessTreeListNodeAsync(oNode As DevExpress.XtraTreeList.Nodes.TreeListNode) As Task + Try + Dim oTypeId As Object = oNode.GetValue("TYPE_ID") + Dim oCockpitConfigID As Object = oNode.GetValue("PK_CFG_COCKPIT_DEFINITION_ID") + Dim oFkProfileId As Object = oNode.GetValue("FK_PROFILE_ID") + Dim oSqlQuery As Object = oNode.GetValue("SQL_QUERY") + Dim oProfileTitle As Object = oNode.GetValue("NAME") + + LOGGER.Debug($"TreeList1 Node selected - PK_CFG_COCKPIT_DEFINITION_ID:[{oCockpitConfigID}] NAME:[{oProfileTitle}] TYPE_ID:[{oTypeId}] FK_PROFILE_ID:[{oFkProfileId}]") + + If oTypeId Is Nothing OrElse IsDBNull(oTypeId) Then + LOGGER.Debug("ProcessTreeListNodeAsync: TYPE_ID is Nothing/DBNull - Folder node, skipping") + Exit Function + End If + + If Application.OpenForms().OfType(Of frmValidator).Any Then + FormHelper.ShowInfoMessage(S.Bitte_schließen_Sie_den_offenen_Workflow_, omsgTitleWarning) + Exit Function + End If + + FRONTEND_ACTION = NAVBAR_CLICKED + Timer_Inactivity_Reset_Disable("TreeList1_FocusedNodeChanged") + COCKPIT_CONFIG_ID = oCockpitConfigID + + Dim oTypeIdInt As Integer = CInt(oTypeId) + + Select Case oTypeIdInt + + Case 0 + LOGGER.Debug("TreeList1: Loading overview") + OverviewOrDEtail = "OVERVIEW" + GRID_LOAD_TYPE = "OVERVIEW" + + Dim oForce As Boolean = False + If DetailLinkActive = True Then + oForce = True + DetailLinkActive = False + OVERVIEW_ADDED_WHEN = "" + End If + If IsDBNull(oSqlQuery) OrElse String.IsNullOrWhiteSpace(oSqlQuery?.ToString()) Then + LOGGER.Warn($"TreeList1: SQL_QUERY for ProfileID {oFkProfileId} is DBNull or empty for overview node - this should not happen, check data integrity of TreeList's DataSource") + Exit Function + End If + CURRENT_CLICKED_PROFILE_ID = 0 + CUSTOM_OVERVIEW_SQL = oSqlQuery.ToString() + + If GridControlWorkflows.Visible = True And FormOpenClose = False Then + RefreshHelper.SaveViewInfo() + End If + + Me.Cursor = Cursors.WaitCursor + Try + Await Decide_Load(False, oForce) + Finally + Me.Cursor = Cursors.Default + End Try + + If GridControlWorkflows.Visible = True And FormOpenClose = False Then + RefreshHelper.LoadViewInfo() + End If + + If GridViewWorkflows.GroupCount = 0 AndAlso Not IsNothing(GridViewWorkflows.Columns("GROUP_TEXT")) Then + LOGGER.Info("TreeList1: NO GROUPS AFTER CLICK OVERVIEW - creating groups...") + Await Decide_Load(False, True) + If GridControlWorkflows.Visible = True And FormOpenClose = False Then + RefreshHelper.LoadViewInfo() + End If + End If + + Case 1 + If oFkProfileId Is Nothing OrElse IsDBNull(oFkProfileId) Then + LOGGER.Warn("TreeList1: TYPE_ID=1 but FK_PROFILE_ID is Nothing/DBNull") + Exit Function + End If + + Dim oProfileId As Integer = CInt(oFkProfileId) + LOGGER.Debug($"TreeList1: Profile node clicked - FK_PROFILE_ID:[{oProfileId}]") + + + + + If CURRENT_CLICKED_PROFILE_ID = oProfileId Then + LOGGER.Debug($"TreeList1: Profile [{oProfileId}] is already active - ignoring click") + Exit Function + End If + + LOGGER.Debug($"TreeList1: Loading profile with ID [{oProfileId}]...") + + ' ===== ANZAHL-SUFFIX ENTFERNEN (von AppendCountsToTreeAsync angehängt: "Titel (42)" → "Titel") ===== + Dim oCleanProfileTitle As String = oProfileTitle?.ToString() + Dim oSuffixMatch = System.Text.RegularExpressions.Regex.Match(oCleanProfileTitle, "^(.*)\s+\(\d+\)$") + If oSuffixMatch.Success Then + oCleanProfileTitle = oSuffixMatch.Groups(1).Value.Trim() + LOGGER.Debug($"TreeList1: Stripped count suffix from title [{oProfileTitle}] → [{oCleanProfileTitle}]") + End If + + OverviewOrDEtail = "DETAIL" + CURRENT_CLICKED_PROFILE_ID = oProfileId + CURRENT_CLICKED_PROFILE_TITLE = oCleanProfileTitle + GRID_LOAD_TYPE = $"PROFILE#{oProfileId}" + DetailLinkActive = True + + If GridControlWorkflows.Visible = True And FormOpenClose = False Then + RefreshHelper.SaveViewInfo() + End If + + Me.Cursor = Cursors.WaitCursor + Try + Await Decide_Load(False, True) + Finally + Me.Cursor = Cursors.Default + End Try + + Case 2 + If oSqlQuery Is Nothing OrElse IsDBNull(oSqlQuery) Then + Exit Function + End If + + Dim oSQL As String = oSqlQuery.ToString() + If String.IsNullOrWhiteSpace(oSQL) Then + Exit Function + End If + + LOGGER.Debug($"TreeList1: Executing custom SQL query from node") + oSQL = PrepareSQLWithReplacements(oSQL) + + Dim oDT As DataTable = DatabaseFallback.GetDatatableECM(oSQL) + If oDT IsNot Nothing Then + LOGGER.Debug($"TreeList1 SQL result: {oDT.Rows.Count} rows") + DT_CURR_WF_ITEMS = oDT + NO_WORKFLOW_ITEMS = (oDT.Rows.Count = 0) + bindsourcegrid.DataSource = DT_CURR_WF_ITEMS + GridControlWorkflows.DataSource = bindsourcegrid + GridControlWorkflows.Visible = Not NO_WORKFLOW_ITEMS + UpdateGridCaption() + End If + + Case Else + LOGGER.Debug($"ProcessTreeListNodeAsync: Unhandled TYPE_ID [{oTypeIdInt}]") + + End Select + + Catch ex As Exception + LOGGER.Error(ex) + Finally + FRONTEND_ACTION = FA_NONE + End Try + End Function + Private Async Sub TreeList1_FocusedNodeChanged(sender As Object, e As DevExpress.XtraTreeList.FocusedNodeChangedEventArgs) Handles TreeList_Cockpit.FocusedNodeChanged + Try + If e.Node Is Nothing Then + LOGGER.Debug("TreeList1_FocusedNodeChanged: Node is Nothing - skipping") + Exit Sub + End If + + If FormShown = False Then + Exit Sub + End If + + Await ProcessTreeListNodeAsync(e.Node) + + Catch ex As Exception + LOGGER.Error(ex) + End Try + End Sub End Class \ No newline at end of file