From 15295ba3f59de80d95531bf7a0fcf6413c29b1be Mon Sep 17 00:00:00 2001 From: Developer01 Date: Tue, 18 Aug 2026 17:03:38 +0200 Subject: [PATCH] Erweitere CockpitConfig um Benutzer- und Gruppenverwaltung MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Füge ein neues `XtraTabControl` mit zwei Tabs hinzu: - Tab 1: Verwaltung von Benutzern (zugeordnet/nicht zugeordnet) - Tab 2: Verwaltung von Gruppen (zugeordnet/nicht zugeordnet) Implementiere Drag-and-Drop-Funktionalität für Benutzer- und Gruppenzuweisungen, einschließlich Validierung und Datenbank- operationen (Einfügen/Löschen). Ergänze Methoden zum Laden von Benutzern und Gruppen: - `Load_Assigned_User_2_Cockpit`, `Load_Free_User_2_Cockpit` - `Load_Assigned_Groups_2_Cockpit`, `Load_Free_Groups_2_Cockpit` Füge ein Dropdown für die Reihenfolge-Spalte hinzu und validiere deren Werte. Zeige Statusmeldungen über ein neues `BarStaticItem` (`bsitm_info`) an. Passe die Benutzeroberfläche an (Größe, Layout) und aktualisiere SQL-Abfragen für korrekte Sortierung. Integriere neue Ressourcen (SVG-Bilder) für die Statusanzeige. --- app/TaskFlow/frmCockpitConfig.Designer.vb | 261 ++++++++++- app/TaskFlow/frmCockpitConfig.resx | 21 + app/TaskFlow/frmCockpitConfig.vb | 509 +++++++++++++++++++++- 3 files changed, 783 insertions(+), 8 deletions(-) diff --git a/app/TaskFlow/frmCockpitConfig.Designer.vb b/app/TaskFlow/frmCockpitConfig.Designer.vb index 075aa32..78431e8 100644 --- a/app/TaskFlow/frmCockpitConfig.Designer.vb +++ b/app/TaskFlow/frmCockpitConfig.Designer.vb @@ -34,6 +34,7 @@ Partial Class frmCockpitConfig Me.bbtnitm_NodeOverviewAdd = New DevExpress.XtraBars.BarButtonItem() Me.bbtnitm_NodeProfilAdd = New DevExpress.XtraBars.BarButtonItem() Me.bbtnitmCopy = New DevExpress.XtraBars.BarButtonItem() + Me.bsitm_info = New DevExpress.XtraBars.BarStaticItem() Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageGroup2 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() @@ -63,6 +64,23 @@ Partial Class frmCockpitConfig Me.LabelControl_Chart = New DevExpress.XtraEditors.LabelControl() Me.LookUpEditMonitor = New DevExpress.XtraEditors.LookUpEdit() Me.LabelControl_Monitor = New DevExpress.XtraEditors.LabelControl() + Me.XtraTabControl1 = New DevExpress.XtraTab.XtraTabControl() + Me.XtraTabPage1 = New DevExpress.XtraTab.XtraTabPage() + Me.gridAssignedUsers = New DevExpress.XtraGrid.GridControl() + Me.viewAssignedUsers = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.gridAvailableUsers = New DevExpress.XtraGrid.GridControl() + Me.viewAvailableUsers = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.PanelControl1 = New DevExpress.XtraEditors.PanelControl() + Me.LabelControl9 = New DevExpress.XtraEditors.LabelControl() + Me.LabelControl8 = New DevExpress.XtraEditors.LabelControl() + Me.XtraTabPage2 = New DevExpress.XtraTab.XtraTabPage() + Me.PanelControl2 = New DevExpress.XtraEditors.PanelControl() + Me.LabelControl10 = New DevExpress.XtraEditors.LabelControl() + Me.LabelControl11 = New DevExpress.XtraEditors.LabelControl() + Me.GridAvailableGroups = New DevExpress.XtraGrid.GridControl() + Me.ViewAvailableGroups = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.GridAssignedGroups = New DevExpress.XtraGrid.GridControl() + Me.ViewAssignedGroups = New DevExpress.XtraGrid.Views.Grid.GridView() CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.LookUpEdit1.Properties, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.CheckEdit_Cockpit_Active.Properties, System.ComponentModel.ISupportInitialize).BeginInit() @@ -78,6 +96,22 @@ Partial Class frmCockpitConfig CType(Me.LookUpEditProfil.Properties, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.LookUpEditChart.Properties, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.LookUpEditMonitor.Properties, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.XtraTabControl1, System.ComponentModel.ISupportInitialize).BeginInit() + Me.XtraTabControl1.SuspendLayout() + Me.XtraTabPage1.SuspendLayout() + CType(Me.gridAssignedUsers, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.viewAssignedUsers, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.gridAvailableUsers, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.viewAvailableUsers, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.PanelControl1, System.ComponentModel.ISupportInitialize).BeginInit() + Me.PanelControl1.SuspendLayout() + Me.XtraTabPage2.SuspendLayout() + CType(Me.PanelControl2, System.ComponentModel.ISupportInitialize).BeginInit() + Me.PanelControl2.SuspendLayout() + CType(Me.GridAvailableGroups, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.ViewAvailableGroups, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridAssignedGroups, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.ViewAssignedGroups, System.ComponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() ' 'RibbonControl1 @@ -85,10 +119,10 @@ Partial Class frmCockpitConfig Me.RibbonControl1.EmptyAreaImageOptions.ImagePadding = New System.Windows.Forms.Padding(35, 39, 35, 39) Me.RibbonControl1.ExpandCollapseItem.Id = 0 Me.RibbonControl1.Font = New System.Drawing.Font("Segoe UI", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.RibbonControl1.SearchEditItem, Me.BarButtonItem1, Me.BarButtonItem2, Me.bbtnSQL_Data, Me.bbtnSQL_Count, Me.bbtnitm_Save, Me.BarButtonItem4, Me.bbtnitm_NodeOverviewAdd, Me.bbtnitm_NodeProfilAdd, Me.bbtnitmCopy}) + Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.RibbonControl1.SearchEditItem, Me.BarButtonItem1, Me.BarButtonItem2, Me.bbtnSQL_Data, Me.bbtnSQL_Count, Me.bbtnitm_Save, Me.BarButtonItem4, Me.bbtnitm_NodeOverviewAdd, Me.bbtnitm_NodeProfilAdd, Me.bbtnitmCopy, Me.bsitm_info}) Me.RibbonControl1.Location = New System.Drawing.Point(0, 0) Me.RibbonControl1.Margin = New System.Windows.Forms.Padding(4) - Me.RibbonControl1.MaxItemId = 10 + Me.RibbonControl1.MaxItemId = 11 Me.RibbonControl1.Name = "RibbonControl1" Me.RibbonControl1.OptionsMenuMinWidth = 385 Me.RibbonControl1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1}) @@ -159,6 +193,13 @@ Partial Class frmCockpitConfig Me.bbtnitmCopy.ImageOptions.SvgImage = CType(resources.GetObject("bbtnitmCopy.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) Me.bbtnitmCopy.Name = "bbtnitmCopy" ' + 'bsitm_info + ' + Me.bsitm_info.Id = 10 + Me.bsitm_info.ImageOptions.SvgImage = CType(resources.GetObject("bsitm_info.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) + Me.bsitm_info.Name = "bsitm_info" + Me.bsitm_info.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph + ' 'RibbonPage1 ' Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1, Me.RibbonPageGroup2}) @@ -188,7 +229,8 @@ Partial Class frmCockpitConfig ' 'RibbonStatusBar1 ' - Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 566) + Me.RibbonStatusBar1.ItemLinks.Add(Me.bsitm_info) + Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 711) Me.RibbonStatusBar1.Margin = New System.Windows.Forms.Padding(4) Me.RibbonStatusBar1.Name = "RibbonStatusBar1" Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1 @@ -240,8 +282,6 @@ Partial Class frmCockpitConfig ' 'TreeList_Cockpit ' - Me.TreeList_Cockpit.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ - Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) Me.TreeList_Cockpit.Font = New System.Drawing.Font("Tahoma", 9.75!) Me.TreeList_Cockpit.ImageIndexFieldName = "ICON_ID" Me.TreeList_Cockpit.KeyFieldName = "PK_CFG_COCKPIT_DEFINITION_ID" @@ -264,7 +304,7 @@ Partial Class frmCockpitConfig Me.TreeList_Cockpit.OptionsView.TreeLineStyle = DevExpress.XtraTreeList.LineStyle.Dark Me.TreeList_Cockpit.ParentFieldName = "PARENT_ID" Me.TreeList_Cockpit.SelectImageList = Me.ImageCollection1 - Me.TreeList_Cockpit.Size = New System.Drawing.Size(383, 339) + Me.TreeList_Cockpit.Size = New System.Drawing.Size(383, 236) Me.TreeList_Cockpit.TabIndex = 24 ' 'LabelControl2 @@ -465,12 +505,183 @@ Partial Class frmCockpitConfig Me.LabelControl_Monitor.TabIndex = 46 Me.LabelControl_Monitor.Text = "Monitor-Definition" ' + 'XtraTabControl1 + ' + Me.XtraTabControl1.AllowDrop = True + Me.XtraTabControl1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.XtraTabControl1.Location = New System.Drawing.Point(12, 462) + Me.XtraTabControl1.Name = "XtraTabControl1" + Me.XtraTabControl1.SelectedTabPage = Me.XtraTabPage1 + Me.XtraTabControl1.Size = New System.Drawing.Size(921, 242) + Me.XtraTabControl1.TabIndex = 50 + Me.XtraTabControl1.TabPages.AddRange(New DevExpress.XtraTab.XtraTabPage() {Me.XtraTabPage1, Me.XtraTabPage2}) + ' + 'XtraTabPage1 + ' + Me.XtraTabPage1.Controls.Add(Me.gridAssignedUsers) + Me.XtraTabPage1.Controls.Add(Me.gridAvailableUsers) + Me.XtraTabPage1.Controls.Add(Me.PanelControl1) + Me.XtraTabPage1.Name = "XtraTabPage1" + Me.XtraTabPage1.Size = New System.Drawing.Size(919, 219) + Me.XtraTabPage1.Text = "User zu Cockpit" + ' + 'gridAssignedUsers + ' + Me.gridAssignedUsers.AllowDrop = True + Me.gridAssignedUsers.Dock = System.Windows.Forms.DockStyle.Fill + Me.gridAssignedUsers.Location = New System.Drawing.Point(406, 33) + Me.gridAssignedUsers.MainView = Me.viewAssignedUsers + Me.gridAssignedUsers.Name = "gridAssignedUsers" + Me.gridAssignedUsers.Size = New System.Drawing.Size(513, 186) + Me.gridAssignedUsers.TabIndex = 7 + Me.gridAssignedUsers.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.viewAssignedUsers}) + ' + 'viewAssignedUsers + ' + Me.viewAssignedUsers.DetailHeight = 295 + Me.viewAssignedUsers.GridControl = Me.gridAssignedUsers + Me.viewAssignedUsers.Name = "viewAssignedUsers" + Me.viewAssignedUsers.OptionsView.ShowAutoFilterRow = True + Me.viewAssignedUsers.OptionsView.ShowGroupPanel = False + ' + 'gridAvailableUsers + ' + Me.gridAvailableUsers.AllowDrop = True + Me.gridAvailableUsers.Dock = System.Windows.Forms.DockStyle.Left + Me.gridAvailableUsers.Location = New System.Drawing.Point(0, 33) + Me.gridAvailableUsers.MainView = Me.viewAvailableUsers + Me.gridAvailableUsers.Name = "gridAvailableUsers" + Me.gridAvailableUsers.Size = New System.Drawing.Size(406, 186) + Me.gridAvailableUsers.TabIndex = 6 + Me.gridAvailableUsers.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.viewAvailableUsers}) + ' + 'viewAvailableUsers + ' + Me.viewAvailableUsers.DetailHeight = 295 + Me.viewAvailableUsers.GridControl = Me.gridAvailableUsers + Me.viewAvailableUsers.Name = "viewAvailableUsers" + Me.viewAvailableUsers.OptionsBehavior.Editable = False + Me.viewAvailableUsers.OptionsBehavior.ReadOnly = True + Me.viewAvailableUsers.OptionsView.ShowAutoFilterRow = True + Me.viewAvailableUsers.OptionsView.ShowGroupPanel = False + ' + 'PanelControl1 + ' + Me.PanelControl1.Controls.Add(Me.LabelControl9) + Me.PanelControl1.Controls.Add(Me.LabelControl8) + Me.PanelControl1.Dock = System.Windows.Forms.DockStyle.Top + Me.PanelControl1.Location = New System.Drawing.Point(0, 0) + Me.PanelControl1.Name = "PanelControl1" + Me.PanelControl1.Size = New System.Drawing.Size(919, 33) + Me.PanelControl1.TabIndex = 0 + ' + 'LabelControl9 + ' + Me.LabelControl9.Appearance.Font = New System.Drawing.Font("Segoe UI", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.LabelControl9.Appearance.Options.UseFont = True + Me.LabelControl9.Location = New System.Drawing.Point(409, 5) + Me.LabelControl9.Name = "LabelControl9" + Me.LabelControl9.Size = New System.Drawing.Size(106, 17) + Me.LabelControl9.TabIndex = 1 + Me.LabelControl9.Text = "Zugeordnete User" + ' + 'LabelControl8 + ' + Me.LabelControl8.Appearance.Font = New System.Drawing.Font("Segoe UI", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.LabelControl8.Appearance.Options.UseFont = True + Me.LabelControl8.Location = New System.Drawing.Point(5, 5) + Me.LabelControl8.Name = "LabelControl8" + Me.LabelControl8.Size = New System.Drawing.Size(139, 17) + Me.LabelControl8.TabIndex = 0 + Me.LabelControl8.Text = "Nicht zugeordnete User" + ' + 'XtraTabPage2 + ' + Me.XtraTabPage2.Controls.Add(Me.GridAssignedGroups) + Me.XtraTabPage2.Controls.Add(Me.GridAvailableGroups) + Me.XtraTabPage2.Controls.Add(Me.PanelControl2) + Me.XtraTabPage2.Name = "XtraTabPage2" + Me.XtraTabPage2.Size = New System.Drawing.Size(919, 219) + Me.XtraTabPage2.Text = "Gruppe zu Cockpit" + ' + 'PanelControl2 + ' + Me.PanelControl2.Controls.Add(Me.LabelControl10) + Me.PanelControl2.Controls.Add(Me.LabelControl11) + Me.PanelControl2.Dock = System.Windows.Forms.DockStyle.Top + Me.PanelControl2.Location = New System.Drawing.Point(0, 0) + Me.PanelControl2.Name = "PanelControl2" + Me.PanelControl2.Size = New System.Drawing.Size(919, 33) + Me.PanelControl2.TabIndex = 1 + ' + 'LabelControl10 + ' + Me.LabelControl10.Appearance.Font = New System.Drawing.Font("Segoe UI", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.LabelControl10.Appearance.Options.UseFont = True + Me.LabelControl10.Location = New System.Drawing.Point(409, 5) + Me.LabelControl10.Name = "LabelControl10" + Me.LabelControl10.Size = New System.Drawing.Size(130, 17) + Me.LabelControl10.TabIndex = 1 + Me.LabelControl10.Text = "Zugeordnete Gruppen" + ' + 'LabelControl11 + ' + Me.LabelControl11.Appearance.Font = New System.Drawing.Font("Segoe UI", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.LabelControl11.Appearance.Options.UseFont = True + Me.LabelControl11.Location = New System.Drawing.Point(5, 5) + Me.LabelControl11.Name = "LabelControl11" + Me.LabelControl11.Size = New System.Drawing.Size(163, 17) + Me.LabelControl11.TabIndex = 0 + Me.LabelControl11.Text = "Nicht zugeordnete Gruppen" + ' + 'GridAvailableGroups + ' + Me.GridAvailableGroups.AllowDrop = True + Me.GridAvailableGroups.Dock = System.Windows.Forms.DockStyle.Left + Me.GridAvailableGroups.Location = New System.Drawing.Point(0, 33) + Me.GridAvailableGroups.MainView = Me.ViewAvailableGroups + Me.GridAvailableGroups.Name = "GridAvailableGroups" + Me.GridAvailableGroups.Size = New System.Drawing.Size(406, 186) + Me.GridAvailableGroups.TabIndex = 7 + Me.GridAvailableGroups.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.ViewAvailableGroups}) + ' + 'ViewAvailableGroups + ' + Me.ViewAvailableGroups.DetailHeight = 295 + Me.ViewAvailableGroups.GridControl = Me.GridAvailableGroups + Me.ViewAvailableGroups.Name = "ViewAvailableGroups" + Me.ViewAvailableGroups.OptionsBehavior.Editable = False + Me.ViewAvailableGroups.OptionsBehavior.ReadOnly = True + Me.ViewAvailableGroups.OptionsView.ShowAutoFilterRow = True + Me.ViewAvailableGroups.OptionsView.ShowGroupPanel = False + ' + 'GridAssignedGroups + ' + Me.GridAssignedGroups.AllowDrop = True + Me.GridAssignedGroups.Dock = System.Windows.Forms.DockStyle.Fill + Me.GridAssignedGroups.Location = New System.Drawing.Point(406, 33) + Me.GridAssignedGroups.MainView = Me.ViewAssignedGroups + Me.GridAssignedGroups.Name = "GridAssignedGroups" + Me.GridAssignedGroups.Size = New System.Drawing.Size(513, 186) + Me.GridAssignedGroups.TabIndex = 8 + Me.GridAssignedGroups.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.ViewAssignedGroups}) + ' + 'ViewAssignedGroups + ' + Me.ViewAssignedGroups.DetailHeight = 295 + Me.ViewAssignedGroups.GridControl = Me.GridAssignedGroups + Me.ViewAssignedGroups.Name = "ViewAssignedGroups" + Me.ViewAssignedGroups.OptionsView.ShowAutoFilterRow = True + Me.ViewAssignedGroups.OptionsView.ShowGroupPanel = False + ' 'frmCockpitConfig ' Me.Appearance.Options.UseFont = True Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 17.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(974, 588) + Me.ClientSize = New System.Drawing.Size(974, 733) + Me.Controls.Add(Me.XtraTabControl1) Me.Controls.Add(Me.LookUpEditMonitor) Me.Controls.Add(Me.LabelControl_Monitor) Me.Controls.Add(Me.LookUpEditChart) @@ -518,6 +729,24 @@ Partial Class frmCockpitConfig CType(Me.LookUpEditProfil.Properties, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.LookUpEditChart.Properties, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.LookUpEditMonitor.Properties, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.XtraTabControl1, System.ComponentModel.ISupportInitialize).EndInit() + Me.XtraTabControl1.ResumeLayout(False) + Me.XtraTabPage1.ResumeLayout(False) + CType(Me.gridAssignedUsers, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.viewAssignedUsers, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.gridAvailableUsers, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.viewAvailableUsers, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.PanelControl1, System.ComponentModel.ISupportInitialize).EndInit() + Me.PanelControl1.ResumeLayout(False) + Me.PanelControl1.PerformLayout() + Me.XtraTabPage2.ResumeLayout(False) + CType(Me.PanelControl2, System.ComponentModel.ISupportInitialize).EndInit() + Me.PanelControl2.ResumeLayout(False) + Me.PanelControl2.PerformLayout() + CType(Me.GridAvailableGroups, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.ViewAvailableGroups, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridAssignedGroups, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.ViewAssignedGroups, System.ComponentModel.ISupportInitialize).EndInit() Me.ResumeLayout(False) Me.PerformLayout() @@ -562,4 +791,22 @@ Partial Class frmCockpitConfig Friend WithEvents LookUpEditMonitor As DevExpress.XtraEditors.LookUpEdit Friend WithEvents LabelControl_Monitor As DevExpress.XtraEditors.LabelControl Friend WithEvents bbtnitmCopy As DevExpress.XtraBars.BarButtonItem + Friend WithEvents XtraTabControl1 As DevExpress.XtraTab.XtraTabControl + Friend WithEvents XtraTabPage1 As DevExpress.XtraTab.XtraTabPage + Friend WithEvents XtraTabPage2 As DevExpress.XtraTab.XtraTabPage + Friend WithEvents gridAvailableUsers As DevExpress.XtraGrid.GridControl + Friend WithEvents viewAvailableUsers As DevExpress.XtraGrid.Views.Grid.GridView + Friend WithEvents PanelControl1 As DevExpress.XtraEditors.PanelControl + Friend WithEvents LabelControl9 As DevExpress.XtraEditors.LabelControl + Friend WithEvents LabelControl8 As DevExpress.XtraEditors.LabelControl + Friend WithEvents gridAssignedUsers As DevExpress.XtraGrid.GridControl + Friend WithEvents viewAssignedUsers As DevExpress.XtraGrid.Views.Grid.GridView + Friend WithEvents bsitm_info As DevExpress.XtraBars.BarStaticItem + Friend WithEvents PanelControl2 As DevExpress.XtraEditors.PanelControl + Friend WithEvents LabelControl10 As DevExpress.XtraEditors.LabelControl + Friend WithEvents LabelControl11 As DevExpress.XtraEditors.LabelControl + Friend WithEvents GridAssignedGroups As DevExpress.XtraGrid.GridControl + Friend WithEvents ViewAssignedGroups As DevExpress.XtraGrid.Views.Grid.GridView + Friend WithEvents GridAvailableGroups As DevExpress.XtraGrid.GridControl + Friend WithEvents ViewAvailableGroups As DevExpress.XtraGrid.Views.Grid.GridView End Class diff --git a/app/TaskFlow/frmCockpitConfig.resx b/app/TaskFlow/frmCockpitConfig.resx index a9f00db..cf193e2 100644 --- a/app/TaskFlow/frmCockpitConfig.resx +++ b/app/TaskFlow/frmCockpitConfig.resx @@ -297,6 +297,27 @@ MC41LDAsMS0wLjUsMS0xdi01aDVjMC41LDAsMS0wLjUsMS0xICAgVjlMMjEsMnogTTIwLDI4SDZWMTBo OHY1YzAsMC41LDAuNSwxLDEsMWg1VjI4eiBNMjYsMjJoLTR2LTdsLTctN2gtM1Y0aDh2NWMwLDAuNSww LjUsMSwxLDFoNVYyMnoiIGNsYXNzPSJCbGFjayIgLz4NCiAgPC9nPg0KPC9zdmc+Cw== + + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAABsDAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg + MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ + LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5HcmVlbntmaWxsOiMwMzlD + MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh + Y2l0eTowLjU7fQoJLnN0MXtkaXNwbGF5Om5vbmU7fQoJLnN0MntkaXNwbGF5OmlubGluZTtmaWxsOiMw + MzlDMjM7fQoJLnN0M3tkaXNwbGF5OmlubGluZTtmaWxsOiNEMTFDMUM7fQoJLnN0NHtkaXNwbGF5Omlu + bGluZTtmaWxsOiM3MjcyNzI7fQo8L3N0eWxlPg0KICA8ZyBpZD0iQWJvdXQiPg0KICAgIDxwYXRoIGQ9 + Ik0xNiwyQzguMywyLDIsOC4zLDIsMTZzNi4zLDE0LDE0LDE0czE0LTYuMywxNC0xNFMyMy43LDIsMTYs + MnogTTE2LDZjMS4xLDAsMiwwLjksMiwycy0wLjksMi0yLDJzLTItMC45LTItMiAgIFMxNC45LDYsMTYs + NnogTTIwLDI0aC04di0yaDJ2LThoLTJ2LTJoMmg0djEwaDJWMjR6IiBjbGFzcz0iQmx1ZSIgLz4NCiAg + PC9nPg0KPC9zdmc+Cw== diff --git a/app/TaskFlow/frmCockpitConfig.vb b/app/TaskFlow/frmCockpitConfig.vb index 2318f97..76856c6 100644 --- a/app/TaskFlow/frmCockpitConfig.vb +++ b/app/TaskFlow/frmCockpitConfig.vb @@ -1,5 +1,6 @@ Imports DevExpress.XtraBars.Ribbon Imports DigitalData.GUIs.Common +Imports taskFLOW.DD_DMSLiteDataSetTableAdapters Public Class frmCockpitConfig Private Selected_Cockpit_ID As Integer @@ -203,6 +204,8 @@ Public Class frmCockpitConfig Selected_Cockpit_ID = LookUpEdit1.EditValue CheckEdit_Cockpit_Active.Checked = LookUpEdit1.Properties.GetDataSourceValue("ACTIVE", LookUpEdit1.ItemIndex) Load_TBTF_CFG_COCKPIT_DEFINITION() + Load_Free_User_2_Cockpit() + Load_Assigned_User_2_Cockpit() Catch ex As Exception LOGGER.Error($"Error in LookUpEdit1_EditValueChanged: {ex.Message}") End Try @@ -503,6 +506,10 @@ Public Class frmCockpitConfig Else LOGGER.Debug("No TreeList nodes found - falling back to Decide_Load") End If + + ' ===== DRAG & DROP INITIALISIEREN ===== + Initialize_DragDrop_User() + Initialize_DragDrop_Groups() End Sub Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) @@ -564,7 +571,7 @@ Public Class frmCockpitConfig End Sub Private Sub Load_Monitor_LookUp() Try - Dim oSQL = "SELECT 0 ID UNION SELECT DISTINCT COCKPIT_ID ID FROM TBPM_MONITOR_KONFIG WITH (NOLOCK) ORDER BY COCKPIT_ID" + Dim oSQL = "SELECT 0 ID UNION SELECT DISTINCT COCKPIT_ID ID FROM TBPM_MONITOR_KONFIG WITH (NOLOCK) ORDER BY ID" Dim oDT = DatabaseFallback.GetDatatableECM(oSQL) LookUpEditMonitor.Properties.DataSource = oDT @@ -928,4 +935,504 @@ Public Class frmCockpitConfig LOGGER.Error(ex) End Try End Sub + Private Sub Load_Assigned_User_2_Cockpit() + Try + Dim oSQL = $"SELECT + CP_MAP.PK_MAP_COCKPIT_ID + ,FK_CFG_USER_ID + ,USR.USERNAME [Username] + ,USR.EMAIL [Email] + ,[SEQUENCE] [Reihenfolge] + FROM + TBTF_MAP_COCKPIT CP_MAP (NOLOCK) INNER JOIN + TBTF_CFG_COCKPIT CP_CONF (NOLOCK) ON CP_MAP.FK_CFG_COCKPIT_ID = CP_CONF.PK_CFG_COCKPIT_ID + INNER JOIN TBDD_USER USR (NOLOCK) ON CP_MAP.FK_CFG_USER_ID = USR.GUID + WHERE + CP_MAP.FK_CFG_COCKPIT_ID = {Selected_Cockpit_ID}" + Dim oDT As DataTable = DatabaseFallback.GetDatatableECM(oSQL) + viewAssignedUsers.Columns.Clear() + gridAssignedUsers.DataSource = oDT + ' Spalten ausblenden + If viewAssignedUsers.Columns("PK_MAP_COCKPIT_ID") IsNot Nothing Then + viewAssignedUsers.Columns("PK_MAP_COCKPIT_ID").Visible = False + End If + If viewAssignedUsers.Columns("FK_CFG_USER_ID") IsNot Nothing Then + viewAssignedUsers.Columns("FK_CFG_USER_ID").Visible = False + End If + + ' ===== DROPDOWN FÜR REIHENFOLGE KONFIGURIEREN ===== + Setup_Sequence_Dropdown(viewAssignedUsers) + + Catch ex As Exception + LOGGER.Error($"Error in Load_User_2_Cockpit: {ex.Message}") + End Try + End Sub + Private Sub Load_Free_User_2_Cockpit() + Try + Dim oSQL = $"SELECT + USR.GUID AS USR_ID + ,USR.USERNAME [Username] + ,USR.NAME + ', ' + USR.PRENAME AS [Name, Vorname] + ,USR.EMAIL [Email] + FROM + TBDD_USER USR (NOLOCK) WHERE + USR.GUID NOT IN ( + SELECT + CP_MAP.FK_CFG_USER_ID + FROM + TBTF_MAP_COCKPIT CP_MAP (NOLOCK) + WHERE + CP_MAP.FK_CFG_COCKPIT_ID = {Selected_Cockpit_ID} AND CP_MAP.FK_CFG_USER_ID IS NOT NULL)" + Dim oDT As DataTable = DatabaseFallback.GetDatatableECM(oSQL) + viewAvailableUsers.Columns.Clear() + gridAvailableUsers.DataSource = oDT + ' Spalten ausblenden + If viewAvailableUsers.Columns("USR_ID") IsNot Nothing Then + viewAvailableUsers.Columns("USR_ID").Visible = False + End If + Catch ex As Exception + LOGGER.Error($"Error in Load_FreeUser_2_Cockpit: {ex.Message}") + End Try + End Sub + Private Sub Load_Assigned_Groups_2_Cockpit() + Try + Dim oSQL = $"SELECT + CP_MAP.PK_MAP_COCKPIT_ID, FK_CFG_GROUP_ID, GRP.NAME [Groupname], [SEQUENCE] [Reihenfolge] + FROM + TBTF_MAP_COCKPIT CP_MAP (NOLOCK) INNER JOIN + TBTF_CFG_COCKPIT CP_CONF (NOLOCK) ON CP_MAP.FK_CFG_COCKPIT_ID = CP_CONF.PK_CFG_COCKPIT_ID + INNER JOIN TBDD_GROUPS GRP (NOLOCK) ON CP_MAP.FK_CFG_GROUP_ID = GRP.GUID + WHERE + CP_MAP.FK_CFG_COCKPIT_ID = {Selected_Cockpit_ID}" + Dim oDT As DataTable = DatabaseFallback.GetDatatableECM(oSQL) + ViewAssignedGroups.Columns.Clear() + GridAssignedGroups.DataSource = oDT + ' Spalten ausblenden + If ViewAssignedGroups.Columns("PK_MAP_COCKPIT_ID") IsNot Nothing Then + ViewAssignedGroups.Columns("PK_MAP_COCKPIT_ID").Visible = False + End If + If ViewAssignedGroups.Columns("FK_CFG_GROUP_ID") IsNot Nothing Then + ViewAssignedGroups.Columns("FK_CFG_GROUP_ID").Visible = False + End If + + ' ===== DROPDOWN FÜR REIHENFOLGE KONFIGURIEREN ===== + Setup_Sequence_Dropdown(ViewAssignedGroups) + + Catch ex As Exception + LOGGER.Error($"Error in Load_Assigned_Groups_2_Cockpit: {ex.Message}") + End Try + End Sub + Private Sub Load_Free_Groups_2_Cockpit() + Try + Dim oSQL = $"SELECT + GRP.GUID AS GRP_ID + ,GRP.NAME [Groupname] + FROM + TBDD_GROUPS GRP (NOLOCK) WHERE + GRP.GUID NOT IN ( + SELECT + CP_MAP.FK_CFG_GROUP_ID + FROM + TBTF_MAP_COCKPIT CP_MAP (NOLOCK) + WHERE + CP_MAP.FK_CFG_COCKPIT_ID = {Selected_Cockpit_ID} AND CP_MAP.FK_CFG_GROUP_ID IS NOT NULL) + ORDER BY [Groupname]" + Dim oDT As DataTable = DatabaseFallback.GetDatatableECM(oSQL) + ViewAvailableGroups.Columns.Clear() + GridAvailableGroups.DataSource = oDT + ' Spalten ausblenden + If ViewAvailableGroups.Columns("GRP_ID") IsNot Nothing Then + ViewAvailableGroups.Columns("GRP_ID").Visible = False + End If + Catch ex As Exception + LOGGER.Error($"Error in Load_Free_Groups_2_Cockpit: {ex.Message}") + End Try + End Sub + ' ===== DROPDOWN FÜR REIHENFOLGE-SPALTE EINRICHTEN ===== + Private Sub Setup_Sequence_Dropdown(pGridView As DevExpress.XtraGrid.Views.Grid.GridView) + Try + If pGridView.Columns("Reihenfolge") Is Nothing Then + LOGGER.Warn("Spalte 'Reihenfolge' nicht gefunden") + Exit Sub + End If + ' ComboBox-Editor erstellen + Dim comboEdit As New DevExpress.XtraEditors.Repository.RepositoryItemComboBox() + + ' Werte 1-10 hinzufügen + For i As Integer = 1 To 10 + comboEdit.Items.Add(i) + Next + + ' ComboBox-Eigenschaften + comboEdit.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor ' Nur Auswahl, keine manuelle Eingabe + comboEdit.DropDownRows = 10 ' Alle Werte auf einmal anzeigen + + ' Editor der Spalte zuweisen + pGridView.Columns("Reihenfolge").ColumnEdit = comboEdit + + ' Spalte editierbar machen + pGridView.OptionsBehavior.Editable = True + pGridView.Columns("Reihenfolge").OptionsColumn.AllowEdit = True + If pGridView.Name = "viewAssignedUsers" Then + If pGridView.Columns("Username") IsNot Nothing Then + pGridView.Columns("Username").OptionsColumn.AllowEdit = False + End If + If pGridView.Columns("Email") IsNot Nothing Then + pGridView.Columns("Email").OptionsColumn.AllowEdit = False + End If + Else + If pGridView.Columns("Groupname") IsNot Nothing Then + pGridView.Columns("Groupname").OptionsColumn.AllowEdit = False + End If + + End If + LOGGER.Debug("Reihenfolge-Dropdown erfolgreich konfiguriert") + + Catch ex As Exception + LOGGER.Error($"Error in Setup_Sequence_Dropdown: {ex.Message}") + End Try + End Sub + + ' ===== EVENT-HANDLER FÜR WERTVALIDIERUNG IN DER GRID-ZELLE ===== + Private Sub ValidateSequenceEditor(sender As Object, e As DevExpress.XtraEditors.Controls.BaseContainerValidateEditorEventArgs) Handles viewAssignedUsers.ValidatingEditor, ViewAssignedGroups.ValidatingEditor + Try + Dim view As DevExpress.XtraGrid.Views.Grid.GridView = CType(sender, DevExpress.XtraGrid.Views.Grid.GridView) + + ' Nur bei Änderung der Reihenfolge-Spalte reagieren + If view.FocusedColumn.FieldName <> "Reihenfolge" Then + Exit Sub + End If + + ' PK_MAP_COCKPIT_ID aus der aktuellen Zeile holen + Dim mapId As Object = view.GetFocusedRowCellValue("PK_MAP_COCKPIT_ID") + + If mapId Is Nothing OrElse IsDBNull(mapId) Then + LOGGER.Warn("PK_MAP_COCKPIT_ID ist NULL - Update abgebrochen") + e.Valid = False + e.ErrorText = "Ungültige Zeile" + Exit Sub + End If + + ' Alten Wert holen + Dim oldValue As Object = view.GetFocusedRowCellValue("Reihenfolge") + + ' Neuen Reihenfolge-Wert validieren + Dim newSequence As Integer + If Not Integer.TryParse(e.Value?.ToString(), newSequence) Then + LOGGER.Warn($"Ungültiger Reihenfolge-Wert: {e.Value}") + e.Valid = False + e.ErrorText = "Bitte geben Sie eine gültige Zahl ein (1-10)" + Exit Sub + End If + + ' Prüfen ob Wert im erlaubten Bereich liegt + If newSequence < 1 OrElse newSequence > 10 Then + e.Valid = False + e.ErrorText = "Reihenfolge muss zwischen 1 und 10 liegen" + Exit Sub + End If + + ' UPDATE-Statement ausführen + Dim updateSQL = $"UPDATE TBTF_MAP_COCKPIT + SET SEQUENCE = {newSequence}, + CHANGED_WHO = '{Environment.UserName}', + CHANGED_WHEN = GETDATE() + WHERE PK_MAP_COCKPIT_ID = {mapId}" + + If DatabaseFallback.ExecuteNonQueryECM(updateSQL) Then + bsitm_info_Display($"Reihenfolge für MAP_ID={mapId} auf {newSequence} aktualisiert (alter Wert: {oldValue})") + e.Valid = True + Else + LOGGER.Error($"Fehler beim Update der Reihenfolge für MAP_ID={mapId}") + bsitm_info_Display($"Fehler beim Update der Reihenfolge für MAP_ID={mapId}", True) + e.Valid = False + e.ErrorText = "Fehler beim Speichern in der Datenbank. Prüfen Sie das Log." + End If + + Catch ex As Exception + LOGGER.Error($"Error in ValidateSequenceEditor: {ex.Message}") + LOGGER.Error(ex) + bsitm_info_Display($"Fehler: {ex.Message}", True) + e.Valid = False + e.ErrorText = $"Fehler: {ex.Message}" + End Try + End Sub + Sub bsitm_info_Display(msg As String, Optional err As Boolean = False) + If msg IsNot Nothing Then + bsitm_info.Caption = msg + bsitm_info.Visibility = DevExpress.XtraBars.BarItemVisibility.Always + bsitm_info.ItemAppearance.Normal.ForeColor = Color.White + Else + bsitm_info.Visibility = DevExpress.XtraBars.BarItemVisibility.Never + End If + End Sub + + ' ===== DRAG & DROP INITIALISIERUNG (im Form_Load oder Shown) ===== + Private Sub Initialize_DragDrop_User() + ' Ziel-Grids müssen Drop erlauben + gridAssignedUsers.AllowDrop = True + gridAvailableUsers.AllowDrop = True + + ' Event-Handler für Drag-Start registrieren + AddHandler viewAvailableUsers.MouseDown, AddressOf viewAvailableUsers_MouseDown + AddHandler viewAvailableUsers.MouseMove, AddressOf viewAvailableUsers_MouseMove + AddHandler viewAssignedUsers.MouseDown, AddressOf viewAssignedUsers_MouseDown + AddHandler viewAssignedUsers.MouseMove, AddressOf viewAssignedUsers_MouseMove + + ' Event-Handler für Drag-Over registrieren + AddHandler gridAssignedUsers.DragOver, AddressOf gridAssignedUsers_DragOver + AddHandler gridAvailableUsers.DragOver, AddressOf gridAvailableUsers_DragOver + End Sub + Private Sub Initialize_DragDrop_Groups() + ' Ziel-Grids müssen Drop erlauben + GridAssignedGroups.AllowDrop = True + GridAvailableGroups.AllowDrop = True + + ' Event-Handler für Drag-Start registrieren + AddHandler ViewAvailableGroups.MouseDown, AddressOf viewAvailableGroups_MouseDown + AddHandler ViewAvailableGroups.MouseMove, AddressOf viewAvailableGroups_MouseMove + AddHandler ViewAssignedGroups.MouseDown, AddressOf viewAssignedGroups_MouseDown + AddHandler ViewAssignedGroups.MouseMove, AddressOf viewAssignedGroups_MouseMove + + ' Event-Handler für Drag-Over registrieren + AddHandler GridAssignedGroups.DragOver, AddressOf gridAssignedGroups_DragOver + AddHandler GridAvailableGroups.DragOver, AddressOf gridAvailableGroups_DragOver + End Sub + ' ===== DRAG-START VON AVAILABLE USERS ===== + Private dragStartPoint As Point + Private isDragging As Boolean = False + + Private Sub viewAvailableUsers_MouseDown(sender As Object, e As MouseEventArgs) + If e.Button = MouseButtons.Left Then + dragStartPoint = e.Location + isDragging = False + End If + End Sub + Private Sub viewAvailableGroups_MouseDown(sender As Object, e As MouseEventArgs) + If e.Button = MouseButtons.Left Then + dragStartPoint = e.Location + isDragging = False + End If + End Sub + + Private Sub viewAvailableUsers_MouseMove(sender As Object, e As MouseEventArgs) + If e.Button = MouseButtons.Left AndAlso Not isDragging Then + Dim dragDistance = Math.Abs(e.Location.X - dragStartPoint.X) + Math.Abs(e.Location.Y - dragStartPoint.Y) + + If dragDistance > 5 Then ' Mindestbewegung 5 Pixel + isDragging = True + Dim hitInfo = viewAvailableUsers.CalcHitInfo(dragStartPoint) + + If hitInfo.RowHandle >= 0 Then + Dim userId = viewAvailableUsers.GetRowCellValue(hitInfo.RowHandle, "USR_ID") + Dim userName = viewAvailableUsers.GetRowCellValue(hitInfo.RowHandle, "USERNAME") + + If userId IsNot Nothing Then + Dim dragData = $"{userId}|{userName}" + gridAvailableUsers.DoDragDrop(dragData, DragDropEffects.Move) + End If + End If + End If + End If + End Sub + Private Sub viewAvailableGroups_MouseMove(sender As Object, e As MouseEventArgs) + If e.Button = MouseButtons.Left AndAlso Not isDragging Then + Dim dragDistance = Math.Abs(e.Location.X - dragStartPoint.X) + Math.Abs(e.Location.Y - dragStartPoint.Y) + + If dragDistance > 5 Then ' Mindestbewegung 5 Pixel + isDragging = True + Dim hitInfo = ViewAvailableGroups.CalcHitInfo(dragStartPoint) + + If hitInfo.RowHandle >= 0 Then + Dim groupId = ViewAvailableGroups.GetRowCellValue(hitInfo.RowHandle, "GRP_ID") + Dim groupName = ViewAvailableGroups.GetRowCellValue(hitInfo.RowHandle, "Groupname") + + If groupId IsNot Nothing Then + Dim dragData = $"{groupId}|{groupName}" + GridAvailableGroups.DoDragDrop(dragData, DragDropEffects.Move) + End If + End If + End If + End If + End Sub + ' ===== DRAG-START VON ASSIGNED 272|ENVELOPE-ADMINUSERS ===== + Private Sub viewAssignedUsers_MouseDown(sender As Object, e As MouseEventArgs) + If e.Button = MouseButtons.Left Then + dragStartPoint = e.Location + isDragging = False + End If + End Sub + Private Sub viewAssignedGroups_MouseDown(sender As Object, e As MouseEventArgs) + If e.Button = MouseButtons.Left Then + dragStartPoint = e.Location + isDragging = False + End If + End Sub + Private Sub viewAssignedUsers_MouseMove(sender As Object, e As MouseEventArgs) + If e.Button = MouseButtons.Left AndAlso Not isDragging Then + Dim dragDistance = Math.Abs(e.Location.X - dragStartPoint.X) + Math.Abs(e.Location.Y - dragStartPoint.Y) + + If dragDistance > 5 Then + isDragging = True + Dim hitInfo = viewAssignedUsers.CalcHitInfo(dragStartPoint) + + If hitInfo.RowHandle >= 0 Then + Dim mapId = viewAssignedUsers.GetRowCellValue(hitInfo.RowHandle, "PK_MAP_COCKPIT_ID") + Dim userName = viewAssignedUsers.GetRowCellValue(hitInfo.RowHandle, "USERNAME") + + If mapId IsNot Nothing Then + Dim dragData = $"{mapId}|{userName}" + gridAssignedUsers.DoDragDrop(dragData, DragDropEffects.Move) + End If + End If + End If + End If + End Sub + Private Sub viewAssignedGroups_MouseMove(sender As Object, e As MouseEventArgs) + If e.Button = MouseButtons.Left AndAlso Not isDragging Then + Dim dragDistance = Math.Abs(e.Location.X - dragStartPoint.X) + Math.Abs(e.Location.Y - dragStartPoint.Y) + + If dragDistance > 5 Then + isDragging = True + Dim hitInfo = ViewAssignedGroups.CalcHitInfo(dragStartPoint) + + If hitInfo.RowHandle >= 0 Then + Dim mapId = ViewAssignedGroups.GetRowCellValue(hitInfo.RowHandle, "PK_MAP_COCKPIT_ID") + Dim groupName = ViewAssignedGroups.GetRowCellValue(hitInfo.RowHandle, "Groupname") + + If mapId IsNot Nothing Then + Dim dragData = $"{mapId}|{groupName}" + gridAssignedUsers.DoDragDrop(dragData, DragDropEffects.Move) + End If + End If + End If + End If + End Sub + ' ===== DRAG-OVER EVENTS (visuelles Feedback) ===== + Private Sub gridAssignedUsers_DragOver(sender As Object, e As DragEventArgs) + If e.Data.GetDataPresent(DataFormats.Text) Then + e.Effect = DragDropEffects.Move + Else + e.Effect = DragDropEffects.None + End If + End Sub + Private Sub gridAssignedGroups_DragOver(sender As Object, e As DragEventArgs) + If e.Data.GetDataPresent(DataFormats.Text) Then + e.Effect = DragDropEffects.Move + Else + e.Effect = DragDropEffects.None + End If + End Sub + Private Sub gridAvailableUsers_DragOver(sender As Object, e As DragEventArgs) + If e.Data.GetDataPresent(DataFormats.Text) Then + e.Effect = DragDropEffects.Move + Else + e.Effect = DragDropEffects.None + End If + End Sub + Private Sub gridAvailableGroups_DragOver(sender As Object, e As DragEventArgs) + If e.Data.GetDataPresent(DataFormats.Text) Then + e.Effect = DragDropEffects.Move + Else + e.Effect = DragDropEffects.None + End If + End Sub + + Private Sub gridAssignedUsers_DragDrop(sender As Object, e As DragEventArgs) Handles gridAssignedUsers.DragDrop + Try + Dim data As String = e.Data.GetData(DataFormats.Text) + Dim userId As Integer = data.Split("|")(0) + Dim oInsert = $"INSERT INTO [dbo].[TBTF_MAP_COCKPIT] + ([FK_CFG_COCKPIT_ID] + ,[FK_CFG_USER_ID] + ,[SEQUENCE] + ,[ADDED_WHO]) + VALUES + ({Selected_Cockpit_ID}, {userId}, 0, '{USER_USERNAME}')" + + If DatabaseFallback.ExecuteNonQueryECM(oInsert) Then + Load_Free_User_2_Cockpit() + Load_Assigned_User_2_Cockpit() + Else + MsgBox("Fehler beim Hinzufügen des Benutzers. Prüfen Sie Ihr Log", MsgBoxStyle.Exclamation) + End If + Catch ex As Exception + LOGGER.Error(ex) + MsgBox(ex.Message, MsgBoxStyle.Critical, "Error adding users:") + End Try + End Sub + Private Sub gridAssignedGroups_DragDrop(sender As Object, e As DragEventArgs) Handles GridAssignedGroups.DragDrop + Try + Dim data As String = e.Data.GetData(DataFormats.Text) + Dim groupID As Integer = data.Split("|")(0) + Dim oInsert = $"INSERT INTO [dbo].[TBTF_MAP_COCKPIT] + (FK_CFG_COCKPIT_ID + ,FK_CFG_GROUP_ID + ,[SEQUENCE] + ,ADDED_WHO) + VALUES + ({Selected_Cockpit_ID}, {groupID}, 0, '{USER_USERNAME}')" + + If DatabaseFallback.ExecuteNonQueryECM(oInsert) Then + Load_Free_Groups_2_Cockpit() + Load_Assigned_Groups_2_Cockpit() + Else + MsgBox("Fehler beim Hinzufügen der Gruppe. Prüfen Sie Ihr Log", MsgBoxStyle.Exclamation) + End If + Catch ex As Exception + LOGGER.Error(ex) + MsgBox(ex.Message, MsgBoxStyle.Critical, "Error adding groups:") + End Try + End Sub + Private Sub gridAvailableUsers_DragDrop(sender As Object, e As DragEventArgs) Handles gridAvailableUsers.DragDrop + Try + Dim data As String = e.Data.GetData(DataFormats.Text) + Dim MAPID As Integer = data.Split("|")(0) + Dim oDelete = $"DELETE FROM [dbo].[TBTF_MAP_COCKPIT] + WHERE PK_MAP_COCKPIT_ID = {MAPID}" + + If DatabaseFallback.ExecuteNonQueryECM(oDelete) Then + Dim omsg = "Benutzer erfolgreich entfernt." + bsitm_info_Display(omsg) + Load_Free_User_2_Cockpit() + Load_Assigned_User_2_Cockpit() + Else + MsgBox("Fehler beim Entfernen des Benutzers. Prüfen Sie Ihr Log", MsgBoxStyle.Exclamation) + End If + Catch ex As Exception + LOGGER.Error(ex) + MsgBox(ex.Message, MsgBoxStyle.Critical, "Error removing user:") + End Try + End Sub + Private Sub gridAvailableGroups_DragDrop(sender As Object, e As DragEventArgs) Handles GridAvailableGroups.DragDrop + Try + Dim data As String = e.Data.GetData(DataFormats.Text) + Dim MAPID As Integer = data.Split("|")(0) + Dim oDelete = $"DELETE FROM [dbo].[TBTF_MAP_COCKPIT] + WHERE PK_MAP_COCKPIT_ID = {MAPID}" + + If DatabaseFallback.ExecuteNonQueryECM(oDelete) Then + Dim omsg = "Gruppe erfolgreich entfernt." + bsitm_info_Display(omsg) + Load_Free_Groups_2_Cockpit() + Load_Assigned_Groups_2_Cockpit() + Else + MsgBox("Fehler beim Entfernen der Gruppe. Prüfen Sie Ihr Log", MsgBoxStyle.Exclamation) + End If + Catch ex As Exception + LOGGER.Error(ex) + MsgBox(ex.Message, MsgBoxStyle.Critical, "Error removing group:") + End Try + End Sub + Private Sub XtraTabControl1_SelectedPageChanged(sender As Object, e As DevExpress.XtraTab.TabPageChangedEventArgs) Handles XtraTabControl1.SelectedPageChanged + Select Case XtraTabControl1.SelectedTabPageIndex + Case 0 + Load_Assigned_User_2_Cockpit() + Load_Free_User_2_Cockpit() + Case 1 + Load_Assigned_Groups_2_Cockpit() + Load_Free_Groups_2_Cockpit() + End Select + bsitm_info_Display("") + End Sub End Class \ No newline at end of file