diff --git a/app/DD-Record-Organizer/Classes/ClassDOC_SEARCH.vb b/app/DD-Record-Organizer/Classes/ClassDOC_SEARCH.vb index b35a0f7..6911c98 100644 --- a/app/DD-Record-Organizer/Classes/ClassDOC_SEARCH.vb +++ b/app/DD-Record-Organizer/Classes/ClassDOC_SEARCH.vb @@ -527,7 +527,7 @@ Public Class ClassDOC_SEARCH Return False End Try End Function - Public Shared Function SET_WD_RIGHTS(oWMObject As WINDREAMLib.WMObject, RESULT_DOCID As Integer, RESULT_DOC_PATH As String, DeleteRightsBefore As Boolean) + Public Shared Function SET_WD_RIGHTS(oWMObject As WINDREAMLib.WMObject, pDocID As Integer, RESULT_DOC_PATH As String, DeleteRightsBefore As Boolean) Try If CURRENT_RECORD_ID = 0 Then MsgBox("No Record selected - Please select one!", MsgBoxStyle.Exclamation) @@ -535,7 +535,7 @@ Public Class ClassDOC_SEARCH End If LOGGER.Debug("#### SETTING RIGHTS FOR FILE ######") If ClassWDRights.Init = True Then - If ClassWDRights.Doc_Renew_Rights(oWMObject, RESULT_DOCID, RESULT_DOC_PATH, DeleteRightsBefore) Then + If ClassWDRights.Doc_Renew_Rights(oWMObject, pDocID, RESULT_DOC_PATH, DeleteRightsBefore) Then If ClassWDRights.MSG_RESULT <> "" Then Dim msg = "Achtung: einige Rechte konnten nicht gesetzt werden: " & vbCrLf & ClassWDRights.MSG_RESULT If USER_LANGUAGE <> "de-DE" Then diff --git a/app/DD-Record-Organizer/Classes/ClassDocGrid.vb b/app/DD-Record-Organizer/Classes/ClassDocGrid.vb index b1cff46..831fe9c 100644 --- a/app/DD-Record-Organizer/Classes/ClassDocGrid.vb +++ b/app/DD-Record-Organizer/Classes/ClassDocGrid.vb @@ -23,6 +23,8 @@ Public Class ClassDocGrid End Class Private ReadOnly GridView As GridView + ' ✅ NEU: Flag zum Unterdrücken aller Grid-Events während Bulk-Operationen + Public Shared Property IsBulkSelectionActive As Boolean = False Public ReadOnly Property SelectedDocuments As List(Of clsWMDoc) Get @@ -66,6 +68,8 @@ Public Class ClassDocGrid Private Shared _checkValueChangedHandler As EventHandler Private Shared EnableVerboseGridLogging As Boolean = False ' PRODUKTIV: FALSE! Private Shared _isGridRefreshing As Boolean = False + + Private Shared Function Init_Table() Try Dim table As New DataTable With { @@ -684,11 +688,51 @@ Public Class ClassDocGrid End Try End Sub Public Shared Sub GVDoc_Values_FocusedRowChanged(sender As GridView, e As DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs) + If IsBulkSelectionActive Then Return + + LOGGER.Debug("GVDoc_Values_FocusedRowChanged triggered...") Try - ClassDocGrid.GetDocItems(sender) + If sender.FocusedRowHandle < 0 Then Return + + ' Nur die fokussierte Zeile in DT_RESULTFILES speichern (Legacy-Kompatibilität) + If Init_Table() Then + Dim newRow As DataRow = DT_RESULTFILES.NewRow() + Try + Dim oDocID = sender.GetFocusedRowCellValue(sender.Columns("DocID")) + SELECTED_DOC_ID = If(oDocID IsNot Nothing, CInt(oDocID), 0) + newRow("DOC_ID") = SELECTED_DOC_ID ' ✅ DOC_ID wird gesetzt + Catch ex As Exception + newRow("DOC_ID") = 0 + SELECTED_DOC_ID = 0 + End Try + Try + SELECTED_DOC_PATH = sender.GetFocusedRowCellValue(sender.Columns("FULLPATH")) + If IsNothing(SELECTED_DOC_PATH) Then + SELECTED_DOC_PATH = sender.GetFocusedRowCellValue(sender.Columns("FULL_FILENAME")) + End If + newRow("DOC_PATH") = If(SELECTED_DOC_PATH, "") + Catch ex As Exception + newRow("DOC_PATH") = "" + End Try + Try + newRow("OBJECTTYPE") = sender.GetFocusedRowCellValue(sender.Columns("OBJECTTYPE")) + Catch ex As Exception + newRow("OBJECTTYPE") = "" + End Try + Try + Dim dpn = sender.GetFocusedRowCellValue(sender.Columns("Displayname")) + newRow("DISPLAYNAME") = If(IsDBNull(dpn) OrElse dpn Is Nothing, "", dpn) + Catch ex As Exception + newRow("DISPLAYNAME") = "" + End Try + ' ✅ FIX: INWORK-Spalte setzen, sonst ConstraintException beim Add + newRow("INWORK") = False + newRow("ACCESS_RIGHT") = 0 + DT_RESULTFILES.Rows.Add(newRow) + DT_RESULTFILES.AcceptChanges() + End If Catch ex As Exception LOGGER.Warn("Unexpected error in GVDoc_Values_FocusedRowChanged: " & ex.Message) - MsgBox("Unexpected error in GVDoc_Values_FocusedRowChanged: " & ex.Message, MsgBoxStyle.Critical) End Try End Sub Public Shared Sub gridView_MasterRowExpanded(sender As GridView, e As DevExpress.XtraGrid.Views.Grid.CustomMasterRowEventArgs) diff --git a/app/DD-Record-Organizer/Classes/ClassDragDrop.vb b/app/DD-Record-Organizer/Classes/ClassDragDrop.vb index f5fc951..ad982bc 100644 --- a/app/DD-Record-Organizer/Classes/ClassDragDrop.vb +++ b/app/DD-Record-Organizer/Classes/ClassDragDrop.vb @@ -5,6 +5,131 @@ Imports Microsoft.Office.Interop.Outlook Public Class ClassDragDrop Public Shared files_dropped As String() Public Shared Event FilesDroppedReady(ByVal files As String()) + + ''' + ''' Eindeutiges Drag-Format für DocID-Transfers zwischen frmNodeNavigation-Instanzen. + ''' Muss mit frmNodeNavigation.DRAGDROP_FORMAT_DOCID identisch sein. + ''' + Public Shared ReadOnly DRAGDROP_FORMAT_DOCID As String = "DD_RecordOrganizer_DocID" + ''' + ''' Zeichen, die im Dateinamen Probleme bei DB-Import und Dateihandling verursachen können. + ''' + Private Shared ReadOnly ProblematicChars As Char() = { + "'"c, "`"c, ";"c, "%"c, "&"c, "+"c, "#"c, "~"c, + "{"c, "}"c, "["c, "]"c, "^"c, "="c, "@"c + } + + Private Shared Function CheckAndSanitizeFilename(filePath As String) As String + Try + Dim dir As String = Path.GetDirectoryName(filePath) + Dim originalName As String = Path.GetFileNameWithoutExtension(filePath) + Dim ext As String = Path.GetExtension(filePath) + + ' ── 1) Unicode-Normalisierung NFD → NFC ────────────────────────────── + Dim normalizedName As String = originalName.Normalize(System.Text.NormalizationForm.FormC) + Dim hadNormalizationIssue As Boolean = (normalizedName <> originalName) + + If hadNormalizationIssue Then + LOGGER?.Warn($"CheckAndSanitizeFilename: NFD-Encoding erkannt in [{originalName}{ext}]") + + Dim normMsg As String + If USER_LANGUAGE <> "de-DE" Then + normMsg = $"The filename contains Unicode characters in decomposed form (NFD encoding)." & + vbCrLf & vbCrLf & + $"File: {originalName}{ext}" & vbCrLf & vbCrLf & + "This causes garbled characters in the database (e.g. ü → Ru¨ckbau)." & vbCrLf & vbCrLf & + "Please rename the file and try again." & vbCrLf & + "The import of this file has been aborted." + Else + normMsg = $"Der Dateiname enthält nicht sichtbare Unicode-Zeichen in dekomponiierter Form (NFD-Kodierung)." & + vbCrLf & vbCrLf & + $"Datei: {originalName}{ext}" & vbCrLf & vbCrLf & + "Dies kann zu kryptischen Zeichen in der Datenbank (z.B. ü → Ru¨ckbau) oder Problemen beim Import nach windream führen." & vbCrLf & vbCrLf & + "Ursache dafür kann sein, das die Datei aus einer NICHT Windows Umgebung erstellt wurde. (MacOS, Linux etc)" & vbCrLf & + "Bitte benennen Sie die Datei um und versuchen Sie es erneut." & vbCrLf & + "Der Import dieser Datei wurde abgebrochen." + End If + + Dim normCaption As String = If(USER_LANGUAGE <> "de-DE", "Invalid Filename", "Ungültiger Dateiname") + MessageBox.Show(normMsg, normCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning) + LOGGER?.Warn($"CheckAndSanitizeFilename: Import abgebrochen wegen NFD-Problem [{originalName}{ext}].") + Return Nothing + End If + + ' ── 2) Leerzeichen-Probleme prüfen (führend, abschließend, doppelt) ── + Dim hasLeadingOrTrailingSpace As Boolean = (originalName <> originalName.Trim()) + Dim hasDoubleSpace As Boolean = originalName.Contains(" ") ' zwei aufeinanderfolgende Leerzeichen + + If hasLeadingOrTrailingSpace OrElse hasDoubleSpace Then + LOGGER?.Warn($"CheckAndSanitizeFilename: Leerzeichen-Problem in [{originalName}{ext}]") + + Dim spaceMsg As String + If USER_LANGUAGE <> "de-DE" Then + spaceMsg = $"The filename contains leading, trailing or consecutive spaces:" & + vbCrLf & vbCrLf & + $"File: ""{originalName}{ext}""" & vbCrLf & vbCrLf & + "This can cause problems during database import or file comparisons." & vbCrLf & vbCrLf & + "Please rename the file (remove extra spaces) and try again." & vbCrLf & + "The import of this file has been aborted." + Else + spaceMsg = $"Der Dateiname enthält führende, abschließende oder doppelte Leerzeichen:" & + vbCrLf & vbCrLf & + $"Datei: ""{originalName}{ext}""" & vbCrLf & vbCrLf & + "Dies kann beim Datenbankimport oder Dateivergleichen zu Problemen führen." & vbCrLf & vbCrLf & + "Bitte benennen Sie die Datei um (Leerzeichen entfernen) und versuchen Sie es erneut." & vbCrLf & + "Der Import dieser Datei wurde abgebrochen." + End If + + Dim spaceCaption As String = If(USER_LANGUAGE <> "de-DE", "Invalid Filename", "Ungültiger Dateiname") + MessageBox.Show(spaceMsg, spaceCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning) + LOGGER?.Warn($"CheckAndSanitizeFilename: Import abgebrochen wegen Leerzeichen-Problem [{originalName}{ext}].") + Return Nothing + End If + + ' ── 3) Problematische Sonderzeichen prüfen ─────────────────────────── + Dim found As New System.Text.StringBuilder() + For Each c As Char In ProblematicChars + If originalName.IndexOf(c) >= 0 Then + If found.Length > 0 Then found.Append(" ") + found.Append($"'{c}'") + End If + Next + + If found.Length = 0 Then + Return filePath + End If + + LOGGER?.Warn($"CheckAndSanitizeFilename: Problematische Zeichen in [{originalName}{ext}]: {found}") + + Dim msg As String + If USER_LANGUAGE <> "de-DE" Then + msg = $"The filename contains characters that cause problems during database import or file handling:" & + vbCrLf & vbCrLf & + $"File: {originalName}{ext}" & vbCrLf & + $"Problematic chars: {found}" & vbCrLf & vbCrLf & + "Please rename the file and try again." & vbCrLf & + "The import of this file has been aborted." + Else + msg = $"Der Dateiname enthält nicht sichtbare Zeichen, die beim Datenbankimport oder späteren Dateihandling in windream Probleme verursachen:" & + vbCrLf & vbCrLf & + $"Datei: {originalName}{ext}" & vbCrLf & + $"Problematische Zeichen: {found}" & vbCrLf & vbCrLf & + "Ursache dafür kann sein, das die Datei aus einer NICHT Windows Umgebung erstellt wurde. (MacOS, Linux etc)" & vbCrLf & + "Bitte benennen Sie die Datei um und versuchen Sie es erneut." & vbCrLf & + "Der Import dieser Datei wurde abgebrochen." + End If + + Dim caption As String = If(USER_LANGUAGE <> "de-DE", "Invalid Filename", "Ungültiger Dateiname") + MessageBox.Show(msg, caption, MessageBoxButtons.OK, MessageBoxIcon.Warning) + LOGGER?.Warn($"CheckAndSanitizeFilename: Import abgebrochen für [{originalName}{ext}].") + Return Nothing + + Catch ex As System.Exception + LOGGER?.Warn("CheckAndSanitizeFilename Fehler: " & ex.Message) + Return filePath + End Try + End Function + Public Shared Function Drop_File(e As DragEventArgs) Try LOGGER.Debug("In Drop_File....") @@ -12,10 +137,6 @@ Public Class ClassDragDrop files_dropped = New String() {} - ' WICHTIG: DB-Löschung NICHT im UI-Thread erzwingen. - ' => Verschiebe in aufrufenden Code per BeginInvoke/Task.Run (siehe Kommentar unten). - ' MYDB_ECM?.ExecuteNonQuery(Sql) - Dim hasOutlookUnicode As Boolean = e.Data.GetDataPresent("FileGroupDescriptorW") Dim hasOutlookAnsi As Boolean = e.Data.GetDataPresent("FileGroupDescriptor") Dim hasOutlookContents As Boolean = e.Data.GetDataPresent("FileContents") @@ -30,16 +151,14 @@ Public Class ClassDragDrop End If '2) ATTACHMENT oder komplette Mail aus Outlook/WebView2: KEIN Descriptor+Contents, ABER FileDrop vorhanden - ' => zuerst FileDrop verarbeiten. Wenn leer (delayed rendering), dann Fallback über Outlook COM Selection/Inspector If hasFileDrop AndAlso (hasChromiumMime OrElse hasFileNameW) AndAlso Not hasOutlookContents Then LOGGER?.Debug("WebView2/Outlook Attachment or Mail: try FileDrop, skip Outlook COM initially") Dim ok As Boolean = HandleFileDrop(e) If ok Then Return True - ' FileDrop leer -> Fallback: versuche ausgewählte Mail via Outlook COM zu speichern LOGGER?.Warn("FileDrop vorhanden, aber leer. Fallback auf Outlook COM für komplette Mail.") ScheduleOutlookComFallback() - Return True ' Wichtig: UI-Thread nicht blockieren; wir verarbeiten asynchron. + Return True End If '3) Outlook Mail (.msg): Descriptor ohne Contents ODER Chromium/WebView2 Indikatoren – nur wenn KEIN FileDrop vorhanden @@ -70,7 +189,6 @@ Public Class ClassDragDrop Return True Else LOGGER?.Warn("Outlook: Keine Auswahl im Explorer und kein ActiveInspector.CurrentItem verfügbar.") - ' Namen loggen – aber zurück zum FileDrop-Fallback If hasFileNameW Then Dim namesObj As Object = e.Data.GetData(If(e.Data.GetDataPresent("FileNameW"), "FileNameW", "FileName"), True) Dim names As String() = TryCast(namesObj, String()) @@ -116,13 +234,11 @@ CheckFileDrop: LOGGER?.Warn("Drop_File: Kein extrahierbarer Inhalt. Bitte Attachment aus der Nachrichtenliste ziehen oder zunächst speichern.") Return False - - End Function + ' FileDrop defensiv behandeln – erst ohne, dann mit autoConvert Private Shared Function HandleFileDrop(e As DragEventArgs) As Boolean Try - ' Versuch1: ohne AutoConvert Dim rawObj As Object = e.Data.GetData(DataFormats.FileDrop) Dim rawFiles As String() = TryCast(rawObj, String()) If Not (rawFiles Is Nothing OrElse rawFiles.Length = 0) Then @@ -133,7 +249,6 @@ CheckFileDrop: Return True End If - ' Versuch2: mit AutoConvert (delayed rendering) Dim convObj As Object = e.Data.GetData(DataFormats.FileDrop, True) Dim convFiles As String() = TryCast(convObj, String()) If Not (convFiles Is Nothing OrElse convFiles.Length = 0) Then @@ -151,11 +266,21 @@ CheckFileDrop: Return False End Try End Function - Private Shared Sub AppendDroppedFile(prefix As String, filePath As String) + + ''' + ''' Hängt eine Datei an files_dropped an – mit vorheriger Sonderzeichen-Prüfung. + ''' Gibt False zurück wenn der Dateiname ungültig ist. + ''' + Private Shared Function AppendDroppedFile(prefix As String, filePath As String) As Boolean + Dim checkedPath As String = CheckAndSanitizeFilename(filePath) + If checkedPath Is Nothing Then + Return False + End If Dim idx As Integer = files_dropped.Length ReDim Preserve files_dropped(idx) - files_dropped(idx) = prefix & filePath - End Sub + files_dropped(idx) = prefix & checkedPath + Return True + End Function Private Shared Sub SaveMailItemToTemp(ByVal mailObj As Object) Dim subj As String = "" @@ -197,7 +322,6 @@ CheckFileDrop: Next If saved Then - ' UI-Thread benachrichtigen Dim uiForm = If(System.Windows.Forms.Application.OpenForms.Count > 0, System.Windows.Forms.Application.OpenForms(0), Nothing) If uiForm IsNot Nothing Then uiForm.BeginInvoke( @@ -209,7 +333,6 @@ CheckFileDrop: End Try End Sub) Else - ' Falls kein Form verfügbar, zumindest Event auslösen (Listener müssen ggf. selbst marshalen) RaiseEvent FilesDroppedReady(files_dropped) End If Else @@ -270,6 +393,12 @@ CheckFileDrop: Public Shared Sub Drag_enter(e As DragEventArgs) Try My.Settings.WD_INDEXDOKART_SAVE = "" + ' ✅ DocID-Format hat Vorrang – Early Exit + If e.Data.GetDataPresent(DRAGDROP_FORMAT_DOCID) Then + e.Effect = DragDropEffects.Copy + LOGGER?.Debug("DragEnter ... DocID-Format erkannt (Inter-Instance Transfer)") + Return + End If Dim hasOutlookUnicode As Boolean = e.Data.GetDataPresent("FileGroupDescriptorW") Dim hasOutlookAnsi As Boolean = e.Data.GetDataPresent("FileGroupDescriptor") @@ -297,5 +426,4 @@ CheckFileDrop: End Try End Sub - -End Class +End Class \ No newline at end of file diff --git a/app/DD-Record-Organizer/Classes/ClassHelper.vb b/app/DD-Record-Organizer/Classes/ClassHelper.vb index dfc0534..6d67ed5 100644 --- a/app/DD-Record-Organizer/Classes/ClassHelper.vb +++ b/app/DD-Record-Organizer/Classes/ClassHelper.vb @@ -258,24 +258,26 @@ Public Class ClassHelper End If ' ###### Prozess starten ###### + ' Prozess kann Nothing sein, wenn eine bestehende Anwendung (z. B. Outlook) + ' die Datei übernimmt, ohne einen neuen Prozess zu erstellen. + If oMyProcess IsNot Nothing Then + Dim ProcID As Integer = oMyProcess.Id + LOGGER.Debug($"Started process ID {ProcID} for document [{BW_DocPath}].") - ' ID des gestarteten Prozesses holen (nicht den eigenen!) - Dim ProcID As Integer = oMyProcess.Id - LOGGER.Debug($"Started process ID {ProcID} for document [{BW_DocPath}].") + oMyProcess.WaitForExit() - ' Warten, bis der Benutzer das Dokument geschlossen hat - oMyProcess.WaitForExit() - - ' Nachbearbeitung, wenn Format bearbeitbar ist - oExtension = Path.GetExtension(BW_DocPath).ToLower() - LOGGER.Debug($"Checking if file extension [{oExtension}] may change during edit...") - - If FILE_FORMATS_CHANGE_DURING_EDIT.Contains(oExtension) And oOverrideRunPath = "" Then - LOGGER.Debug("Create possible Document change in TBPMO_DOC_ID_CHANGED.") - Dim oInsert = $"INSERT INTO TBPMO_DOC_ID_CHANGED (USER_ID,PROCESS_ID,VERSION_ID,OLD_DOC_ID,NEW_DOC_ID,DOC_PATH) VALUES (" & - $"{USER_GUID},'{ProcID}',9999,{BW_DocID},0,'{BW_DocPath}')" - MYDB_ECM.ExecuteNonQuery(oInsert) + oExtension = Path.GetExtension(BW_DocPath).ToLower() + LOGGER.Debug($"Checking if file extension [{oExtension}] may change during edit...") + If FILE_FORMATS_CHANGE_DURING_EDIT.Contains(oExtension) And oOverrideRunPath = "" Then + LOGGER.Debug("Create possible Document change in TBPMO_DOC_ID_CHANGED.") + Dim oInsert = $"INSERT INTO TBPMO_DOC_ID_CHANGED (USER_ID,PROCESS_ID,VERSION_ID,OLD_DOC_ID,NEW_DOC_ID,DOC_PATH) VALUES (" & + $"{USER_GUID},'{ProcID}',9999,{BW_DocID},0,'{BW_DocPath}')" + MYDB_ECM.ExecuteNonQuery(oInsert) + End If + Else + ' Kein neuer Prozess gestartet – Datei wurde von bestehender Anwendung übernommen + LOGGER.Debug($"No new process created for [{BW_DocPath}]. File likely handled by existing application (e.g. Outlook).") End If Catch ex As Exception @@ -508,7 +510,7 @@ Public Class ClassHelper End Function Public Shared Function Insert_USER_File(pFilename As String, handleType As String) Try - Dim filename_only As String = Path.GetFileName(pFilename) + Dim oImport_filename_only As String = Path.GetFileName(pFilename) Dim CURRENT_FILE_HASH = "" If File.Exists(pFilename) Then @@ -539,16 +541,16 @@ Public Class ClassHelper Dim oMSG As String If USER_LANGUAGE <> "de-DE" Then - oMSG = $"This file has already been imported into orgFLOW!" & vbCrLf & - $"File: [{oFilename}]" & vbCrLf & + oMSG = $"This file [{oImport_filename_only}] has already been imported into orgFLOW!" & vbCrLf & + $"File already imported: [{oFilename}]" & vbCrLf & $"Imported on: {oADDED_WHEN}" & vbCrLf & $"Imported by: {oUSER}" & vbCrLf & $"Total imports with identical content: {oDTCHECK.Rows.Count}" & vbCrLf & vbCrLf & "Do you want to import this file again?" & vbCrLf & - "NO → Teh complete Import will be cancelled." + "NO → The complete import will be cancelled." Else - oMSG = $"Diese Datei wurde bereits in orgFLOW importiert!" & vbCrLf & - $"Datei: [{oFilename}]" & vbCrLf & + oMSG = $"Diese Datei [{oImport_filename_only}] wurde bereits in orgFLOW importiert!" & vbCrLf & + $"Bereits vorhandene Datei: [{oFilename}]" & vbCrLf & $"Importiert am: {oADDED_WHEN}" & vbCrLf & $"Importiert von: {oUSER}" & vbCrLf & $"Anzahl Importe mit identischem Inhalt: {oDTCHECK.Rows.Count}" & vbCrLf & vbCrLf & @@ -560,10 +562,10 @@ Public Class ClassHelper result = MessageBox.Show(oMSG, CAPTION_CONFIRMATION, MessageBoxButtons.YesNo, MessageBoxIcon.Question) If result = MsgBoxResult.No Then - LOGGER.Info($"User wählte NEIN bei Hash-Duplikat-Check für [{filename_only}] - Import abgebrochen") + LOGGER.Info($"User wählte NEIN bei Hash-Duplikat-Check für [{oImport_filename_only}] - Import abgebrochen") Return False Else - LOGGER.Info($"User wählte JA bei Hash-Duplikat-Check für [{filename_only}] - fahre fort") + LOGGER.Info($"User wählte JA bei Hash-Duplikat-Check für [{oImport_filename_only}] - fahre fort") End If End If End If @@ -580,7 +582,7 @@ Public Class ClassHelper End If ' ✅ INSERT mit explizitem Logging - Dim ins As String = String.Format("INSERT INTO TBPMO_FILES_USER (FILENAME2WORK, USER_WORK, HANDLE_TYPE, FILENAME_ONLY, FILE_HASH) VALUES ('{0}','{1}','{2}','{3}','{4}')", pFilename, USER_USERNAME, handleType, filename_only, CURRENT_FILE_HASH) + Dim ins As String = String.Format("INSERT INTO TBPMO_FILES_USER (FILENAME2WORK, USER_WORK, HANDLE_TYPE, FILENAME_ONLY, FILE_HASH) VALUES ('{0}','{1}','{2}','{3}','{4}')", pFilename, USER_USERNAME, handleType, oImport_filename_only, CURRENT_FILE_HASH) LOGGER.Debug($"Führe INSERT aus: [{ins}]") Dim insertResult = MYDB_ECM.ExecuteNonQuery(ins) @@ -593,12 +595,12 @@ Public Class ClassHelper If verifyDT IsNot Nothing AndAlso verifyDT.Rows.Count > 0 Then Dim insertedGUID = verifyDT.Rows(0)("GUID") Dim insertedADDED_WHEN = verifyDT.Rows(0)("ADDED_WHEN") - LOGGER.Info($"INSERT ERFOLGREICH: GUID={insertedGUID}, ADDED_WHEN={insertedADDED_WHEN}, Datei=[{filename_only}]") + LOGGER.Info($"INSERT ERFOLGREICH: GUID={insertedGUID}, ADDED_WHEN={insertedADDED_WHEN}, Datei=[{oImport_filename_only}]") Else - LOGGER.Error($"INSERT fehlgeschlagen (VERIFY)! Datei=[{filename_only}], Hash=[{CURRENT_FILE_HASH}]") + LOGGER.Error($"INSERT fehlgeschlagen (VERIFY)! Datei=[{oImport_filename_only}], Hash=[{CURRENT_FILE_HASH}]") End If Else - LOGGER.Error($"INSERT fehlgeschlagen (ExecuteNonQuery)! Datei=[{filename_only}]") + LOGGER.Error($"INSERT fehlgeschlagen (ExecuteNonQuery)! Datei=[{oImport_filename_only}]") End If Return insertResult diff --git a/app/DD-Record-Organizer/Classes/ClassWDRights.vb b/app/DD-Record-Organizer/Classes/ClassWDRights.vb index ab39eb2..0f5be25 100644 --- a/app/DD-Record-Organizer/Classes/ClassWDRights.vb +++ b/app/DD-Record-Organizer/Classes/ClassWDRights.vb @@ -230,8 +230,8 @@ Public Class ClassWDRights End Select MSG_RESULT &= String.Format("Error while working on RightChange:" & vbNewLine & "Fileright: {0}" & vbNewLine & "User: {1} " & vbNewLine & "File: {2}", _right, oFileRightString, reldocpath) & vbNewLine LOGGER.Warn(ex.Message) - End Try - Next + End Try + Next 'Für jede Gruppe das Recht einzeln hinzufügen diff --git a/app/DD-Record-Organizer/ModuleRuntimeVariables.vb b/app/DD-Record-Organizer/ModuleRuntimeVariables.vb index da34017..7c69655 100644 --- a/app/DD-Record-Organizer/ModuleRuntimeVariables.vb +++ b/app/DD-Record-Organizer/ModuleRuntimeVariables.vb @@ -46,9 +46,9 @@ Module ModuleRuntimeVariables Public CURRENT_SCREEN_ID As Integer = 1 Public CURRENT_CONTROL_ID As Integer - Public CURRENT_RECORD_ID As Integer - Public CURRENT_NODE_GUID As Integer - Public CURRENT_NODEID As Integer + + Public CURRENT_RECORD_ID As Integer = 0 + Public CURRENT_DOC_ID As Integer = 0 Public CURRENT_CHANGE_STEP As Integer = 0 @@ -73,7 +73,7 @@ Module ModuleRuntimeVariables Public CURRENT_REDUNDANT_FORMVIEW_ID As Integer 'Public CURRENT_MASTER_FORM_ID As Integer Public CURRENT_FILEIN_WD As String - Public CURRENT_DOC_ID + 'Public CURRENT_DOC_ID Public CURRENT_NAVIGATION_TYPE As String = "DEFAULT" Public CURRENT_SELECTED_NODE As TreeNode diff --git a/app/DD-Record-Organizer/My Project/AssemblyInfo.vb b/app/DD-Record-Organizer/My Project/AssemblyInfo.vb index 7d86f9d..c33abd3 100644 --- a/app/DD-Record-Organizer/My Project/AssemblyInfo.vb +++ b/app/DD-Record-Organizer/My Project/AssemblyInfo.vb @@ -33,7 +33,7 @@ Imports System.Runtime.InteropServices ' übernehmen, indem Sie "*" eingeben: ' - + \ No newline at end of file diff --git a/app/DD-Record-Organizer/OrgFlow.vbproj b/app/DD-Record-Organizer/OrgFlow.vbproj index c7c1643..6948e6b 100644 --- a/app/DD-Record-Organizer/OrgFlow.vbproj +++ b/app/DD-Record-Organizer/OrgFlow.vbproj @@ -550,6 +550,12 @@ Form + + frmNodeNavigation_RenameNode.vb + + + Form + frmRight_Management.vb @@ -1006,6 +1012,9 @@ frmNodeNavigation.vb Designer + + frmNodeNavigation_RenameNode.vb + frmRecordView.vb diff --git a/app/DD-Record-Organizer/frmDocRecordLink.vb b/app/DD-Record-Organizer/frmDocRecordLink.vb index 14256f2..1be9629 100644 --- a/app/DD-Record-Organizer/frmDocRecordLink.vb +++ b/app/DD-Record-Organizer/frmDocRecordLink.vb @@ -33,41 +33,11 @@ Public Class frmDocRecordLink If CURRENT_LINK_ENTITY_ID = 0 Then CURRENT_LINK_ENTITY_ID = CURRENT_ENTITY_ID End If - 'Try - ' DT_RECORDS.Columns.Add("already linked", Type.GetType("System.Boolean")).SetOrdinal(0) - ' DT_RECORDS.Columns("already linked").DefaultValue = False - 'Catch ex As Exception - 'End Try - - 'Try - ' For Each row As DataRow In CURRENT_DT_SELECTED_FILES.Rows - ' Dim DOC_ID = row.Item("DOC_ID") - - ' Dim sel = String.Format("select T.RECORD_ID FROM TBPMO_DOC_RECORD_LINK T, TBPMO_RECORD T1 WHERE T.RECORD_ID = T1.GUID AND T1.FORM_ID = {0} AND T.DOC_ID = {1}", CURRENT_LINK_ENTITY_ID, DOC_ID) - ' Dim DTRECS_LINKED As DataTable = MYDB_ECM.GetDatatable(sel) - ' For Each recrow As DataRow In DTRECS_LINKED.Rows - ' For Each rowrecsdisplay As DataRow In DT_RECORDS.Rows - ' If rowrecsdisplay.Item("Record-ID") = recrow.Item("RECORD_ID") Then - ' rowrecsdisplay.Item("already linked") = True - ' Else - ' rowrecsdisplay.Item("already linked") = False - ' End If - ' Next - ' Next - ' Next - 'Catch ex As Exception - ' ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error in displaying already linked", ex.Message, ex.StackTrace) - 'End Try Try grvwGrid.Columns.Clear() dgEntityRecords.DataSource = DT_RECORDS - ' grvwGrid.Columns.Item("already linked").Fixed = True - 'grvwGrid.PopulateColumns() - 'dgEntityRecords.RefreshDataSource() - 'grvwGrid.OptionsView.ColumnAutoWidth = False - 'grvwGrid.Columns(0).Fixed = FixedStyle.Left - 'grvwGrid.BestFitColumns() + Catch ex As Exception ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error in format grid", ex.Message, ex.StackTrace) @@ -306,17 +276,17 @@ Public Class frmDocRecordLink End If Try For Each oRow As DataRow In CURRENT_DT_SELECTED_FILES.Rows - - CURRENT_DOC_ID = oRow.Item("DOC_ID") - LOGGER.Info("DocID {0} will be linked with Record {1} ", CURRENT_DOC_ID.ToString, oSelectedRecordID.ToString) + Dim oDocID As Integer + oDocID = oRow.Item("DOC_ID") + LOGGER.Info("DocID {0} will be linked with Record {1} ", oDocID.ToString, oSelectedRecordID.ToString) Dim DOC_PATH = oRow.Item("FILEPATH") Dim _objecttype = oRow.Item("OBJECTTYPE") WMOBJECTTYPE = _objecttype - Dim sql_Exec = String.Format("EXEC PRPMO_CHECK_DOC_RECORD_LINK {0},{1},'{2}','{3}'", oSelectedRecordID, CURRENT_DOC_ID, "MANUAL RECORD-LINK", USER_USERNAME) + Dim sql_Exec = String.Format("EXEC PRPMO_CHECK_DOC_RECORD_LINK {0},{1},'{2}','{3}'", oSelectedRecordID, oDocID, "MANUAL RECORD-LINK", USER_USERNAME) If MYDB_ECM.ExecuteNonQuery(sql_Exec) = False Then MsgBox("Unexpected Error in Inserting Record-Doc Link. Please check logfile!", MsgBoxStyle.Critical) Else - ClassHelper.InsertEssential_Log(CURRENT_DOC_ID, "DOC-ID", "FILE LINK CREATED FOR RECORD: " & oSelectedRecordID.ToString) + ClassHelper.InsertEssential_Log(oDocID, "DOC-ID", "FILE LINK CREATED FOR RECORD: " & oSelectedRecordID.ToString) oLinkCount += 1 End If Dim sql = String.Format("SELECT * FROM TBPMO_WD_OBJECTTYPE WHERE OBJECT_TYPE = '{0}'", _objecttype) diff --git a/app/DD-Record-Organizer/frmNodeNavigation.Designer.vb b/app/DD-Record-Organizer/frmNodeNavigation.Designer.vb index f609c21..81a1833 100644 --- a/app/DD-Record-Organizer/frmNodeNavigation.Designer.vb +++ b/app/DD-Record-Organizer/frmNodeNavigation.Designer.vb @@ -62,6 +62,8 @@ Partial Class frmNodeNavigation Me.GridControlDocSearch = New DevExpress.XtraGrid.GridControl() Me.cmsResultFileDetail = New System.Windows.Forms.ContextMenuStrip(Me.components) Me.tsmiFileProperties = New System.Windows.Forms.ToolStripMenuItem() + Me.AlleDateienAuswählenToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.AlleDateienEntwaehlenToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() Me.ToolStripSeparator5 = New System.Windows.Forms.ToolStripSeparator() Me.tsmiFileOpen = New System.Windows.Forms.ToolStripMenuItem() Me.tsmiFileFolderOpen = New System.Windows.Forms.ToolStripMenuItem() @@ -127,6 +129,7 @@ Partial Class frmNodeNavigation Me.PopupMenu4 = New DevExpress.XtraBars.PopupMenu(Me.components) Me.PopupMenu5 = New DevExpress.XtraBars.PopupMenu(Me.components) Me.DD_DMSDataSet1 = New DD_Record_Organizer.DD_DMSDataSet() + Me.KnotenUmbenennenToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() CType(Me.ribbonNodeNavigation, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.RepositoryItemTextEdit1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.SplitContainerTreeList, System.ComponentModel.ISupportInitialize).BeginInit() @@ -178,7 +181,7 @@ Partial Class frmNodeNavigation Me.ribbonNodeNavigation.ShowExpandCollapseButton = DevExpress.Utils.DefaultBoolean.[True] Me.ribbonNodeNavigation.ShowMoreCommandsButton = DevExpress.Utils.DefaultBoolean.[False] Me.ribbonNodeNavigation.ShowToolbarCustomizeItem = False - Me.ribbonNodeNavigation.Size = New System.Drawing.Size(1151, 147) + Me.ribbonNodeNavigation.Size = New System.Drawing.Size(1151, 158) Me.ribbonNodeNavigation.StatusBar = Me.RibbonStatusBar1 Me.ribbonNodeNavigation.Toolbar.ShowCustomizeItem = False ' @@ -389,10 +392,10 @@ Partial Class frmNodeNavigation Me.RibbonStatusBar1.ItemLinks.Add(Me.BarStaticItemLocked) Me.RibbonStatusBar1.ItemLinks.Add(Me.bsitmtInfoDoc) Me.RibbonStatusBar1.ItemLinks.Add(Me.bsiDocIDChanged) - Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 566) + Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 567) Me.RibbonStatusBar1.Name = "RibbonStatusBar1" Me.RibbonStatusBar1.Ribbon = Me.ribbonNodeNavigation - Me.RibbonStatusBar1.Size = New System.Drawing.Size(1151, 23) + Me.RibbonStatusBar1.Size = New System.Drawing.Size(1151, 22) ' 'RibbonPage2 ' @@ -414,7 +417,7 @@ Partial Class frmNodeNavigation ' Me.SplitContainerTreeList.Panel2.Controls.Add(Me.SplitContainerDocumentSearch) Me.SplitContainerTreeList.Panel2.Text = "Panel2" - Me.SplitContainerTreeList.Size = New System.Drawing.Size(776, 419) + Me.SplitContainerTreeList.Size = New System.Drawing.Size(776, 409) Me.SplitContainerTreeList.SplitterPosition = 229 Me.SplitContainerTreeList.TabIndex = 2 ' @@ -456,7 +459,7 @@ Partial Class frmNodeNavigation Me.TreeListDevexpress.OptionsView.ShowVertLines = False Me.TreeListDevexpress.OptionsView.TreeLineStyle = DevExpress.XtraTreeList.LineStyle.Dark Me.TreeListDevexpress.ParentFieldName = "PARENT_GUID" - Me.TreeListDevexpress.Size = New System.Drawing.Size(229, 419) + Me.TreeListDevexpress.Size = New System.Drawing.Size(229, 409) Me.TreeListDevexpress.StateImageList = Me.ImageCollection1 Me.TreeListDevexpress.TabIndex = 1 ' @@ -480,7 +483,7 @@ Partial Class frmNodeNavigation ' Me.SplitContainerDocumentSearch.Panel2.Controls.Add(Me.GridControlDocSearch) Me.SplitContainerDocumentSearch.Panel2.Text = "Panel2" - Me.SplitContainerDocumentSearch.Size = New System.Drawing.Size(535, 419) + Me.SplitContainerDocumentSearch.Size = New System.Drawing.Size(537, 409) Me.SplitContainerDocumentSearch.SplitterPosition = 133 Me.SplitContainerDocumentSearch.TabIndex = 1 ' @@ -491,7 +494,7 @@ Partial Class frmNodeNavigation Me.pnlControls.Dock = System.Windows.Forms.DockStyle.Fill Me.pnlControls.Location = New System.Drawing.Point(0, 0) Me.pnlControls.Name = "pnlControls" - Me.pnlControls.Size = New System.Drawing.Size(535, 133) + Me.pnlControls.Size = New System.Drawing.Size(537, 133) Me.pnlControls.TabIndex = 0 ' 'GridControlDocSearch @@ -505,7 +508,7 @@ Partial Class frmNodeNavigation Me.GridControlDocSearch.Location = New System.Drawing.Point(0, 0) Me.GridControlDocSearch.MainView = Me.GridViewDoc_Search Me.GridControlDocSearch.Name = "GridControlDocSearch" - Me.GridControlDocSearch.Size = New System.Drawing.Size(535, 274) + Me.GridControlDocSearch.Size = New System.Drawing.Size(537, 266) Me.GridControlDocSearch.TabIndex = 8 Me.GridControlDocSearch.TabStop = False Me.GridControlDocSearch.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridViewDoc_Search}) @@ -513,9 +516,9 @@ Partial Class frmNodeNavigation 'cmsResultFileDetail ' Me.cmsResultFileDetail.ImageScalingSize = New System.Drawing.Size(18, 18) - Me.cmsResultFileDetail.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.tsmiFileProperties, Me.ToolStripSeparator5, Me.tsmiFileOpen, Me.tsmiFileFolderOpen, Me.ToolStripSeparator1, Me.tsmiFileInWorkMultiple_Lock, Me.tsmiFileInWorkMultiple_Free, Me.tsmiFileInWork, Me.ToolStripSeparator3, Me.tsmiFileLink_Add, Me.tsmiFileLinkRemove, Me.tsmiFileLink_ShowAll, Me.TsmitmJumpToFilestore, Me.LinkPerMailVersendenToolStripMenuItem, Me.ToolStripSeparator2, Me.tsmiFileRename, Me.DokumentartÄndernToolStripMenuItem, Me.tsmiFileVersion, Me.tsmiFileRightsShow, Me.ToolStripSeparator4, Me.tsmiFileDelete}) + Me.cmsResultFileDetail.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.tsmiFileProperties, Me.AlleDateienAuswählenToolStripMenuItem, Me.AlleDateienEntwaehlenToolStripMenuItem, Me.ToolStripSeparator5, Me.tsmiFileOpen, Me.tsmiFileFolderOpen, Me.ToolStripSeparator1, Me.tsmiFileInWorkMultiple_Lock, Me.tsmiFileInWorkMultiple_Free, Me.tsmiFileInWork, Me.ToolStripSeparator3, Me.tsmiFileLink_Add, Me.tsmiFileLinkRemove, Me.tsmiFileLink_ShowAll, Me.TsmitmJumpToFilestore, Me.LinkPerMailVersendenToolStripMenuItem, Me.ToolStripSeparator2, Me.tsmiFileRename, Me.DokumentartÄndernToolStripMenuItem, Me.tsmiFileVersion, Me.tsmiFileRightsShow, Me.ToolStripSeparator4, Me.tsmiFileDelete}) Me.cmsResultFileDetail.Name = "ContextMenuStripResultFiles" - Me.cmsResultFileDetail.Size = New System.Drawing.Size(315, 440) + Me.cmsResultFileDetail.Size = New System.Drawing.Size(315, 466) ' 'tsmiFileProperties ' @@ -524,6 +527,19 @@ Partial Class frmNodeNavigation Me.tsmiFileProperties.Size = New System.Drawing.Size(314, 24) Me.tsmiFileProperties.Text = "Eigenschaften" ' + 'AlleDateienAuswählenToolStripMenuItem + ' + Me.AlleDateienAuswählenToolStripMenuItem.Image = Global.DD_Record_Organizer.My.Resources.Resources.checkbox_16xLG + Me.AlleDateienAuswählenToolStripMenuItem.Name = "AlleDateienAuswählenToolStripMenuItem" + Me.AlleDateienAuswählenToolStripMenuItem.Size = New System.Drawing.Size(314, 24) + Me.AlleDateienAuswählenToolStripMenuItem.Text = "Alle Dateien auswählen" + ' + 'AlleDateienEntwaehlenToolStripMenuItem + ' + Me.AlleDateienEntwaehlenToolStripMenuItem.Name = "AlleDateienEntwaehlenToolStripMenuItem" + Me.AlleDateienEntwaehlenToolStripMenuItem.Size = New System.Drawing.Size(314, 24) + Me.AlleDateienEntwaehlenToolStripMenuItem.Text = "Nicht auswählen" + ' 'ToolStripSeparator5 ' Me.ToolStripSeparator5.Name = "ToolStripSeparator5" @@ -731,7 +747,7 @@ Partial Class frmNodeNavigation ' Me.SplitContainerDocView.CollapsePanel = DevExpress.XtraEditors.SplitCollapsePanel.Panel2 Me.SplitContainerDocView.Dock = System.Windows.Forms.DockStyle.Fill - Me.SplitContainerDocView.Location = New System.Drawing.Point(0, 147) + Me.SplitContainerDocView.Location = New System.Drawing.Point(0, 158) Me.SplitContainerDocView.Name = "SplitContainerDocView" ' 'SplitContainerDocView.Panel1 @@ -743,7 +759,7 @@ Partial Class frmNodeNavigation ' Me.SplitContainerDocView.Panel2.Controls.Add(Me.DocumentViewer) Me.SplitContainerDocView.Panel2.Text = "Panel2" - Me.SplitContainerDocView.Size = New System.Drawing.Size(1151, 419) + Me.SplitContainerDocView.Size = New System.Drawing.Size(1151, 409) Me.SplitContainerDocView.SplitterPosition = 776 Me.SplitContainerDocView.TabIndex = 0 ' @@ -754,7 +770,7 @@ Partial Class frmNodeNavigation Me.DocumentViewer.FileLoaded = False Me.DocumentViewer.Location = New System.Drawing.Point(0, 0) Me.DocumentViewer.Name = "DocumentViewer" - Me.DocumentViewer.Size = New System.Drawing.Size(363, 419) + Me.DocumentViewer.Size = New System.Drawing.Size(365, 409) Me.DocumentViewer.TabIndex = 0 Me.DocumentViewer.Viewer_ForceTemporaryMode = False ' @@ -770,9 +786,9 @@ Partial Class frmNodeNavigation ' 'CMSAdmin_Treeview ' - Me.CMSAdmin_Treeview.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.KnotenLöschenadminToolStripMenuItem, Me.KnotenVerschiebenToolStripMenuItem}) + Me.CMSAdmin_Treeview.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.KnotenLöschenadminToolStripMenuItem, Me.KnotenVerschiebenToolStripMenuItem, Me.KnotenUmbenennenToolStripMenuItem}) Me.CMSAdmin_Treeview.Name = "CMSAdmin_Treeview" - Me.CMSAdmin_Treeview.Size = New System.Drawing.Size(202, 48) + Me.CMSAdmin_Treeview.Size = New System.Drawing.Size(202, 92) ' 'KnotenLöschenadminToolStripMenuItem ' @@ -1062,6 +1078,13 @@ Partial Class frmNodeNavigation Me.DD_DMSDataSet1.DataSetName = "DD_DMSDataSet" Me.DD_DMSDataSet1.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema ' + 'KnotenUmbenennenToolStripMenuItem + ' + Me.KnotenUmbenennenToolStripMenuItem.Image = Global.DD_Record_Organizer.My.Resources.Resources.brick + Me.KnotenUmbenennenToolStripMenuItem.Name = "KnotenUmbenennenToolStripMenuItem" + Me.KnotenUmbenennenToolStripMenuItem.Size = New System.Drawing.Size(201, 22) + Me.KnotenUmbenennenToolStripMenuItem.Text = "Knoten umbenennen" + ' 'frmNodeNavigation ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -1220,4 +1243,7 @@ Partial Class frmNodeNavigation Friend WithEvents bsiDocIDChanged As DevExpress.XtraBars.BarStaticItem Friend WithEvents TsmitmJumpToFilestore As ToolStripMenuItem Friend WithEvents RepositoryItemTextEdit1 As DevExpress.XtraEditors.Repository.RepositoryItemTextEdit + Friend WithEvents AlleDateienAuswählenToolStripMenuItem As ToolStripMenuItem + Friend WithEvents AlleDateienEntwaehlenToolStripMenuItem As ToolStripMenuItem + Friend WithEvents KnotenUmbenennenToolStripMenuItem As ToolStripMenuItem End Class diff --git a/app/DD-Record-Organizer/frmNodeNavigation.vb b/app/DD-Record-Organizer/frmNodeNavigation.vb index 9d43d9b..96d51af 100644 --- a/app/DD-Record-Organizer/frmNodeNavigation.vb +++ b/app/DD-Record-Organizer/frmNodeNavigation.vb @@ -28,7 +28,6 @@ Public Class frmNodeNavigation Private Property DT_ADDING_USERS As DataTable Private Property DT_VWPMO_CONSTRUCTOR_FORMS As DataTable Private Property RunningTaskTokenSource As New CancellationTokenSource - Private Property _EntityId As Short Private Property oConstructID As Short Private Property CONSTRUCTORID As Integer Private Property CONSTRUCTOR_DETAIL_ID As Short @@ -50,7 +49,7 @@ Public Class frmNodeNavigation Private Property DT_TBPMO_FORM_VIEW As DataTable Private Property DT_CONSTRUCT_VIEW As DataTable Private Property COUNT_RO_CONTROLS As Integer = 0 - Private Property SELECTED_NODE_RECORD_ID As Integer + Private Property SELECTED_NODE_CAPTION As String Private Property FORMVIEW_ID As Integer Private Property FORM_LOADED As Boolean = False @@ -77,6 +76,12 @@ Public Class frmNodeNavigation Private Property mySelectedDocs As List(Of clsWMDoc) Private Property Current_DocList As ClassDocGrid + Private Property _RECORD_ID As Integer + Private Property _NODE_GUID As Integer + Private Property _NODE_ID As Integer + Private Property _DOC_ID As Integer + Private Property _ENTITY_ID As Integer + Public CtrlBuilder As ClassControlBuilder Public CtrlCommandUI As ClassControlCommandsUI Private Property ParentNodeChangeinAction As Boolean = False @@ -88,7 +93,15 @@ Public Class frmNodeNavigation Private PA_NODE_GUID_STAMM As Integer = 0 Private PA_NODE_CONFIG_USER_STAMM As Integer = 0 Private Debug As Boolean = False + Private HasAddRightForConfigNode As Boolean = False + ''' + ''' Eindeutiges Drag-Format für DocID-Transfers zwischen frmNodeNavigation-Instanzen. + ''' + Public Shared ReadOnly DRAGDROP_FORMAT_DOCID As String = "DD_RecordOrganizer_DocID" + ' ── DocID Drag & Drop zwischen Instanzen ────────────────────────────── + Private _dragStartPoint As Point = Point.Empty + Private _isDraggingDoc As Boolean = False Public Enum EditState None Insert @@ -100,9 +113,9 @@ Public Class frmNodeNavigation ' Dieser Aufruf ist für den Designer erforderlich. InitializeComponent() ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu. - _EntityId = pEntityID + _ENTITY_ID = pEntityID oConstructID = pConstructID - Dim oMyClassName = $"frmNodeNavigation_Entity{_EntityId}" + Dim oMyClassName = $"frmNodeNavigation_Entity{_ENTITY_ID}" NNLogger = LOGCONFIG.GetLogger(oMyClassName) NNLogger.Debug("Loading NodeNavigation for Entity [{0}]", pEntityID) @@ -340,7 +353,7 @@ Public Class frmNodeNavigation End Class Private Async Sub TreeListDevexpress_FocusedNodeChanged(sender As Object, e As FocusedNodeChangedEventArgs) Handles TreeListDevexpress.FocusedNodeChanged - CURRENT_NODE_GUID = 0 + _NODE_GUID = 0 If FORM_SHOWN = False Or oCollapseInAction Then Exit Sub End If @@ -395,9 +408,8 @@ Public Class frmNodeNavigation End If - CURRENT_NODE_GUID = oNodeId - CURRENT_RECORD_ID = oRecordId - CURRENT_ENTITY_ID = _EntityId + _NODE_GUID = oNodeId + SELECTED_NODE_CAPTION = oNodeCaption ' BEGIN NEW NODE @@ -417,9 +429,11 @@ Public Class frmNodeNavigation }).ToList() AvailableConfigNodes = oNodeConfigList End If + Dim oSQL = String.Format("SELECT * FROM TBOF_MAP_RIGHT_NODE_ADD_USER WITH (NOLOCK) WHERE FK_TBPMO_SN_CONFIG_ID = {0} AND FK_TBDDUSER_ID = {1}", oNodeConfigId, USER_GUID) + HasAddRightForConfigNode = MYDB_ECM.GetDatatable(oSQL).Rows.Count > 0 NNLogger.Info($"Node changed: NodeID={oNodeConfigId}, NodeGUID={oGuid}, ConfigNodesFound={AvailableConfigNodes.Count}, " & - $"ButtonVisible={btnCreateNewNode.Visibility}, ConfigTableRows={If(IsNothing(DT_CONFIGURABLE_NODES), 0, DT_CONFIGURABLE_NODES.Rows.Count)}") + $"ButtonVisible={btnCreateNewNode.Visibility}, HasAddRightForConfigNode={HasAddRightForConfigNode}, ConfigTableRows={If(IsNothing(DT_CONFIGURABLE_NODES), 0, DT_CONFIGURABLE_NODES.Rows.Count)}") ' NEUE zentrale Methode aufrufen statt direkter Manipulation @@ -427,8 +441,10 @@ Public Class frmNodeNavigation ' END NEW NODE - CURRENT_NODEID = oGuid + _NODE_ID = oGuid If oHasRecordId Then + _RECORD_ID = oRecordId + CURRENT_RECORD_ID = _RECORD_ID Update_Status_Label(True, $"NodeID {oGuid} - RecordID {CURRENT_RECORD_ID}", EditState.None) Node_AfterSelect = True @@ -441,14 +457,14 @@ Public Class frmNodeNavigation ' muss vor show selected record data kommen, ' sodass die datasource für die angehakten werte existiert (checked list box) CtrlBuilder.WatchRecordChanges = False - ClassControlValues.LoadControlValuesListWithPlaceholders(_EntityId, CURRENT_RECORD_ID, 0, CtrlBuilder.AllControls, _EntityId) + ClassControlValues.LoadControlValuesListWithPlaceholders(_ENTITY_ID, CURRENT_RECORD_ID, 0, CtrlBuilder.AllControls, _ENTITY_ID) CtrlBuilder.WatchRecordChanges = True - Await Show_Selected_Record_Data(CURRENT_RECORD_ID, oLoadRecordData) + Await Show_Selected_Record_Data(_RECORD_ID, oLoadRecordData) Await DocView_DisplaySelectedDoc(True) - ClassRightManagement.Check_Set_Rights(CURRENT_RECORD_ID, _EntityId) + ClassRightManagement.Check_Set_Rights(CURRENT_RECORD_ID, _ENTITY_ID) CONTROL_HANDLING() If RIGHT_RECORD_AND_FILE_READ_ONLY = False And CtrlCommandUI.IsInsert = False Then @@ -464,7 +480,6 @@ Public Class frmNodeNavigation If RIGHT_RECORD_AND_FILE_READ_ONLY = True Or oLoadRecordData = False Then bbtnitmRecEdit.Enabled = False bbtnitmRecSave.Enabled = False - btnCreateNewNode.Enabled = False Else Record_Group_Enable(True) End If @@ -484,17 +499,18 @@ Public Class frmNodeNavigation Node_AfterSelect = False Else + _RECORD_ID = 0 Update_Status_Label(True, $"NodeID {oGuid}", EditState.None) ClassControlValues.ClearControlValues(pnlControls.Controls) Await Show_Selected_Record_Data(0, oLoadRecordData) End If - If ParentNodeChangeinAction = True And CURRENT_NODEID <> 0 Then + If ParentNodeChangeinAction = True And _NODE_ID <> 0 Then Dim result As DialogResult = Await ShowDialogAsync() If result = DialogResult.Yes Then - Dim oSQL = $"UPDATE TBPMO_STRUCTURE_NODES SET PARENT_GUID = {CURRENT_NODEID} , CHANGED_WHO = '{USER_USERNAME}' WHERE GUID = {ChildNodeGuid}" - If MYDB_ECM.ExecuteNonQuery(oSQL) = True Then + Dim oSQL1 = $"UPDATE TBPMO_STRUCTURE_NODES SET PARENT_GUID = {_NODE_ID} , CHANGED_WHO = '{USER_USERNAME}' WHERE GUID = {ChildNodeGuid}" + If MYDB_ECM.ExecuteNonQuery(oSQL1) = True Then ShowDialogAsync2() Else Console.WriteLine("Fehler") @@ -511,22 +527,20 @@ Public Class frmNodeNavigation NNLogger.Debug($"UpdateCreateNodeButtonState called - Visibility={btnCreateNewNode.Visibility}, " & $"CurrentEnabled={btnCreateNewNode.Enabled}, AvailableNodes={AvailableConfigNodes.Count}, " & $"ConfigTableExists={Not IsNothing(DT_CONFIGURABLE_NODES)}, " & - $"RIGHT_RECORD_AND_FILE_READ_ONLY={RIGHT_RECORD_AND_FILE_READ_ONLY}") + $"HasAddRightForConfigNode={HasAddRightForConfigNode}, " & + $"RIGHT_RECORD_AND_FILE_READ_ONLY={RIGHT_RECORD_AND_FILE_READ_ONLY}, " & + $"USER_IS_ADMIN={USER_IS_ADMIN}") If btnCreateNewNode.Visibility <> DevExpress.XtraBars.BarItemVisibility.Always Then Exit Sub End If - ' Button aktivieren wenn: - ' 1. Konfigurierbare Nodes existieren UND - ' 2. Verfügbare Config-Nodes für aktuellen Node vorhanden sind UND - ' 3. Benutzer hat Schreibrechte (nicht Read-Only) Dim shouldEnable As Boolean = False If Not IsNothing(DT_CONFIGURABLE_NODES) AndAlso DT_CONFIGURABLE_NODES.Rows.Count > 0 AndAlso AvailableConfigNodes.Count > 0 AndAlso - RIGHT_RECORD_AND_FILE_READ_ONLY = False Then + (HasAddRightForConfigNode = True OrElse USER_IS_ADMIN = True) Then shouldEnable = True End If @@ -538,9 +552,9 @@ Public Class frmNodeNavigation End If If shouldEnable Then - LOGGER.Debug($"btnCreateNewNode ENABLED (AvailableConfigNodes: {AvailableConfigNodes.Count})") + LOGGER.Debug($"btnCreateNewNode ENABLED (AvailableConfigNodes: {AvailableConfigNodes.Count}, USER_IS_ADMIN={USER_IS_ADMIN})") Else - LOGGER.Debug($"btnCreateNewNode DISABLED (ConfigNodes: {AvailableConfigNodes.Count}, ReadOnly: {RIGHT_RECORD_AND_FILE_READ_ONLY})") + LOGGER.Debug($"btnCreateNewNode DISABLED (AvailableConfigNodes: {AvailableConfigNodes.Count}, HasAddRightForConfigNode={HasAddRightForConfigNode}, USER_IS_ADMIN={USER_IS_ADMIN})") End If Catch ex As Exception @@ -583,7 +597,7 @@ Public Class frmNodeNavigation End If If USER_LANGUAGE <> "de-DE" Then - oMessage = "No files found for record " & SELECTED_NODE_RECORD_ID + oMessage = "No files found for record " & _RECORD_ID End If ElseIf CURRENT_SEARCH_TYPE = "NODE_DOWN" Then @@ -600,7 +614,7 @@ Public Class frmNodeNavigation End If Else - oMessage = "Dateien für Record: " & SELECTED_NODE_RECORD_ID + oMessage = "Dateien für Record: " & _RECORD_ID If CURRENT_SEARCH_TYPE = "ENTITY" Then @@ -732,14 +746,14 @@ Public Class frmNodeNavigation End Try End Sub Sub Load_Datafor_Entity() - NNLogger.Debug("Loading Data for Entity [{0}]", _EntityId) + NNLogger.Debug("Loading Data for Entity [{0}]", _ENTITY_ID) Try - If _EntityId <> CURRENT_ENTITY_ID Then + If _ENTITY_ID <> CURRENT_ENTITY_ID Or FORM_LOADED = False Then NNLogger.Info("Entity-Data needs to be reloaded...") - CURRENT_ENTITY_ID = _EntityId + CURRENT_ENTITY_ID = _ENTITY_ID CURRENT_CONSTRUCTOR_ID = oConstructID Load_Adding_users() Load_Configurable_Nodes() @@ -751,7 +765,7 @@ Public Class frmNodeNavigation Dim result = (From form In DT_VWPMO_CONSTRUCTOR_FORMS.AsEnumerable() Select form - Where form.Item("FORM_ID") = _EntityId).Single() + Where form.Item("FORM_ID") = _ENTITY_ID).Single() CONSTRUCTOR_DETAIL_ID = result.Item("GUID") ' CONSTRUCT_EXPAND = result.Item("EXPAND") Dim FORM_DATE_FORMAT = result.Item("DATE_FORMAT") @@ -773,7 +787,7 @@ Public Class frmNodeNavigation If DT_ADDING_USERS.Rows.Count > 0 Then 'Überprüfen ob für diese Entität ein spezifischer windream-User verwendet wird, wenn Dateien abgelegt werden? Dim query1 = From _user In DT_ADDING_USERS.AsEnumerable() - Select _user Where _user.Item("ENTITY_ID") = _EntityId + Select _user Where _user.Item("ENTITY_ID") = _ENTITY_ID Dim Rows1 = query1.ToList() For Each _row In Rows1 FAU_AD_DOMAIN = _row.Item("AD_DOMAIN").ToString() @@ -807,11 +821,11 @@ Public Class frmNodeNavigation Dim sw As New SW("Load_Entity_Data") ' Me.Cursor = Cursors.WaitCursor RECORD_CHANGED = False - SELECTED_NODE_RECORD_ID = 0 + _RECORD_ID = 0 Dim expression As String Dim sql 'Dim sql = "SELECT CONTROL_ID, CONTROL_READ_ONLY FROM VWPMO_CONTROL_SCREEN WHERE CTRLTYPE_ID NOT IN (1) AND CONTROL_ENTITY_ID = " & oEntityID - DT_CONTROLS_ENTITY = ClassHelper.FILTER_DATATABLE(DT_VWPMO_CONTROL_SCREEN, "CTRLTYPE_ID NOT IN (1) AND CONTROL_ENTITY_ID = " & _EntityId, "") + DT_CONTROLS_ENTITY = ClassHelper.FILTER_DATATABLE(DT_VWPMO_CONTROL_SCREEN, "CTRLTYPE_ID NOT IN (1) AND CONTROL_ENTITY_ID = " & _ENTITY_ID, "") expression = "CONTROL_READ_ONLY = " & 1 @@ -834,7 +848,7 @@ Public Class frmNodeNavigation Dim oRow = (From form In DT_VWPMO_CONSTRUCTOR_FORMS.AsEnumerable() Select form - Where form.Item("FORM_ID") = _EntityId).Single() + Where form.Item("FORM_ID") = _ENTITY_ID).Single() CURRENT_CONSTRUCTOR_DETAIL_ID = oRow.Item("GUID") @@ -856,48 +870,48 @@ Public Class frmNodeNavigation End If - expression = String.Format("ENTITY_ID = {0} AND LANGUAGE = '{1}'", _EntityId, USER_LANGUAGE) + expression = String.Format("ENTITY_ID = {0} AND LANGUAGE = '{1}'", _ENTITY_ID, USER_LANGUAGE) DT_COLUMNS_GRID_ENTITY = ClassHelper.FILTER_DATATABLE(DT_DOCSEARCH_RESULTLIST_CONFIG, expression, "SEQUENCE") - expression = String.Format("ENTITY_ID = {0} AND TYPE_ID = 10 AND LANGUAGE = '{1}'", _EntityId, USER_LANGUAGE) + expression = String.Format("ENTITY_ID = {0} AND TYPE_ID = 10 AND LANGUAGE = '{1}'", _ENTITY_ID, USER_LANGUAGE) DT_DOCRESULT_DROPDOWN_ITEMS = ClassHelper.FILTER_DATATABLE(CURRENT_TBPMO_DOCRESULT_DROPDOWN_ITEMS, expression, "SEQUENCE") NNLogger.Debug($"Found {DT_DOCRESULT_DROPDOWN_ITEMS.Rows.Count} DT_DOCRESULT_DROPDOWN_ITEMS!") - DT_RESULTLIST_OPTIONS = ClassHelper.FILTER_DATATABLE(CURRENT_VARIABLE_CONTROLS, "ENTITY_ID = " & _EntityId, "") - expression = String.Format("ENTITY_ID = {0} AND LANGUAGE = '{1}' AND COLUMN_VIEW LIKE 'VALUE%'", _EntityId, USER_LANGUAGE) + DT_RESULTLIST_OPTIONS = ClassHelper.FILTER_DATATABLE(CURRENT_VARIABLE_CONTROLS, "ENTITY_ID = " & _ENTITY_ID, "") + expression = String.Format("ENTITY_ID = {0} AND LANGUAGE = '{1}' AND COLUMN_VIEW LIKE 'VALUE%'", _ENTITY_ID, USER_LANGUAGE) DT_RESULTLIST_VARIABLE_VALUE = ClassHelper.FILTER_DATATABLE(DT_DOCSEARCH_RESULTLIST_CONFIG, expression, "SEQUENCE") Dim ENTITY_ROW = (From form In DT_ENTITY_DATA.AsEnumerable() Select form - Where form.Item("GUID") = _EntityId).Single() + Where form.Item("GUID") = _ENTITY_ID).Single() 'sql = String.Format("select * from TBPMO_RIGHT_USER WHERE USER_ID = {0} AND oEntityID = {1}", USER_GUID, oEntityID) - DT_RIGHTS_USER = ClassHelper.FILTER_DATATABLE(CURRENT_TBPMO_RIGHT_USER, "ENTITY_ID = " & _EntityId, "") + DT_RIGHTS_USER = ClassHelper.FILTER_DATATABLE(CURRENT_TBPMO_RIGHT_USER, "ENTITY_ID = " & _ENTITY_ID, "") expression = String.Format("") - sql = String.Format("SELECT DISTINCT EDIT_REC,ADD_REC,DELETE_REC,ADD_DOC,VIEW_DOC,DELETE_DOC FROM TBPMO_RIGHT_GROUP WHERE ENTITY_ID = {0} AND GROUP_ID IN (SELECT GROUP_ID FROM TBDD_GROUPS_USER WHERE USER_ID = {1})", _EntityId, USER_GUID) + sql = String.Format("SELECT DISTINCT EDIT_REC,ADD_REC,DELETE_REC,ADD_DOC,VIEW_DOC,DELETE_DOC FROM TBPMO_RIGHT_GROUP WHERE ENTITY_ID = {0} AND GROUP_ID IN (SELECT GROUP_ID FROM TBDD_GROUPS_USER WHERE USER_ID = {1})", _ENTITY_ID, USER_GUID) DT_RIGHTS_GROUP = MYDB_ECM.GetDatatable(sql) - sql = String.Format("SELECT VIEW_ID FROM TBPMO_USER_CONSTR_VIEW_TYPE WHERE CONSTRUCTOR_DETAIL_ID = {0} AND [ENTITY_ID] = {1} AND USER_ID = {2}", CURRENT_CONSTRUCTOR_DETAIL_ID, _EntityId, USER_GUID) + sql = String.Format("SELECT VIEW_ID FROM TBPMO_USER_CONSTR_VIEW_TYPE WHERE CONSTRUCTOR_DETAIL_ID = {0} AND [ENTITY_ID] = {1} AND USER_ID = {2}", CURRENT_CONSTRUCTOR_DETAIL_ID, _ENTITY_ID, USER_GUID) - SELECTED_NODE_RECORD_ID = 0 + _RECORD_ID = 0 ' LINQ für Zugriff auf DT_VWPMO_CONSTRUCTOR_FORMS Dim result1 = (From form In DT_VWPMO_CONSTRUCTOR_FORMS.AsEnumerable() Select form - Where form.Item("FORM_ID") = _EntityId).Single() + Where form.Item("FORM_ID") = _ENTITY_ID).Single() CURRENT_PARENT_ENTITY_ID = 0 ' LINQ für Zugriff auf DT_VWPMO_CONSTRUCTOR_FORMS Dim query = From form In DT_VWPMO_CONSTRUCTOR_FORMS.AsEnumerable() Select form - Where form.Item("FORM_ID") = _EntityId + Where form.Item("FORM_ID") = _ENTITY_ID Dim QuickViewSQL = query.Single().Item("SQL_QUICK_VIEW") - CURRENT_ENTITYSQL = Get_Grid_Sql_NODE_NAV(CONSTRUCTORID, _EntityId, CURRENT_CONSTRUCTOR_DETAIL_ID, USER_GUID) + CURRENT_ENTITYSQL = Get_Grid_Sql_NODE_NAV(CONSTRUCTORID, _ENTITY_ID, CURRENT_CONSTRUCTOR_DETAIL_ID, USER_GUID) - ClassDOC_SEARCH.Get_DOC_RESULTTABLE(DT_RESULTLIST_OPTIONS, DT_RESULTLIST_VARIABLE_VALUE, DT_COLUMNS_GRID_ENTITY, _EntityId, SELECTED_NODE_RECORD_ID, True, True) + ClassDOC_SEARCH.Get_DOC_RESULTTABLE(DT_RESULTLIST_OPTIONS, DT_RESULTLIST_VARIABLE_VALUE, DT_COLUMNS_GRID_ENTITY, _ENTITY_ID, _RECORD_ID, True, True) - DT_TBPMO_FORM_VIEW = ClassHelper.FILTER_DATATABLE(CURRENT_TBPMO_FORM_VIEW, "FORM_ID = " & _EntityId & " AND SCREEN_ID = " & CURRENT_SCREEN_ID, "") + DT_TBPMO_FORM_VIEW = ClassHelper.FILTER_DATATABLE(CURRENT_TBPMO_FORM_VIEW, "FORM_ID = " & _ENTITY_ID & " AND SCREEN_ID = " & CURRENT_SCREEN_ID, "") CURRENT_ENTITYSTRING = DT_TBPMO_FORM_VIEW.Rows(0).Item("FORM_TITLE") FORMVIEW_ID = DT_TBPMO_FORM_VIEW.Rows(0).Item("GUID") @@ -920,10 +934,10 @@ Public Class frmNodeNavigation If IsNothing(CURRENT_DT_ENTITY_RECORDS) Then ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error", "Error in getting Entity-Data - Check logfile") Else - CURRENT_DT_ENTITY_RECORDS.TableName = "VWPMO_ENTITY_TABLE" & _EntityId + CURRENT_DT_ENTITY_RECORDS.TableName = "VWPMO_ENTITY_TABLE" & _ENTITY_ID ' Dim SQL_AutoValues = "SELECT GUID AS CONTROL_ID, CONNECTION_ID_1 AS CONNECTION_ID, SQL_COMMAND_1 AS SQL_COMMAND FROM TBPMO_CONTROL WHERE CONNECTION_ID_1 <> '' AND SQL_COMMAND_1 <> '' AND FORM_ID = " & oEntityID - Dim DT_AUTOVALUES = ClassHelper.FILTER_DATATABLE(CURRENT_TBPMO_CONTROL, "CONNECTION_ID_1 > 0 AND SQL_COMMAND_1 <> '' AND FORM_ID = " & _EntityId, "") + Dim DT_AUTOVALUES = ClassHelper.FILTER_DATATABLE(CURRENT_TBPMO_CONTROL, "CONNECTION_ID_1 > 0 AND SQL_COMMAND_1 <> '' AND FORM_ID = " & _ENTITY_ID, "") CURRENT_SQL_AUTO_VALUES_DT = DT_AUTOVALUES @@ -938,7 +952,7 @@ Public Class frmNodeNavigation End Try CtrlBuilder.WatchRecordChanges = False - ClassControlValues.LoadControlValuesList(_EntityId, CtrlBuilder.MasterPanel.Controls) + ClassControlValues.LoadControlValuesList(_ENTITY_ID, CtrlBuilder.MasterPanel.Controls) CtrlBuilder.WatchRecordChanges = True 'Zurücksetzen @@ -1006,18 +1020,12 @@ Public Class frmNodeNavigation Private Sub ConfigureGridViewForPerformance() NNLogger.Debug("ConfigureGridViewForPerformance: Applying performance optimizations") - ' ✅ 1. COLUMN AUTO-WIDTH deaktivieren - ' Verhindert ständiges Neuberechnen der Spaltenbreiten bei jedem Redraw + ' ✅ 1. COLUMN AUTO-WIDTH deaktivieren (Designer setzt dies bereits, zur Sicherheit) GridViewDoc_Search.OptionsView.ColumnAutoWidth = False - ' ✅ 3. ROW-INDICATOR ausblenden - ' Spart 20% Render-Zeit (keine Row-Nummern zeichnen) + ' ✅ 2. ROW-INDICATOR ausblenden GridViewDoc_Search.OptionsView.ShowIndicator = False - ' ✅ 4. RowStyle BEIBEHALTEN - ' Wird für "in work?" + Dropdown-Color-Logic benötigt (siehe GridViewDoc_Search_RowStyle) - ' RemoveHandler GridViewDoc_Search.RowStyle, AddressOf GridViewDoc_Search_RowStyle ← NICHT entfernen! - NNLogger.Info("GridView performance optimizations applied successfully") End Sub @@ -1033,10 +1041,9 @@ Public Class frmNodeNavigation ' ✅ 3. ENTITY-ROW laden (wie Original) Dim ENTITY_ROW = (From form In DT_ENTITY_DATA.AsEnumerable() Select form - Where form.Item("GUID") = _EntityId).Single() + Where form.Item("GUID") = _ENTITY_ID).Single() NNLogger.Debug("RECORD ID: {0}", pRecordId) ' ✅ 4. GLOBALE VARIABLEN setzen (wie Original) - SELECTED_NODE_RECORD_ID = pRecordId CURRENT_PARENT_RECORD_ID = 0 RIGHT_CONTROL_CHANGED = False ENTITY_RELOAD_AFT_CONTROL_LOAD = False @@ -1046,7 +1053,7 @@ Public Class frmNodeNavigation Dim sw As New SW("Show_Selected_Record_Data - Control Loading") If pLoadRecordData = True Then CtrlBuilder.WatchRecordChanges = False - ClassControlValues.LoadControlValues(SELECTED_NODE_RECORD_ID, 0, _EntityId, CtrlBuilder.AllControls, _EntityId) + ClassControlValues.LoadControlValues(_RECORD_ID, 0, _ENTITY_ID, CtrlBuilder.AllControls, _ENTITY_ID) CtrlBuilder.WatchRecordChanges = True End If @@ -1056,7 +1063,7 @@ Public Class frmNodeNavigation RECORD_CHANGED = False ' ✅ 8. RECORD-LABEL aktualisieren (synchron, schnell) - Update_Record_Label(SELECTED_NODE_RECORD_ID) + Update_Record_Label(_RECORD_ID) ' ✅ 9. SPLASHSCREEN SCHLIESSEN - Critical-Path abgeschlossen! If oHandle IsNot Nothing Then @@ -1115,17 +1122,10 @@ Public Class frmNodeNavigation End If ' ✅ OPTIONAL: DocView im Hintergrund laden (falls aktiviert) + ' ✅ Direkt awaiten statt Task.Run – wir sind bereits im Async-Kontext If checkShowPreview.Checked AndAlso Not Node_AfterSelect Then - NNLogger.Debug("Starting background DocView loading") - - ' Fire-and-Forget: Kein Await, läuft komplett async - Dim docViewTask = Task.Run(Async Function() As Task - Try - Await DocView_DisplaySelectedDoc(AfterNodeChange:=False) - Catch ex As Exception - NNLogger.Error(ex, "Background DocView loading failed") - End Try - End Function) + NNLogger.Debug("Starting DocView loading") + Await DocView_DisplaySelectedDoc(AfterNodeChange:=False) End If End If End If @@ -1152,14 +1152,14 @@ Public Class frmNodeNavigation Sub Load_Controls(frmview_id As Integer) Dim sw As New SW("Load_Controls") FORMVIEW_ID = frmview_id - _EntityId = DT_TBPMO_FORM_VIEW.Rows(0).Item("FORM_ID") - CURRENT_ENTITY_ID = _EntityId + _ENTITY_ID = DT_TBPMO_FORM_VIEW.Rows(0).Item("FORM_ID") + CURRENT_ENTITY_ID = _ENTITY_ID CtrlBuilder = New ClassControlBuilder(pnlControls) CtrlCommandUI = New ClassControlCommandsUI(CtrlBuilder, ContextMenuDetails, AddressOf NewEditAppointment) - CtrlCommandUI.LoadControls(_EntityId) + CtrlCommandUI.LoadControls(_ENTITY_ID) Lock_RecordControls(True) AddHandler CtrlBuilder.OnRecordChanged, AddressOf OnRecordChanged @@ -1280,7 +1280,7 @@ Public Class frmNodeNavigation Sub NewEditAppointment(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Try Dim ctrl As Windows.Forms.Control = sender - ClassFunctionCommandsUI.NewEditAppointment(ctrl.Name, _EntityId, SELECTED_NODE_RECORD_ID, pnlControls.Controls) + ClassFunctionCommandsUI.NewEditAppointment(ctrl.Name, _ENTITY_ID, _RECORD_ID, pnlControls.Controls) Catch ex As Exception NNLogger.Error(ex) ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error", ex.Message, ex.StackTrace) @@ -1305,7 +1305,7 @@ Public Class frmNodeNavigation End Sub Private Function FindAppointment(ByVal apt As Appointment) As Boolean - Return Convert.ToInt32(apt.CustomFields("RecordID")) = SELECTED_NODE_RECORD_ID + Return Convert.ToInt32(apt.CustomFields("RecordID")) = _RECORD_ID End Function #End Region @@ -1443,7 +1443,7 @@ Public Class frmNodeNavigation End Sub Sub EnableEditMode() - Dim EditingUser = ClassRecordState.IsRecordLocked(SELECTED_NODE_RECORD_ID) + Dim EditingUser = ClassRecordState.IsRecordLocked(_RECORD_ID) ' Überprüfen, ob der Record gerade bearbeitet wird If Not IsNothing(EditingUser) And EditingUser <> USER_USERNAME Then If USER_IS_ADMIN = True Then @@ -1455,7 +1455,7 @@ Public Class frmNodeNavigation End If Dim result As DialogResult = MessageBox.Show(msg, msg1, MessageBoxButtons.YesNo, MessageBoxIcon.Question) If result = System.Windows.Forms.DialogResult.Yes Then - ClassRecordState.UnlockRecord(SELECTED_NODE_RECORD_ID) + ClassRecordState.UnlockRecord(_RECORD_ID) Exit Sub End If BarStaticItemLocked.Visibility = DevExpress.XtraBars.BarItemVisibility.Never @@ -1474,7 +1474,7 @@ Public Class frmNodeNavigation Else 'Wenn Record bearbeitet werden kann, IN_WORK auf 1 setzen, um Bearbeitung durch andere zu verhindern! - ClassRecordState.LockRecord(SELECTED_NODE_RECORD_ID) + ClassRecordState.LockRecord(_RECORD_ID) End If ' Alle Tabs außer Detailsicht deaktivieren @@ -1496,13 +1496,13 @@ Public Class frmNodeNavigation ' tsButtonDelete.Enabled = True End If - CURRENT_RECORD_ID = SELECTED_NODE_RECORD_ID - ClassHelper.GetDocrecordLinks(CURRENT_RECORD_ID) + CURRENT_RECORD_ID = _RECORD_ID + ClassHelper.GetDocrecordLinks(_RECORD_ID) CtrlCommandUI.IsEdit = True ' Abhängige Listen laden CtrlBuilder.WatchRecordChanges = False 'ClassControlValues.LoadControlValuesListWithPlaceholders(ENTITY_ID, RECORD_ID, PARENT_ID, CtrlBuilder.AllControls, ENTITY_ID) - ClassControlValues.Enable_Depending_Controls(_EntityId, SELECTED_NODE_RECORD_ID, 0, CtrlBuilder.AllControls, _EntityId) + ClassControlValues.Enable_Depending_Controls(_ENTITY_ID, _RECORD_ID, 0, CtrlBuilder.AllControls, _ENTITY_ID) CtrlBuilder.WatchRecordChanges = True RECORD_ENABLED = True @@ -1516,17 +1516,17 @@ Public Class frmNodeNavigation 'End If End Sub Sub DisableEditMode() - If SELECTED_NODE_RECORD_ID = 0 Then Exit Sub + If _RECORD_ID = 0 Then Exit Sub Dim sw As New SW("DisableEditMode") - ClassRecordState.UnlockRecord(SELECTED_NODE_RECORD_ID) + ClassRecordState.UnlockRecord(_RECORD_ID) Dim isinsert As Boolean If IsNothing(CtrlCommandUI) Then isinsert = 0 Else isinsert = CtrlCommandUI.IsInsert End If - ClassRecordCommands.CHECK_RECORD_FINAL(SELECTED_NODE_RECORD_ID, isinsert) + ClassRecordCommands.CHECK_RECORD_FINAL(_RECORD_ID, isinsert) Lock_RecordControls(True) RECORD_ENABLED = False @@ -1551,7 +1551,7 @@ Public Class frmNodeNavigation 'ActivateAllTabs() End If If RECORD_ENABLED = True Then - ClassControlValues.UnloadControlValuesList(SELECTED_NODE_RECORD_ID, _EntityId, CtrlBuilder.AllControls) + ClassControlValues.UnloadControlValuesList(_RECORD_ID, _ENTITY_ID, CtrlBuilder.AllControls) End If If Not IsNothing(CtrlCommandUI) Then 'If CtrlCommandUI.IsInsert Then @@ -1648,7 +1648,7 @@ Public Class frmNodeNavigation Public Sub TrySave_DoSave() ERROR_WHILE_SAVING = False ' Record Speichern - Dim ResultMessage = CtrlCommandUI.SaveRecord(SELECTED_NODE_RECORD_ID, _EntityId) + Dim ResultMessage = CtrlCommandUI.SaveRecord(_RECORD_ID, _ENTITY_ID) If ResultMessage <> "ERROR" Then ' Status anzeigen Update_Status_Label(True, ResultMessage) @@ -1710,7 +1710,7 @@ Public Class frmNodeNavigation Else ' Änderungen sollen nicht gespeichert werden ' Angelegten Record löschen If CtrlCommandUI.IsInsert Then - If ClassHelper.DeleteRecord(SELECTED_NODE_RECORD_ID, "TrySave - UserdecidedNotToSave - ENTITY-ID: " & CURRENT_ENTITY_ID) = True Then + If ClassHelper.DeleteRecord(_RECORD_ID, "TrySave - UserdecidedNotToSave - ENTITY-ID: " & CURRENT_ENTITY_ID) = True Then CtrlCommandUI.IsInsert = False INSERT_IN_ACTION = False End If @@ -1742,13 +1742,13 @@ Public Class frmNodeNavigation #End Region Private Sub Customer_Run_Procedures() Try - Dim DT As DataTable = MYDB_ECM.GetDatatable("SELECT * FROM TBPMO_RUN_PROCEDURES WHERE FORM_ID = " & _EntityId) + Dim DT As DataTable = MYDB_ECM.GetDatatable("SELECT * FROM TBPMO_RUN_PROCEDURES WHERE FORM_ID = " & _ENTITY_ID) If Not DT Is Nothing Then For Each row As DataRow In DT.Rows Dim prsql As String = row.Item("EXECUTE_COMMAND") - prsql = prsql.ToUpper.Replace("@FORM_ID", _EntityId) - prsql = prsql.ToUpper.Replace("@ENTITY_ID", _EntityId) - prsql = prsql.ToUpper.Replace("@RECORD_ID", SELECTED_NODE_RECORD_ID) + prsql = prsql.ToUpper.Replace("@FORM_ID", _ENTITY_ID) + prsql = prsql.ToUpper.Replace("@ENTITY_ID", _ENTITY_ID) + prsql = prsql.ToUpper.Replace("@RECORD_ID", _RECORD_ID) MYDB_ECM.ExecuteNonQuery(prsql) Next End If @@ -1768,7 +1768,7 @@ Public Class frmNodeNavigation Try - If CURRENT_RECORD_ID = 0 Then + If _RECORD_ID = 0 Then GridControlDocSearch.DataSource = Nothing Return 0 End If @@ -1778,7 +1778,7 @@ Public Class frmNodeNavigation Dim sql = String.Format("DECLARE @return_value int " & vbNewLine & "EXEC @return_value = [dbo].[PRPMO_NODES_GET_CHILD_RECORDS] @USER_ID = {0}, @NODE_ID = {1} " & vbNewLine & - "SELECT 'Return Value' = @return_value", USER_GUID, CURRENT_NODE_GUID) + "SELECT 'Return Value' = @return_value", USER_GUID, _NODE_GUID) Dim DT_ASYNC As DataTable = Await MYDB_ECM.GetDatatableAsync(sql) If Not IsNothing(DT_ASYNC) Then @@ -1790,7 +1790,7 @@ Public Class frmNodeNavigation End If Dim DT_RESULT As DataTable - DT_RESULT = ClassDOC_SEARCH.Get_DOC_RESULTTABLE(DT_RESULTLIST_OPTIONS, DT_RESULTLIST_VARIABLE_VALUE, DT_COLUMNS_GRID_ENTITY, _EntityId, SELECTED_NODE_RECORD_ID, True) + DT_RESULT = ClassDOC_SEARCH.Get_DOC_RESULTTABLE(DT_RESULTLIST_OPTIONS, DT_RESULTLIST_VARIABLE_VALUE, DT_COLUMNS_GRID_ENTITY, _ENTITY_ID, _RECORD_ID, True) If IsNothing(DT_RESULT) Then Dim msg = "wrong DocSearch-Configuration or unexpected Error in Get_DOC_RESULTTABLE - Check logfile and contact Digital Data" @@ -1820,7 +1820,7 @@ Public Class frmNodeNavigation AddressOf OnDateSelectedValueChanged, AddressOf OnTextSelectedValueChanged, AddressOf OnCheckboxValueChanged, - CURRENT_SEARCH_TYPE, SELECTED_NODE_RECORD_ID) + CURRENT_SEARCH_TYPE, _RECORD_ID) End If 'BbtnitmDocSearch.Enabled = TruefRe @@ -1851,7 +1851,7 @@ Public Class frmNodeNavigation Private Sub RUN_ENTITY_DOC_SEARCH() Dim sw As New SW("RUN_ENTITY_DOC_SEARCH") Try - Dim oSQL = $"SELECT ENTITY_DOC_SEARCH FROM TBPMO_FORM WHERE GUID = {_EntityId}" + Dim oSQL = $"SELECT ENTITY_DOC_SEARCH FROM TBPMO_FORM WHERE GUID = {_ENTITY_ID}" CURRENT_DOCSEARCH_SQL = MYDB_ECM.GetScalarValue(oSQL) If CURRENT_DOCSEARCH_SQL <> String.Empty Then Dim oText = $"Die sichtweite Suche wird im Hintergrund ausgeführt und in einem separaten Fenster angezeigt sobald sie fertig ist." @@ -1860,7 +1860,7 @@ Public Class frmNodeNavigation End If Update_Notification_Label(True, oText, "Yellow") - CURRENT_DOCSEARCH_SQL = CURRENT_DOCSEARCH_SQL.Replace("@ENTITY_ID", _EntityId) + CURRENT_DOCSEARCH_SQL = CURRENT_DOCSEARCH_SQL.Replace("@ENTITY_ID", _ENTITY_ID) CURRENT_DOCSEARCH_SQL = CURRENT_DOCSEARCH_SQL.Replace("@USER_LANGUAGE", USER_LANGUAGE) CURRENT_DOCSEARCH_SQL = CURRENT_DOCSEARCH_SQL.Replace("@USER_ECM_ID", USERID_FK_INT_ECM) CURRENT_DOCSEARCH_SQL = CURRENT_DOCSEARCH_SQL.Replace("@USER_ID", USER_GUID) @@ -1917,7 +1917,7 @@ Public Class frmNodeNavigation Dim user As String = USER_USERNAME - Dim Sql As String = String.Format("EXEC PRPMO_DOC_VALUE_UPD_INS {0}, {1}, {2}, '{3}', '{4}'", oDocID, SELECTED_NODE_RECORD_ID, configId, value, user) + Dim Sql As String = String.Format("EXEC PRPMO_DOC_VALUE_UPD_INS {0}, {1}, {2}, '{3}', '{4}'", oDocID, _RECORD_ID, configId, value, user) If MYDB_ECM.ExecuteNonQuery(Sql) = False Then MsgBox("The Update-Command was not successful! Check the log!",, MsgBoxStyle.Critical) Else @@ -1965,7 +1965,7 @@ Public Class frmNodeNavigation Dim oHeader = detailRow.Item("HEADER_CAPTION") Dim dateString = value.ToString("yyyy-MM-dd") 'hh:mm:ss.fff - Dim Sql As String = String.Format("EXEC PRPMO_DOC_VALUE_UPD_INS {0}, {1}, {2}, '{3}', '{4}'", oDocID, SELECTED_NODE_RECORD_ID, configid, dateString, USER_USERNAME) + Dim Sql As String = String.Format("EXEC PRPMO_DOC_VALUE_UPD_INS {0}, {1}, {2}, '{3}', '{4}'", oDocID, _RECORD_ID, configid, dateString, USER_USERNAME) If MYDB_ECM.ExecuteNonQuery(Sql) = False Then ClassHelper.MSGBOX_Handler("ERROR", "UnexpectedError:", "Error updating doc-metadata (date): " & vbNewLine & "Check the log for further information!") @@ -1997,7 +1997,7 @@ Public Class frmNodeNavigation Dim configid = detailRow.Item("CONFIG_ID") Dim oHeader = detailRow.Item("HEADER_CAPTION") - Dim Sql As String = String.Format("EXEC PRPMO_DOC_VALUE_UPD_INS {0}, {1}, {2},'{3}','{4}'", oDocID, SELECTED_NODE_RECORD_ID, configid, value, USER_USERNAME) + Dim Sql As String = String.Format("EXEC PRPMO_DOC_VALUE_UPD_INS {0}, {1}, {2},'{3}','{4}'", oDocID, _RECORD_ID, configid, value, USER_USERNAME) If MYDB_ECM.ExecuteNonQuery(Sql) = False Then ClassHelper.MSGBOX_Handler("ERROR", "UnexpectedError:", "Error updating doc-metadata (textbox): " & vbNewLine & "Check the log for further information!") Else @@ -2029,7 +2029,7 @@ Public Class frmNodeNavigation Dim oHeader = detailRow.Item("HEADER_CAPTION") - Dim Sql As String = String.Format("EXEC PRPMO_DOC_VALUE_UPD_INS {0}, {1}, {2},'{3}','{4}'", oDocID, SELECTED_NODE_RECORD_ID, configid, value, USER_USERNAME) + Dim Sql As String = String.Format("EXEC PRPMO_DOC_VALUE_UPD_INS {0}, {1}, {2},'{3}','{4}'", oDocID, _RECORD_ID, configid, value, USER_USERNAME) If MYDB_ECM.ExecuteNonQuery(Sql) = False Then ClassHelper.MSGBOX_Handler("ERROR", "UnexpectedError:", "Error updating doc-metadata (checkbox): " & vbNewLine & "Check the log for further information!") Else @@ -2058,11 +2058,28 @@ Public Class frmNodeNavigation End Try End Sub + ''' + ''' FocusedRowChanged: DocID ermitteln und Vorschau aktualisieren. + ''' Dies ist der EINZIGE Handler der bei Zeilenwechsel DB-Arbeit macht. + ''' Private Async Sub GridViewDoc_Search_FocusedRowChanged(sender As Object, e As DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs) Handles GridViewDoc_Search.FocusedRowChanged - ' ✅ Jetzt mit Await aufrufen - Dim docId = Await Focused_Row_GetDocID() - End Sub + If ClassDocGrid.IsBulkSelectionActive Then Return + If Node_AfterSelect Then Return + If FORM_SHOWN = False Then Return + NNLogger.Debug("GridViewDoc_Search_FocusedRowChanged triggered - calling Focused_Row_GetDocID") + Await Focused_Row_GetDocID() + End Sub + ''' + ''' SelectionChanged: NUR Logging/Zähler – KEINE DB-Queries, KEINE GetSelectedDocuments(). + ''' Die tatsächlichen Dokument-Daten werden erst bei Bedarf geladen (Kontextmenü, Export etc.) + ''' + Private Sub GridViewDoc_Search_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles GridViewDoc_Search.SelectionChanged + If ClassDocGrid.IsBulkSelectionActive Then Return + If Node_AfterSelect Then Return + + NNLogger.Debug($"SelectionChanged: {GridViewDoc_Search.SelectedRowsCount} Zeile(n) selektiert") + End Sub Private Async Function Focused_Row_GetDocID() As Task(Of Int64) Try ' Early Exit 1: Formular noch nicht angezeigt @@ -2070,11 +2087,11 @@ Public Class frmNodeNavigation Return 0 End If - ' Early Exit 2: Node-Wechsel aktiv + + ' Node-Wechsel aktiv: Grid-Selektion NICHT zurücksetzen – + ' das passiert bereits in TreeListDevexpress_FocusedNodeChanged. If Node_AfterSelect = True Then - SplitContainerDocView.Collapsed = True - GridViewDoc_Search.ClearSelection() - GridViewDoc_Search.FocusedRowHandle = DevExpress.XtraGrid.GridControl.InvalidRowHandle + NNLogger.Debug("Focused_Row_GetDocID - Node_AfterSelect is TRUE - returning without resetting selection or updating preview") Return 0 End If @@ -2121,8 +2138,11 @@ Public Class frmNodeNavigation End Try End Function - Private Sub GridViewDoc_Search_MasterRowExpanded(sender As Object, e As CustomMasterRowEventArgs) Handles GridViewDoc_Search.MasterRowExpanded - Focused_Row_GetDocID() + ''' + ''' MasterRowExpanded: Korrekter Await-Aufruf. + ''' + Private Async Sub GridViewDoc_Search_MasterRowExpanded(sender As Object, e As CustomMasterRowEventArgs) Handles GridViewDoc_Search.MasterRowExpanded + Await Focused_Row_GetDocID() End Sub Sub Save_DocGrid_Layout() @@ -2157,7 +2177,7 @@ Public Class frmNodeNavigation End Sub Private Function Get_DocGrid_Layout_Filename() Dim EntityRegex As New RegularExpressions.Regex("\s+\(\d+\)") - Dim Filename As String = String.Format("GridViewDoc_Search_{0}_{1}_UserLayout.xml", "Entity" & _EntityId, CONSTRUCTOR_DETAIL_ID) + Dim Filename As String = String.Format("GridViewDoc_Search_{0}_{1}_UserLayout.xml", "Entity" & _ENTITY_ID, CONSTRUCTOR_DETAIL_ID) LAYOUT_DOC_GRIDVIEW = System.IO.Path.Combine(Application.UserAppDataPath(), Filename) Return LAYOUT_DOC_GRIDVIEW End Function @@ -2198,7 +2218,7 @@ Public Class frmNodeNavigation End Sub #Region "Dropping Files" Sub Drag_Enter(e As DragEventArgs) - If _EntityId = 0 Then + If _ENTITY_ID = 0 Then Update_Notification_Label(True, "No entity selected", "Yellow") e.Effect = DragDropEffects.None Exit Sub @@ -2210,9 +2230,113 @@ Public Class frmNodeNavigation Exit Sub End If - ' Delegiere die Priorisierung (Outlook > FileDrop) an die zentrale Routine - ClassDragDrop.Drag_enter(e) + My.Settings.WD_INDEXDOKART_SAVE = "" + + ' ✅ NEU: DocID-Format prüfen – wenn erkannt, sofort Copy setzen und raus + If e.Data.GetDataPresent(DRAGDROP_FORMAT_DOCID) Then + e.Effect = DragDropEffects.Copy + LOGGER?.Debug("DragEnter ... DocID-Format erkannt (Inter-Instance Transfer)") + Return ' ← Hier endet es. Die Outlook/FileDrop-Logik darunter wird NICHT ausgeführt. + End If + + ' ═══════════════════════════════════════════════════════════ + ' Ab hier: ALLES UNVERÄNDERT – kein einziges Byte geändert! + ' ═══════════════════════════════════════════════════════════ + Dim hasOutlookUnicode As Boolean = e.Data.GetDataPresent("FileGroupDescriptorW") + Dim hasOutlookAnsi As Boolean = e.Data.GetDataPresent("FileGroupDescriptor") + Dim hasOutlookDescriptor As Boolean = hasOutlookUnicode OrElse hasOutlookAnsi + + Dim hasChromiumMime As Boolean = e.Data.GetDataPresent("Chromium Web Custom MIME Data Format") + Dim hasFileNameW As Boolean = e.Data.GetDataPresent("FileNameW") OrElse e.Data.GetDataPresent("FileName") + Dim hasOutlookLike As Boolean = hasOutlookDescriptor OrElse hasChromiumMime OrElse hasFileNameW + + Dim hasFileDrop As Boolean = e.Data.GetDataPresent(DataFormats.FileDrop) + + If hasOutlookLike Then + e.Effect = DragDropEffects.Copy + LOGGER?.Debug("DragEnter ... Outlook/WebView2 erkannt (Descriptor/Chromium/FileNameW)") + ElseIf hasFileDrop Then + e.Effect = DragDropEffects.Copy + LOGGER?.Debug("DragEnter ... SimpleFileDrop") + Else + e.Effect = DragDropEffects.None + LOGGER?.Debug("DragEnter ... Other FileFormat") + End If + + LOGGER?.Debug("DragEnter Formats: " & String.Join(", ", e.Data.GetFormats())) End Sub + ''' + ''' MouseDown: Drag nur starten wenn Zeile bereits fokussiert ist UND + ''' keine Modifier-Tasten (Shift/Ctrl) für Mehrfach-Selektion gedrückt sind. + ''' + Private Sub GridViewDoc_Search_MouseDown_DragInit(sender As Object, e As MouseEventArgs) Handles GridViewDoc_Search.MouseDown + ' Drag-Initialisierung NICHT bei Modifier-Tasten (Mehrfach-Selektion schützen) + If e.Button = MouseButtons.Left AndAlso + ModifierKeys = Keys.None AndAlso + GridViewDoc_Search.FocusedRowHandle >= 0 Then + _dragStartPoint = e.Location + _isDraggingDoc = True + Else + _dragStartPoint = Point.Empty + _isDraggingDoc = False + End If + End Sub + + Private Sub GridViewDoc_Search_MouseMove_DragStart(sender As Object, e As MouseEventArgs) Handles GridViewDoc_Search.MouseMove + If Not _isDraggingDoc OrElse e.Button <> MouseButtons.Left Then + Return + End If + + Dim delta As New Size(e.Location.X - _dragStartPoint.X, e.Location.Y - _dragStartPoint.Y) + If Math.Abs(delta.Width) < SystemInformation.DragSize.Width AndAlso + Math.Abs(delta.Height) < SystemInformation.DragSize.Height Then + NNLogger.Debug("MouseMove: Drag threshold not reached yet.") + Return + End If + + ' ✅ Alle selektierten Zeilen lesen + Dim oSelectedRows = GridViewDoc_Search.GetSelectedRows().ToList() + + ' ✅ Sicherstellen: mind. die fokussierte Zeile ist enthalten + If oSelectedRows.Count = 0 AndAlso GridViewDoc_Search.FocusedRowHandle >= 0 Then + oSelectedRows.Add(GridViewDoc_Search.FocusedRowHandle) + End If + + ' ✅ DocIDs aus allen selektierten Zeilen lesen und validieren + Dim oDocIds As New List(Of Long) + For Each oRowHandle In oSelectedRows + If oRowHandle < 0 Then Continue For + Dim oDocIdValue = GridViewDoc_Search.GetRowCellValue(oRowHandle, "DocID") + If oDocIdValue Is Nothing Then Continue For + Dim oDocId As Long + If Long.TryParse(oDocIdValue.ToString(), oDocId) AndAlso oDocId > 0 Then + oDocIds.Add(oDocId) + End If + Next + + ' ✅ Garantie: mindestens eine gültige DocID muss vorhanden sein + If oDocIds.Count = 0 Then + _isDraggingDoc = False + NNLogger.Warn("DragStart abgebrochen: Keine gültigen DocIDs in den selektierten Zeilen gefunden.") + Return + End If + + NNLogger.Info($"DocID-DragStart: {oDocIds.Count} DocID(s)=[{String.Join(",", oDocIds)}], EntityID={_ENTITY_ID}") + + ' ✅ Kommagetrennte Liste als Drag-Payload + Dim oData As New DataObject() + oData.SetData(DRAGDROP_FORMAT_DOCID, String.Join(",", oDocIds)) + + _isDraggingDoc = False + GridControlDocSearch.DoDragDrop(oData, DragDropEffects.Copy) + End Sub + + Private Sub GridViewDoc_Search_MouseUp_DragReset(sender As Object, e As MouseEventArgs) Handles GridViewDoc_Search.MouseUp + NNLogger.Debug("MouseUp: Drag operation reset.") + _isDraggingDoc = False + _dragStartPoint = Point.Empty + End Sub + Private Async Function Drag_Drop(e As DragEventArgs) As Task Try ' Basis-Prechecks – bevor wir irgendetwas verarbeiten @@ -2227,7 +2351,7 @@ Public Class frmNodeNavigation End If ' Rechte-/Kontextprüfung - If Not (_EntityId <> 0 AndAlso ((RIGHT_READ_ONLY_DOC = False AndAlso GridControlDocSearch.ContextMenuStrip.Name = "ContextMenuStripResultFiles") OrElse RIGHT_ADD_DOC = True)) Then + If Not (_ENTITY_ID <> 0 AndAlso ((RIGHT_READ_ONLY_DOC = False AndAlso GridControlDocSearch.ContextMenuStrip.Name = "ContextMenuStripResultFiles") OrElse RIGHT_ADD_DOC = True)) Then If RIGHT_READ_ONLY_DOC = True Then NNLogger.Warn("RIGHT_WD_FORBIDDEN is set! No DragDrop allowed") Else @@ -2306,7 +2430,7 @@ Public Class frmNodeNavigation Exit Sub End If End If - If CURRENT_RECORD_ID = 0 Then + If _RECORD_ID = 0 Then ClassHelper.MSGBOX_Handler("INFO", "Achtung", "Fokus unklar: ", "Bitte wählen Sie erneut einen Knoten aus!") Exit Sub End If @@ -2389,9 +2513,79 @@ Public Class frmNodeNavigation End Try End Sub Private Async Sub GridControlDocSearch_DragDrop(sender As Object, e As DragEventArgs) Handles GridControlDocSearch.DragDrop + ' ✅ DocID-Format zuerst prüfen – VOR der bestehenden Datei-Drop-Logik + If e.Data.GetDataPresent(DRAGDROP_FORMAT_DOCID) Then + Dim oRaw = e.Data.GetData(DRAGDROP_FORMAT_DOCID) + NNLogger.Debug($"GridControlDocSearch_DragDrop: DocID-Format erkannt, roher Wert: {oRaw}") + + ' ✅ Kommagetrennte Liste parsen + Dim oDocIds As New List(Of Long) + For Each oPart In oRaw?.ToString().Split(","c) + Dim oDocId As Long + If Long.TryParse(oPart.Trim(), oDocId) AndAlso oDocId > 0 Then + oDocIds.Add(oDocId) + End If + Next + + If oDocIds.Count > 0 Then + NNLogger.Info($"GridControlDocSearch_DragDrop: Verarbeite {oDocIds.Count} DocID(s)") + Await Handle_DocID_Drop(oDocIds) + End If + Return + End If + Await Drag_Drop(e) End Sub + ' ✅ Überlastung: Liste von DocIDs + Private Async Function Handle_DocID_Drop(pDocIds As List(Of Long)) As Task + Try + If _RECORD_ID = 0 Then + ClassHelper.MSGBOX_Handler("INFO", "Achtung", "Kein Datensatz ausgewählt:", "Bitte wählen Sie zuerst einen Knoten mit einem Datensatz aus.") + Return + End If + If WM_READ_ONLY Then + Update_Notification_Label(True, "READ ONLY ACCESS – Drop nicht erlaubt", "Yellow") + Return + End If + + NNLogger.Info($"Handle_DocID_Drop: {pDocIds.Count} DocID(s) → RecordID={_RECORD_ID}, EntityID={_ENTITY_ID}") + + Dim oSuccessCount As Integer = 0 + Dim oErrorCount As Integer = 0 + + For Each pDocId In pDocIds + Dim oSql = $"IF NOT EXISTS (SELECT 1 FROM TBPMO_DOC_RECORD_LINK WHERE DOC_ID = {pDocId} AND RECORD_ID = {_RECORD_ID}) " & + $"INSERT INTO TBPMO_DOC_RECORD_LINK (DOC_ID, RECORD_ID, ADDED_WHO, ADDED_WHEN) " & + $"VALUES ({pDocId}, {_RECORD_ID}, '{USER_USERNAME}', GETDATE())" + + If MYDB_ECM.ExecuteNonQuery(oSql) Then + oSuccessCount += 1 + NNLogger.Info($"Handle_DocID_Drop: DocID={pDocId} erfolgreich verknüpft") + Else + oErrorCount += 1 + NNLogger.Error($"Handle_DocID_Drop: Fehler beim INSERT (DocID={pDocId}, RecordID={_RECORD_ID})") + End If + Next + + ' ✅ Einmaliges Feedback nach allen Inserts + If oErrorCount = 0 Then + Dim oMsg = If(pDocIds.Count = 1, + $"Dokument {pDocIds(0)} erfolgreich verknüpft", + $"{oSuccessCount} Dokument(e) erfolgreich verknüpft") + Update_Notification_Label(True, oMsg, "Lime") + Else + Update_Notification_Label(True, $"{oSuccessCount} verknüpft, {oErrorCount} Fehler – Logdatei prüfen", "Yellow") + End If + + ' ✅ Einmaliges Refresh nach allen Inserts + Await RUN_DOCSEARCH(False) + + Catch ex As Exception + NNLogger.Error(ex) + ClassHelper.MSGBOX_Handler("ERROR", "Unerwarteter Fehler", "Fehler beim DocID-Drop: ", ex.Message) + End Try + End Function Private Sub GridControlDocSearch_DragEnter(sender As Object, e As DragEventArgs) Handles GridControlDocSearch.DragEnter Drag_Enter(e) End Sub @@ -2425,7 +2619,7 @@ Public Class frmNodeNavigation EDIT_STATE = EditState.Insert Else EDIT_STATE = EditState.Update - NEW_RECORD_ID = 0 + If RECORD_CHANGED = False Then Update_Notification_Label(True, "NO CHANGES in Record.", "") @@ -2533,6 +2727,7 @@ Public Class frmNodeNavigation e.Cancel = True Exit Sub End If + NNLogger.Debug("ContextMenu Opening: Start processing...") tsmiFileInWorkMultiple_Free.Visible = False tsmiFileInWorkMultiple_Lock.Visible = False INWORK_MULTIPLE_FILES_SET_FREE = False @@ -3023,7 +3218,7 @@ Public Class frmNodeNavigation End Sub Private Async Sub tsmiFileLinkRemove_Click(sender As Object, e As EventArgs) Handles tsmiFileLinkRemove.Click - If CURRENT_RECORD_ID = 0 Then + If _RECORD_ID = 0 Then ClassHelper.MSGBOX_Handler("INFO", "Attention", "Missing Selection:", "Please select a record!") Exit Sub End If @@ -3038,20 +3233,23 @@ Public Class frmNodeNavigation Dim result As MsgBoxResult result = MessageBox.Show(msg, CAPTION_CONFIRMATION, MessageBoxButtons.YesNo, MessageBoxIcon.Question) If result = MsgBoxResult.Yes Then + Cursor = Cursors.WaitCursor Try + Dim oAnyDeleted As Boolean = False For Each oDoc As ClassDocGrid.clsWMDoc In ClassDocGrid.GetSelectedDocuments(GridViewDoc_Search) - If ClassFileResult.Delete_ResultFile(oDoc.DocId, CURRENT_RECORD_ID, 0) = True Then + If ClassFileResult.Delete_ResultFile(oDoc.DocId, _RECORD_ID, 0) = True Then ClassHelper.InsertEssential_Log(oDoc.DocId, "DOC-ID", "RECORD LINK REMOVED FROM DOC-SEARCH") - Cursor = Cursors.WaitCursor - Await RUN_DOCSEARCH(True) + oAnyDeleted = True End If - - Next - + If oAnyDeleted Then + Await RUN_DOCSEARCH(True) + End If Catch ex As Exception NNLogger.Error(ex) ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error", "Error in Removing links from file:", ex.Message) + Finally + Cursor = Cursors.Default End Try End If End Sub @@ -3278,16 +3476,11 @@ Public Class frmNodeNavigation End If Cursor = Cursors.WaitCursor Dim oSQL = $"EXEC PRCUST_REORDER_CHILD_NODES " - Dim oNodeGUID As Integer = 0 - Dim oID = MyFocusedNode.Id - Dim PID = MyFocusedNode.ParentNode - Dim Column_pRecord As TreeListColumn = TreeListDevexpress.Columns("RECORD_ID") - Dim Column_Caption As TreeListColumn = TreeListDevexpress.Columns("NODE_CAPTION") - If oID > 0 Then + If _NODE_ID > 0 Then MyTreeListViewState.SaveState() - oNodeGUID = oID - oSQL += $" {oNodeGUID},{oSubnodes} " + + oSQL += $" {_NODE_ID},{oSubnodes} " MYDB_ECM.ExecuteNonQuery(oSQL) Await ReloadTreeView() MyTreeListViewState.LoadState() @@ -3372,9 +3565,6 @@ Public Class frmNodeNavigation End Sub - Private Async Sub GridViewDoc_Search_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles GridViewDoc_Search.SelectionChanged - Await DocView_DisplaySelectedDoc(False) - End Sub Private Async Function DocView_DisplaySelectedDoc(AfterNodeChange As Boolean) As Task ' ✅ Early Exit: Keine Vorschau nach Node-Wechsel If AfterNodeChange Then @@ -3490,7 +3680,7 @@ Public Class frmNodeNavigation Dim oParentNodeGuid As Integer = MyFocusedNode.Item("GUID") Dim oIsExpanded As Boolean = MyFocusedNode.Expanded Dim oNodeCreator = New ClassNodeCreator(LOGCONFIG, ImageCollection1) - Dim oSuccess = oNodeCreator.AddNode(_EntityId, oForm.Title, oParentNodeGuid, oForm.Id, oCreateRecord) + Dim oSuccess = oNodeCreator.AddNode(_ENTITY_ID, oForm.Title, oParentNodeGuid, oForm.Id, oCreateRecord) If oSuccess = True Then Dim oMessage As String = "Der Knoten wurde erfolgreich angelegt! Wollen Sie die Sicht jetzt neu laden? Abhängig von der Anzahl der Knoten kann dies einige Sekunden dauern." @@ -3722,10 +3912,10 @@ Public Class frmNodeNavigation End Sub Private Async Sub KnotenLöschenadminToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles KnotenLöschenadminToolStripMenuItem.Click - If CURRENT_NODEID <> 0 And Not IsNothing(MyFocusedNode) Then + If _NODE_ID <> 0 And Not IsNothing(MyFocusedNode) Then Dim result As DialogResult = MessageBox.Show("Wollen Sie fortfahren? Der Knoten wird In Folge mit den Unterknoten als gelöscht markiert!", "Bestätigung erforderlich", MessageBoxButtons.YesNo, MessageBoxIcon.Question) If result = System.Windows.Forms.DialogResult.Yes Then - Dim oSQL = $"EXEC [dbo].[PRPMO_DELETE_NODE] {CURRENT_NODEID}, '{USER_USERNAME}', 1, 0" + Dim oSQL = $"EXEC [dbo].[PRPMO_DELETE_NODE] {_NODE_ID}, '{USER_USERNAME}', 1, 0" If MYDB_ECM.ExecuteNonQuery(oSQL) = True Then TreeListDevexpress.DeleteNode(MyFocusedNode) MsgBox("Knoten wurde erfolgreich gelöscht!", MsgBoxStyle.Information, "Erfolgsmeldung") @@ -3741,12 +3931,12 @@ Public Class frmNodeNavigation End Sub Private Sub KnotenVerschiebenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles KnotenVerschiebenToolStripMenuItem.Click - If CURRENT_NODEID <> 0 Then + If _NODE_ID <> 0 Then Dim result As DialogResult = MessageBox.Show("Wollen Sie diesen Knoten verschieben?", "Bestätigung erforderlich", MessageBoxButtons.YesNo, MessageBoxIcon.Question) If result = System.Windows.Forms.DialogResult.Yes Then MessageBox.Show("Dann wählen Sie nun bitte den Knoten aus, welcher als Parent für den zu verschiebenden Knoten agieren soll!", "Bestätigung erforderlich", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) ParentNodeChangeinAction = True - ChildNodeGuid = CURRENT_NODEID + ChildNodeGuid = _NODE_ID End If End If End Sub @@ -3778,12 +3968,14 @@ Public Class frmNodeNavigation If CURRENT_ENTITY_ID <> CurrentEntityId Then CURRENT_ENTITY_ID = CurrentEntityId CURRENT_RECORD_ID = 0 + ' ✅ Stellt sicher, dass Load_Configurable_Nodes bei Instanzwechsel ausgeführt wird + Load_Configurable_Nodes() End If End Sub Public ReadOnly Property CurrentEntityId As Short Get - Return _EntityId + Return _ENTITY_ID End Get End Property @@ -3806,4 +3998,82 @@ Public Class frmNodeNavigation MessageBox.Show("Unerwarteter Fehler beim Springen zum Filestore-Knoten: " & ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub + + Private Sub AlleDateienAuswählenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AlleDateienAuswählenToolStripMenuItem.Click + NNLogger.Debug($"AlleDateienAuswählen Start: Bereits {GridViewDoc_Search.SelectedRowsCount} Zeilen selektiert") + + ClassDocGrid.IsBulkSelectionActive = True + Try + GridViewDoc_Search.BeginUpdate() + GridViewDoc_Search.BeginSelection() + GridViewDoc_Search.SelectAll() + GridViewDoc_Search.EndSelection() + GridViewDoc_Search.EndUpdate() + + NNLogger.Debug($"AlleDateienAuswählen: {GridViewDoc_Search.SelectedRowsCount} Zeilen selektiert") + Finally + ClassDocGrid.IsBulkSelectionActive = False + NNLogger.Debug("AlleDateienAuswählen: IsBulkSelectionActive = False (synchron)") + End Try + End Sub + + Private Sub AlleDateienEntwaehlenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AlleDateienEntwaehlenToolStripMenuItem.Click + NNLogger.Debug($"AlleDateienEntwählen Start: Bereits {GridViewDoc_Search.SelectedRowsCount} Zeilen selektiert") + + ClassDocGrid.IsBulkSelectionActive = True + Try + GridViewDoc_Search.BeginUpdate() + GridViewDoc_Search.BeginSelection() + GridViewDoc_Search.ClearSelection() + GridViewDoc_Search.FocusedRowHandle = GridControl.InvalidRowHandle + GridViewDoc_Search.EndSelection() + GridViewDoc_Search.EndUpdate() + + NNLogger.Debug($"AlleDateienEntwählen: {GridViewDoc_Search.SelectedRowsCount} Zeilen betroffen") + Finally + ClassDocGrid.IsBulkSelectionActive = False + NNLogger.Debug("AlleDateienEntwählen: IsBulkSelectionActive = False (synchron)") + End Try + End Sub + + Private Sub KnotenUmbenennenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles KnotenUmbenennenToolStripMenuItem.Click + If _NODE_ID = 0 OrElse IsNothing(MyFocusedNode) Then + Exit Sub + End If + + Dim oForm As New frmNodeNavigation_RenameNode With { + .NodeCaption = SELECTED_NODE_CAPTION + } + + If oForm.ShowDialog() <> DialogResult.OK Then + Exit Sub + End If + + Dim oNewCaption As String = oForm.NewNodeCaption + If String.IsNullOrWhiteSpace(oNewCaption) Then + Exit Sub + End If + + Try + Dim oSql = $"UPDATE TBPMO_STRUCTURE_NODES SET NODE_CAPTION = '{oNewCaption.Replace("'", "''")}', CHANGED_WHO = '{USER_USERNAME}', CHANGED_WHEN = GETDATE() WHERE GUID = {_NODE_ID}" + If MYDB_ECM.ExecuteNonQuery(oSql) Then + ' Caption im DataSource aktualisieren (sofortige Anzeige im TreeList) + Dim oRowObject = TreeListDevexpress.GetRow(MyFocusedNode.Id) + If TypeOf oRowObject Is DataRowView Then + Dim oRowView As DataRowView = oRowObject + oRowView.Row.BeginEdit() + oRowView.Row.Item("NODE_CAPTION") = oNewCaption + oRowView.Row.EndEdit() + End If + SELECTED_NODE_CAPTION = oNewCaption + Update_Notification_Label(True, $"Knoten erfolgreich umbenannt: '{oNewCaption}'", "Lime") + NNLogger.Info($"Node renamed: NodeID={_NODE_ID}, NewCaption='{oNewCaption}', User={USER_USERNAME}") + Else + ClassHelper.MSGBOX_Handler("ERROR", "Fehler", "Knoten konnte nicht umbenannt werden!", "Check the log for further information.") + End If + Catch ex As Exception + NNLogger.Error(ex) + ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error", "Fehler beim Umbenennen des Knotens: ", ex.Message) + End Try + End Sub End Class \ No newline at end of file diff --git a/app/DD-Record-Organizer/frmNodeNavigation_RenameNode.Designer.vb b/app/DD-Record-Organizer/frmNodeNavigation_RenameNode.Designer.vb new file mode 100644 index 0000000..6be4c41 --- /dev/null +++ b/app/DD-Record-Organizer/frmNodeNavigation_RenameNode.Designer.vb @@ -0,0 +1,92 @@ + _ +Partial Class frmNodeNavigation_RenameNode + Inherits DevExpress.XtraEditors.XtraForm + + 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Wird vom Windows Form-Designer benötigt. + Private components As System.ComponentModel.IContainer + + 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. + 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. + 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. + _ + Private Sub InitializeComponent() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmNodeNavigation_RenameNode)) + Me.LabelControl1 = New DevExpress.XtraEditors.LabelControl() + Me.txtNode_Caption = New DevExpress.XtraEditors.TextEdit() + Me.btnRename = New DevExpress.XtraEditors.SimpleButton() + Me.btncancel = New DevExpress.XtraEditors.SimpleButton() + CType(Me.txtNode_Caption.Properties, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'LabelControl1 + ' + Me.LabelControl1.Location = New System.Drawing.Point(23, 6) + Me.LabelControl1.Name = "LabelControl1" + Me.LabelControl1.Size = New System.Drawing.Size(60, 13) + Me.LabelControl1.TabIndex = 0 + Me.LabelControl1.Text = "Knoten-Text" + ' + 'txtNode_Caption + ' + Me.txtNode_Caption.Location = New System.Drawing.Point(23, 25) + Me.txtNode_Caption.Name = "txtNode_Caption" + Me.txtNode_Caption.Size = New System.Drawing.Size(264, 20) + Me.txtNode_Caption.TabIndex = 1 + ' + 'btnRename + ' + Me.btnRename.DialogResult = System.Windows.Forms.DialogResult.OK + Me.btnRename.ImageOptions.SvgImage = CType(resources.GetObject("btnRename.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) + Me.btnRename.Location = New System.Drawing.Point(23, 61) + Me.btnRename.Name = "btnRename" + Me.btnRename.Size = New System.Drawing.Size(151, 36) + Me.btnRename.TabIndex = 2 + Me.btnRename.Text = "Umbenennen" + ' + 'btncancel + ' + Me.btncancel.DialogResult = System.Windows.Forms.DialogResult.Cancel + Me.btncancel.ImageOptions.SvgImage = CType(resources.GetObject("btncancel.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) + Me.btncancel.Location = New System.Drawing.Point(180, 61) + Me.btncancel.Name = "btncancel" + Me.btncancel.Size = New System.Drawing.Size(107, 36) + Me.btncancel.TabIndex = 3 + Me.btncancel.Text = "Abbrechen" + ' + 'frmNodeNavigation_RenameNode + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(318, 109) + Me.Controls.Add(Me.btncancel) + Me.Controls.Add(Me.btnRename) + Me.Controls.Add(Me.txtNode_Caption) + Me.Controls.Add(Me.LabelControl1) + Me.IconOptions.SvgImage = CType(resources.GetObject("frmNodeNavigation_RenameNode.IconOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) + Me.MaximizeBox = False + Me.MinimizeBox = False + Me.Name = "frmNodeNavigation_RenameNode" + Me.Text = "Umbenennen Knoten-Text" + CType(Me.txtNode_Caption.Properties, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Friend WithEvents LabelControl1 As DevExpress.XtraEditors.LabelControl + Friend WithEvents txtNode_Caption As DevExpress.XtraEditors.TextEdit + Friend WithEvents btnRename As DevExpress.XtraEditors.SimpleButton + Friend WithEvents btncancel As DevExpress.XtraEditors.SimpleButton +End Class diff --git a/app/DD-Record-Organizer/frmNodeNavigation_RenameNode.resx b/app/DD-Record-Organizer/frmNodeNavigation_RenameNode.resx new file mode 100644 index 0000000..4a4736f --- /dev/null +++ b/app/DD-Record-Organizer/frmNodeNavigation_RenameNode.resx @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAIIFAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg + MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ + LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3 + RDc7fQoJLldoaXRle2ZpbGw6I0ZGRkZGRjt9CgkuR3JlZW57ZmlsbDojMDM5QzIzO30KCS5zdDB7b3Bh + Y2l0eTowLjc1O30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tm + aWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8ZyAvPg0KICA8ZyBpZD0iUmVuYW1lIj4NCiAgICA8cGF0 + aCBkPSJNMjEuNiwxMC4zYzAtMC43LTAuMy0xLjMtMC45LTEuN0MyMC4xLDguMiwxOS4xLDgsMTcuOSw4 + SDE0djkuOVYxOGg0YzEuMiwwLDIuMi0wLjIsMi45LTAuOCAgIEMyMS43LDE2LjYsMjIsMTYsMjIsMTVj + MC0wLjYtMC4yLTEuMi0wLjctMS42Yy0wLjUtMC40LTEuMS0wLjctMS44LTAuOGMwLjYtMC4yLDEuMS0w + LjUsMS41LTAuOUMyMS40LDExLjMsMjEuNiwxMC45LDIxLjYsMTAuM3ogICAgTTE2LjQsOS43aDAuOWMx + LjEsMCwxLjcsMC40LDEuNywxLjFjMCwwLjQtMC4xLDAuNy0wLjQsMC45QzE4LjQsMTEuOSwxOCwxMiwx + Ny41LDEyaC0xLjFWOS43eiBNMTksMTUuOGMtMC4zLDAuMi0wLjgsMC40LTEuMywwLjQgICBoLTEuM3Yt + Mi42aDEuM2MwLjUsMCwwLjksMC4xLDEuMywwLjNjMC4zLDAuMiwwLjUsMC42LDAuNSwwLjlDMTkuNSwx + NS4zLDE5LjQsMTUuNiwxOSwxNS44eiBNMTcuMiwyMkgxYy0wLjUsMC0xLTAuNS0xLTFWNSAgIGMwLTAu + NSwwLjUtMSwxLTFoMjRjMC41LDAsMSwwLjUsMSwxdjguMmwtMiwyVjZIMnYxNGgxNy4yTDE3LjIsMjJ6 + IE00LjEsMThoMi4ybDAuNi0yLjNoMy4ybDAuNiwyLjNIMTNMOS44LDhINy40TDQuMSwxOHogICAgTTgu + NCwxMC43YzAuMS0wLjMsMC4xLTAuNiwwLjEtMC45aDAuMWMwLDAuMywwLjEsMC42LDAuMSwwLjlsMSwz + LjNINy40TDguNCwxMC43eiIgY2xhc3M9IkJsYWNrIiAvPg0KICAgIDxwYXRoIGQ9Ik0yOSwyMWwtOCw4 + bC00LTRsOC04TDI5LDIxeiBNMzAsMjBsMS43LTEuN2MwLjQtMC40LDAuNC0xLDAtMS4zTDI5LDE0LjNj + LTAuNC0wLjQtMS0wLjQtMS4zLDBMMjYsMTZMMzAsMjB6ICAgIE0xNiwyNnY0aDRMMTYsMjZ6IiBjbGFz + cz0iQmx1ZSIgLz4NCiAgPC9nPg0KPC9zdmc+Cw== + + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAANcBAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg + MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlJlZHtmaWxsOiNEMTFDMUM7fQo8L3N0 + eWxlPg0KICA8cGF0aCBkPSJNMTYsMkM4LjMsMiwyLDguMywyLDE2czYuMywxNCwxNCwxNHMxNC02LjMs + MTQtMTRTMjMuNywyLDE2LDJ6IE0yMywyMGwtMywzbC00LTRsLTQsNGwtMy0zbDQtNGwtNC00bDMtM2w0 + LDQgIGw0LTRsMywzbC00LDRMMjMsMjB6IiBjbGFzcz0iUmVkIiAvPg0KPC9zdmc+Cw== + + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAABwFAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg + MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ + LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3 + RDc7fQoJLldoaXRle2ZpbGw6I0ZGRkZGRjt9CgkuR3JlZW57ZmlsbDojMDM5QzIzO30KCS5zdDB7b3Bh + Y2l0eTowLjc1O30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tm + aWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8ZyAvPg0KICA8ZyBpZD0iUmVuYW1lXzFfIj4NCiAgICA8 + cGF0aCBkPSJNMi4xLDE2aDIuMmwwLjYtMi4zaDMuMkw4LjgsMTZIMTFMNy44LDZINS40TDIuMSwxNnog + TTYuNCw4LjdjMC4xLTAuMywwLjEtMC42LDAuMS0wLjloMC4xICAgYzAsMC4zLDAuMSwwLjYsMC4xLDAu + OWwxLDMuM0g1LjRMNi40LDguN3ogTTE3LjUsMTAuNmMwLjYtMC4yLDEuMS0wLjUsMS41LTAuOWMwLjQt + MC40LDAuNi0wLjksMC42LTEuNGMwLTAuNy0wLjMtMS4zLTAuOS0xLjcgICBDMTguMSw2LjIsMTcuMSw2 + LDE1LjksNkgxMnY5LjlWMTZoNGMxLjIsMCwyLjItMC4yLDIuOS0wLjhDMTkuNywxNC42LDIwLDE0LDIw + LDEzYzAtMC42LTAuMi0xLjItMC43LTEuNiAgIEMxOC45LDExLDE4LjMsMTAuNywxNy41LDEwLjZ6IE0x + NC40LDcuN2gwLjljMS4xLDAsMS43LDAuNCwxLjcsMS4xYzAsMC40LTAuMSwwLjctMC40LDAuOUMxNi40 + LDkuOSwxNiwxMCwxNS41LDEwaC0xLjFWNy43eiAgICBNMTcsMTMuOGMtMC4zLDAuMi0wLjgsMC40LTEu + MywwLjRoLTEuM3YtMi42aDEuM2MwLjUsMCwwLjksMC4xLDEuMywwLjNjMC4zLDAuMiwwLjUsMC42LDAu + NSwwLjlDMTcuNSwxMy4zLDE3LjQsMTMuNiwxNywxMy44eiIgY2xhc3M9IkJsYWNrIiAvPg0KICAgIDxw + YXRoIGQ9Ik0yNywxOWwtOCw4bC00LTRsOC04TDI3LDE5eiBNMjgsMThsMS43LTEuN2MwLjQtMC40LDAu + NC0xLDAtMS4zTDI3LDEyLjNjLTAuNC0wLjQtMS0wLjQtMS4zLDBMMjQsMTRMMjgsMTh6ICAgIE0xNCwy + NHY0aDRMMTQsMjR6IiBjbGFzcz0iQmx1ZSIgLz4NCiAgPC9nPg0KPC9zdmc+Cw== + + + \ No newline at end of file diff --git a/app/DD-Record-Organizer/frmNodeNavigation_RenameNode.vb b/app/DD-Record-Organizer/frmNodeNavigation_RenameNode.vb new file mode 100644 index 0000000..2682b92 --- /dev/null +++ b/app/DD-Record-Organizer/frmNodeNavigation_RenameNode.vb @@ -0,0 +1,24 @@ +Public Class frmNodeNavigation_RenameNode + ''' + ''' Die initiale Beschriftung des Knotens – vor dem Öffnen setzen. + ''' + Public Property NodeCaption As String = "" + + ''' + ''' Die neue Beschriftung nach erfolgreichem Umbenennen. + ''' + Public Property NewNodeCaption As String = "" + Private Sub frmNodeNavigation_RenameNode_Load(sender As Object, e As EventArgs) Handles Me.Load + txtNode_Caption.Text = NodeCaption + End Sub + + Private Sub txtNode_Caption_EditValueChanged(sender As Object, e As EventArgs) Handles txtNode_Caption.EditValueChanged + btnRename.Enabled = Not String.IsNullOrWhiteSpace(txtNode_Caption.Text) + End Sub + + Private Sub btnRename_Click(sender As Object, e As EventArgs) Handles btnRename.Click + NewNodeCaption = txtNode_Caption.Text.Trim() + Me.DialogResult = DialogResult.OK + Me.Close() + End Sub +End Class \ No newline at end of file diff --git a/app/DD-Record-Organizer/frmStructureNodeConfig.Designer.vb b/app/DD-Record-Organizer/frmStructureNodeConfig.Designer.vb index 8599fdb..1d41a3b 100644 --- a/app/DD-Record-Organizer/frmStructureNodeConfig.Designer.vb +++ b/app/DD-Record-Organizer/frmStructureNodeConfig.Designer.vb @@ -33,6 +33,7 @@ Partial Class frmStructureNodeConfig Dim COMMENTLabel As System.Windows.Forms.Label Dim Label1 As System.Windows.Forms.Label Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmStructureNodeConfig)) + Dim GridLevelNode1 As DevExpress.XtraGrid.GridLevelNode = New DevExpress.XtraGrid.GridLevelNode() Me.TBPMO_STRUCTURE_NODES_CONFIGURATIONBindingSource = New System.Windows.Forms.BindingSource(Me.components) Me.DD_DMSDataSet = New DD_Record_Organizer.DD_DMSDataSet() Me.GUIDTextBox = New System.Windows.Forms.TextBox() @@ -63,16 +64,38 @@ Partial Class frmStructureNodeConfig Me.RibbonControl1 = New DevExpress.XtraBars.Ribbon.RibbonControl() Me.BarButtonItem1 = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonItem2 = New DevExpress.XtraBars.BarButtonItem() - Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage() - Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() - Me.RibbonPageGroup2 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() - Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() - Me.RibbonPage2 = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.BarButtonItem3 = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonItem5 = New DevExpress.XtraBars.BarButtonItem() Me.bsitmSave = New DevExpress.XtraBars.BarStaticItem() + Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage() + Me.RibbonPageGroup2 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() + Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() + Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() + Me.RibbonPage2 = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.Label3 = New System.Windows.Forms.Label() Me.CheckEdit1 = New DevExpress.XtraEditors.CheckEdit() + Me.GridControl_Right_AddmanNode_User = New DevExpress.XtraGrid.GridControl() + Me.TBWH_Users1BindingSource = New System.Windows.Forms.BindingSource(Me.components) + Me.GridViewRight_AddmanNode_User = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.GridColumn3 = New DevExpress.XtraGrid.Columns.GridColumn() + Me.colSurname1 = New DevExpress.XtraGrid.Columns.GridColumn() + Me.GridColumn7 = New DevExpress.XtraGrid.Columns.GridColumn() + Me.GridColumn8 = New DevExpress.XtraGrid.Columns.GridColumn() + Me.GridColumn9 = New DevExpress.XtraGrid.Columns.GridColumn() + Me.Label5 = New System.Windows.Forms.Label() + Me.btndeleteUser = New System.Windows.Forms.Button() + Me.btnAddUser = New System.Windows.Forms.Button() + Me.TBAD_UsersBindingSource = New System.Windows.Forms.BindingSource(Me.components) + Me.GridControlFreeUsers = New DevExpress.XtraGrid.GridControl() + Me.GridViewFreeUsers = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.colSelect = New DevExpress.XtraGrid.Columns.GridColumn() + Me.colSurname = New DevExpress.XtraGrid.Columns.GridColumn() + Me.GridColumn1 = New DevExpress.XtraGrid.Columns.GridColumn() + Me.GridColumn2 = New DevExpress.XtraGrid.Columns.GridColumn() + Me.colID = New DevExpress.XtraGrid.Columns.GridColumn() + Me.ContextMenuStrip1 = New System.Windows.Forms.ContextMenuStrip(Me.components) + Me.AlleUserAuswählenToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.KeineAuswahlToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() GUIDLabel = New System.Windows.Forms.Label() TYPE_NODELabel = New System.Windows.Forms.Label() ADDED_WHOLabel = New System.Windows.Forms.Label() @@ -92,6 +115,13 @@ Partial Class frmStructureNodeConfig CType(Me.DD_ECMAdmin, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.CheckEdit1.Properties, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridControl_Right_AddmanNode_User, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TBWH_Users1BindingSource, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridViewRight_AddmanNode_User, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TBAD_UsersBindingSource, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridControlFreeUsers, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridViewFreeUsers, System.ComponentModel.ISupportInitialize).BeginInit() + Me.ContextMenuStrip1.SuspendLayout() Me.SuspendLayout() ' 'GUIDLabel @@ -109,7 +139,7 @@ Partial Class frmStructureNodeConfig TYPE_NODELabel.AutoSize = True TYPE_NODELabel.Location = New System.Drawing.Point(633, 327) TYPE_NODELabel.Name = "TYPE_NODELabel" - TYPE_NODELabel.Size = New System.Drawing.Size(93, 13) + TYPE_NODELabel.Size = New System.Drawing.Size(92, 13) TYPE_NODELabel.TabIndex = 5 TYPE_NODELabel.Text = "Node Type/Level:" ' @@ -340,12 +370,10 @@ Partial Class frmStructureNodeConfig ' 'TreeView1 ' - Me.TreeView1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ - Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) Me.TreeView1.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.TreeView1.Location = New System.Drawing.Point(15, 203) Me.TreeView1.Name = "TreeView1" - Me.TreeView1.Size = New System.Drawing.Size(324, 285) + Me.TreeView1.Size = New System.Drawing.Size(324, 273) Me.TreeView1.TabIndex = 90 ' 'TBPMO_STRUCTURE_NODES_CONFIGURATIONTableAdapter @@ -455,7 +483,7 @@ Partial Class frmStructureNodeConfig Me.RibbonControl1.Name = "RibbonControl1" Me.RibbonControl1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1}) Me.RibbonControl1.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.[False] - Me.RibbonControl1.Size = New System.Drawing.Size(972, 158) + Me.RibbonControl1.Size = New System.Drawing.Size(959, 158) Me.RibbonControl1.StatusBar = Me.RibbonStatusBar1 ' 'BarButtonItem1 @@ -472,39 +500,6 @@ Partial Class frmStructureNodeConfig Me.BarButtonItem2.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem2.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) Me.BarButtonItem2.Name = "BarButtonItem2" ' - 'RibbonPage1 - ' - Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup2, Me.RibbonPageGroup1}) - Me.RibbonPage1.Name = "RibbonPage1" - Me.RibbonPage1.Text = "Start" - ' - 'RibbonPageGroup1 - ' - Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem1) - Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem2) - Me.RibbonPageGroup1.Name = "RibbonPageGroup1" - Me.RibbonPageGroup1.Text = "Knoten-Definition" - ' - 'RibbonPageGroup2 - ' - Me.RibbonPageGroup2.ItemLinks.Add(Me.BarButtonItem3) - Me.RibbonPageGroup2.ItemLinks.Add(Me.BarButtonItem5) - Me.RibbonPageGroup2.Name = "RibbonPageGroup2" - Me.RibbonPageGroup2.Text = "Ansicht" - ' - 'RibbonStatusBar1 - ' - Me.RibbonStatusBar1.ItemLinks.Add(Me.bsitmSave) - Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 494) - Me.RibbonStatusBar1.Name = "RibbonStatusBar1" - Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1 - Me.RibbonStatusBar1.Size = New System.Drawing.Size(972, 22) - ' - 'RibbonPage2 - ' - Me.RibbonPage2.Name = "RibbonPage2" - Me.RibbonPage2.Text = "RibbonPage2" - ' 'BarButtonItem3 ' Me.BarButtonItem3.Caption = "Ausklappen" @@ -528,12 +523,45 @@ Partial Class frmStructureNodeConfig Me.bsitmSave.Name = "bsitmSave" Me.bsitmSave.Visibility = DevExpress.XtraBars.BarItemVisibility.OnlyInCustomizing ' + 'RibbonPage1 + ' + Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup2, Me.RibbonPageGroup1}) + Me.RibbonPage1.Name = "RibbonPage1" + Me.RibbonPage1.Text = "Start" + ' + 'RibbonPageGroup2 + ' + Me.RibbonPageGroup2.ItemLinks.Add(Me.BarButtonItem3) + Me.RibbonPageGroup2.ItemLinks.Add(Me.BarButtonItem5) + Me.RibbonPageGroup2.Name = "RibbonPageGroup2" + Me.RibbonPageGroup2.Text = "Ansicht" + ' + 'RibbonPageGroup1 + ' + Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem1) + Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem2) + Me.RibbonPageGroup1.Name = "RibbonPageGroup1" + Me.RibbonPageGroup1.Text = "Knoten-Definition" + ' + 'RibbonStatusBar1 + ' + Me.RibbonStatusBar1.ItemLinks.Add(Me.bsitmSave) + Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 772) + Me.RibbonStatusBar1.Name = "RibbonStatusBar1" + Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1 + Me.RibbonStatusBar1.Size = New System.Drawing.Size(959, 22) + ' + 'RibbonPage2 + ' + Me.RibbonPage2.Name = "RibbonPage2" + Me.RibbonPage2.Text = "RibbonPage2" + ' 'Label3 ' Me.Label3.AutoSize = True Me.Label3.Location = New System.Drawing.Point(12, 161) Me.Label3.Name = "Label3" - Me.Label3.Size = New System.Drawing.Size(889, 26) + Me.Label3.Size = New System.Drawing.Size(895, 26) Me.Label3.TabIndex = 96 Me.Label3.Text = resources.GetString("Label3.Text") ' @@ -546,12 +574,229 @@ Partial Class frmStructureNodeConfig Me.CheckEdit1.Size = New System.Drawing.Size(112, 18) Me.CheckEdit1.TabIndex = 97 ' + 'GridControl_Right_AddmanNode_User + ' + Me.GridControl_Right_AddmanNode_User.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) + Me.GridControl_Right_AddmanNode_User.ContextMenuStrip = Me.ContextMenuStrip1 + Me.GridControl_Right_AddmanNode_User.DataSource = Me.TBWH_Users1BindingSource + GridLevelNode1.RelationName = "Level1" + Me.GridControl_Right_AddmanNode_User.LevelTree.Nodes.AddRange(New DevExpress.XtraGrid.GridLevelNode() {GridLevelNode1}) + Me.GridControl_Right_AddmanNode_User.Location = New System.Drawing.Point(15, 498) + Me.GridControl_Right_AddmanNode_User.MainView = Me.GridViewRight_AddmanNode_User + Me.GridControl_Right_AddmanNode_User.Name = "GridControl_Right_AddmanNode_User" + Me.GridControl_Right_AddmanNode_User.ShowOnlyPredefinedDetails = True + Me.GridControl_Right_AddmanNode_User.Size = New System.Drawing.Size(364, 268) + Me.GridControl_Right_AddmanNode_User.TabIndex = 101 + Me.GridControl_Right_AddmanNode_User.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridViewRight_AddmanNode_User}) + ' + 'TBWH_Users1BindingSource + ' + Me.TBWH_Users1BindingSource.DataMember = "TBWH_Users1" + Me.TBWH_Users1BindingSource.DataSource = Me.DD_ECMAdmin + ' + 'GridViewRight_AddmanNode_User + ' + Me.GridViewRight_AddmanNode_User.Appearance.EvenRow.BackColor = System.Drawing.Color.LightBlue + Me.GridViewRight_AddmanNode_User.Appearance.EvenRow.Options.UseBackColor = True + Me.GridViewRight_AddmanNode_User.Appearance.FocusedRow.BackColor = System.Drawing.Color.Fuchsia + Me.GridViewRight_AddmanNode_User.Appearance.FocusedRow.Options.UseBackColor = True + Me.GridViewRight_AddmanNode_User.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.GridColumn3, Me.colSurname1, Me.GridColumn7, Me.GridColumn8, Me.GridColumn9}) + Me.GridViewRight_AddmanNode_User.GridControl = Me.GridControl_Right_AddmanNode_User + Me.GridViewRight_AddmanNode_User.Name = "GridViewRight_AddmanNode_User" + Me.GridViewRight_AddmanNode_User.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.[False] + Me.GridViewRight_AddmanNode_User.OptionsBehavior.AllowDeleteRows = DevExpress.Utils.DefaultBoolean.[False] + Me.GridViewRight_AddmanNode_User.OptionsClipboard.CopyColumnHeaders = DevExpress.Utils.DefaultBoolean.[False] + Me.GridViewRight_AddmanNode_User.OptionsSelection.EnableAppearanceFocusedCell = False + Me.GridViewRight_AddmanNode_User.OptionsView.ColumnAutoWidth = False + Me.GridViewRight_AddmanNode_User.OptionsView.EnableAppearanceEvenRow = True + Me.GridViewRight_AddmanNode_User.OptionsView.ShowAutoFilterRow = True + Me.GridViewRight_AddmanNode_User.OptionsView.ShowGroupPanel = False + ' + 'GridColumn3 + ' + Me.GridColumn3.Caption = "Selection" + Me.GridColumn3.FieldName = "Select" + Me.GridColumn3.Name = "GridColumn3" + Me.GridColumn3.Visible = True + Me.GridColumn3.VisibleIndex = 0 + Me.GridColumn3.Width = 54 + ' + 'colSurname1 + ' + Me.colSurname1.Caption = "Name" + Me.colSurname1.FieldName = "Surname" + Me.colSurname1.Name = "colSurname1" + Me.colSurname1.Visible = True + Me.colSurname1.VisibleIndex = 1 + ' + 'GridColumn7 + ' + Me.GridColumn7.FieldName = "Username" + Me.GridColumn7.Name = "GridColumn7" + Me.GridColumn7.OptionsColumn.AllowEdit = False + Me.GridColumn7.Visible = True + Me.GridColumn7.VisibleIndex = 2 + Me.GridColumn7.Width = 107 + ' + 'GridColumn8 + ' + Me.GridColumn8.FieldName = "Email" + Me.GridColumn8.Name = "GridColumn8" + Me.GridColumn8.OptionsColumn.AllowEdit = False + Me.GridColumn8.Visible = True + Me.GridColumn8.VisibleIndex = 3 + Me.GridColumn8.Width = 102 + ' + 'GridColumn9 + ' + Me.GridColumn9.FieldName = "ID" + Me.GridColumn9.Name = "GridColumn9" + ' + 'Label5 + ' + Me.Label5.AutoSize = True + Me.Label5.Font = New System.Drawing.Font("Segoe UI", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Label5.Location = New System.Drawing.Point(12, 479) + Me.Label5.Name = "Label5" + Me.Label5.Size = New System.Drawing.Size(248, 13) + Me.Label5.TabIndex = 102 + Me.Label5.Text = "User mit Rechten zum Hinzufügen von Knoten" + ' + 'btndeleteUser + ' + Me.btndeleteUser.Image = CType(resources.GetObject("btndeleteUser.Image"), System.Drawing.Image) + Me.btndeleteUser.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft + Me.btndeleteUser.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.btndeleteUser.Location = New System.Drawing.Point(385, 530) + Me.btndeleteUser.Name = "btndeleteUser" + Me.btndeleteUser.Size = New System.Drawing.Size(124, 23) + Me.btndeleteUser.TabIndex = 104 + Me.btndeleteUser.Text = "User entfernen" + Me.btndeleteUser.TextAlign = System.Drawing.ContentAlignment.MiddleRight + Me.btndeleteUser.UseVisualStyleBackColor = True + ' + 'btnAddUser + ' + Me.btnAddUser.Image = Global.DD_Record_Organizer.My.Resources.Resources.arrow_left + Me.btnAddUser.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft + Me.btnAddUser.ImeMode = System.Windows.Forms.ImeMode.NoControl + Me.btnAddUser.Location = New System.Drawing.Point(386, 501) + Me.btnAddUser.Name = "btnAddUser" + Me.btnAddUser.Size = New System.Drawing.Size(123, 23) + Me.btnAddUser.TabIndex = 103 + Me.btnAddUser.Text = "User hinzufügen" + Me.btnAddUser.TextAlign = System.Drawing.ContentAlignment.MiddleRight + Me.btnAddUser.UseVisualStyleBackColor = True + ' + 'TBAD_UsersBindingSource + ' + Me.TBAD_UsersBindingSource.DataMember = "TBAD_Users" + Me.TBAD_UsersBindingSource.DataSource = Me.DD_ECMAdmin + ' + 'GridControlFreeUsers + ' + Me.GridControlFreeUsers.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) + Me.GridControlFreeUsers.ContextMenuStrip = Me.ContextMenuStrip1 + Me.GridControlFreeUsers.DataSource = Me.TBAD_UsersBindingSource + Me.GridControlFreeUsers.Location = New System.Drawing.Point(515, 498) + Me.GridControlFreeUsers.MainView = Me.GridViewFreeUsers + Me.GridControlFreeUsers.Name = "GridControlFreeUsers" + Me.GridControlFreeUsers.ShowOnlyPredefinedDetails = True + Me.GridControlFreeUsers.Size = New System.Drawing.Size(378, 268) + Me.GridControlFreeUsers.TabIndex = 105 + Me.GridControlFreeUsers.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridViewFreeUsers}) + ' + 'GridViewFreeUsers + ' + Me.GridViewFreeUsers.Appearance.EvenRow.BackColor = System.Drawing.Color.LightBlue + Me.GridViewFreeUsers.Appearance.EvenRow.Options.UseBackColor = True + Me.GridViewFreeUsers.Appearance.FocusedRow.BackColor = System.Drawing.Color.Fuchsia + Me.GridViewFreeUsers.Appearance.FocusedRow.Options.UseBackColor = True + Me.GridViewFreeUsers.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.colSelect, Me.colSurname, Me.GridColumn1, Me.GridColumn2, Me.colID}) + Me.GridViewFreeUsers.GridControl = Me.GridControlFreeUsers + Me.GridViewFreeUsers.Name = "GridViewFreeUsers" + Me.GridViewFreeUsers.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.[False] + Me.GridViewFreeUsers.OptionsBehavior.AllowDeleteRows = DevExpress.Utils.DefaultBoolean.[False] + Me.GridViewFreeUsers.OptionsClipboard.CopyColumnHeaders = DevExpress.Utils.DefaultBoolean.[False] + Me.GridViewFreeUsers.OptionsSelection.EnableAppearanceFocusedCell = False + Me.GridViewFreeUsers.OptionsView.ColumnAutoWidth = False + Me.GridViewFreeUsers.OptionsView.EnableAppearanceEvenRow = True + Me.GridViewFreeUsers.OptionsView.ShowAutoFilterRow = True + Me.GridViewFreeUsers.OptionsView.ShowGroupPanel = False + ' + 'colSelect + ' + Me.colSelect.Caption = "Selection" + Me.colSelect.FieldName = "Select" + Me.colSelect.Name = "colSelect" + Me.colSelect.Visible = True + Me.colSelect.VisibleIndex = 0 + Me.colSelect.Width = 54 + ' + 'colSurname + ' + Me.colSurname.Caption = "Name" + Me.colSurname.FieldName = "Surname" + Me.colSurname.Name = "colSurname" + Me.colSurname.Visible = True + Me.colSurname.VisibleIndex = 1 + Me.colSurname.Width = 89 + ' + 'GridColumn1 + ' + Me.GridColumn1.FieldName = "Username" + Me.GridColumn1.Name = "GridColumn1" + Me.GridColumn1.OptionsColumn.AllowEdit = False + Me.GridColumn1.Visible = True + Me.GridColumn1.VisibleIndex = 2 + Me.GridColumn1.Width = 98 + ' + 'GridColumn2 + ' + Me.GridColumn2.FieldName = "Email" + Me.GridColumn2.Name = "GridColumn2" + Me.GridColumn2.OptionsColumn.AllowEdit = False + Me.GridColumn2.Visible = True + Me.GridColumn2.VisibleIndex = 3 + Me.GridColumn2.Width = 102 + ' + 'colID + ' + Me.colID.FieldName = "ID" + Me.colID.Name = "colID" + ' + 'ContextMenuStrip1 + ' + Me.ContextMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.AlleUserAuswählenToolStripMenuItem, Me.KeineAuswahlToolStripMenuItem}) + Me.ContextMenuStrip1.Name = "ContextMenuStrip1" + Me.ContextMenuStrip1.Size = New System.Drawing.Size(181, 70) + ' + 'AlleUserAuswählenToolStripMenuItem + ' + Me.AlleUserAuswählenToolStripMenuItem.Image = Global.DD_Record_Organizer.My.Resources.Resources.checkbox_16xLG + Me.AlleUserAuswählenToolStripMenuItem.Name = "AlleUserAuswählenToolStripMenuItem" + Me.AlleUserAuswählenToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.AlleUserAuswählenToolStripMenuItem.Text = "Alle User auswählen" + ' + 'KeineAuswahlToolStripMenuItem + ' + Me.KeineAuswahlToolStripMenuItem.Name = "KeineAuswahlToolStripMenuItem" + Me.KeineAuswahlToolStripMenuItem.Size = New System.Drawing.Size(180, 22) + Me.KeineAuswahlToolStripMenuItem.Text = "Keine Auswahl" + ' 'frmStructureNodeConfig ' Me.Appearance.Options.UseFont = True Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(972, 516) + Me.ClientSize = New System.Drawing.Size(959, 794) + Me.Controls.Add(Me.GridControlFreeUsers) + Me.Controls.Add(Me.btndeleteUser) + Me.Controls.Add(Me.btnAddUser) + Me.Controls.Add(Me.Label5) + Me.Controls.Add(Me.GridControl_Right_AddmanNode_User) Me.Controls.Add(Me.CheckEdit1) Me.Controls.Add(Me.Label3) Me.Controls.Add(Me.Label2) @@ -596,6 +841,13 @@ Partial Class frmStructureNodeConfig CType(Me.DD_ECMAdmin, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.CheckEdit1.Properties, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridControl_Right_AddmanNode_User, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TBWH_Users1BindingSource, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridViewRight_AddmanNode_User, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TBAD_UsersBindingSource, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridControlFreeUsers, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridViewFreeUsers, System.ComponentModel.ISupportInitialize).EndInit() + Me.ContextMenuStrip1.ResumeLayout(False) Me.ResumeLayout(False) Me.PerformLayout() @@ -640,4 +892,26 @@ Partial Class frmStructureNodeConfig Friend WithEvents bsitmSave As DevExpress.XtraBars.BarStaticItem Friend WithEvents Label3 As Label Friend WithEvents CheckEdit1 As DevExpress.XtraEditors.CheckEdit + Friend WithEvents GridControl_Right_AddmanNode_User As DevExpress.XtraGrid.GridControl + Friend WithEvents GridViewRight_AddmanNode_User As DevExpress.XtraGrid.Views.Grid.GridView + Friend WithEvents GridColumn3 As DevExpress.XtraGrid.Columns.GridColumn + Friend WithEvents colSurname1 As DevExpress.XtraGrid.Columns.GridColumn + Friend WithEvents GridColumn7 As DevExpress.XtraGrid.Columns.GridColumn + Friend WithEvents GridColumn8 As DevExpress.XtraGrid.Columns.GridColumn + Friend WithEvents GridColumn9 As DevExpress.XtraGrid.Columns.GridColumn + Friend WithEvents Label5 As Label + Friend WithEvents btndeleteUser As Button + Friend WithEvents btnAddUser As Button + Friend WithEvents TBAD_UsersBindingSource As BindingSource + Friend WithEvents TBWH_Users1BindingSource As BindingSource + Friend WithEvents GridControlFreeUsers As DevExpress.XtraGrid.GridControl + Friend WithEvents GridViewFreeUsers As DevExpress.XtraGrid.Views.Grid.GridView + Friend WithEvents colSelect As DevExpress.XtraGrid.Columns.GridColumn + Friend WithEvents colSurname As DevExpress.XtraGrid.Columns.GridColumn + Friend WithEvents GridColumn1 As DevExpress.XtraGrid.Columns.GridColumn + Friend WithEvents GridColumn2 As DevExpress.XtraGrid.Columns.GridColumn + Friend WithEvents colID As DevExpress.XtraGrid.Columns.GridColumn + Friend WithEvents ContextMenuStrip1 As ContextMenuStrip + Friend WithEvents AlleUserAuswählenToolStripMenuItem As ToolStripMenuItem + Friend WithEvents KeineAuswahlToolStripMenuItem As ToolStripMenuItem End Class diff --git a/app/DD-Record-Organizer/frmStructureNodeConfig.resx b/app/DD-Record-Organizer/frmStructureNodeConfig.resx index a33a259..7de7bcf 100644 --- a/app/DD-Record-Organizer/frmStructureNodeConfig.resx +++ b/app/DD-Record-Organizer/frmStructureNodeConfig.resx @@ -150,14 +150,11 @@ 17, 17 - - 17, 17 - - 422, 56 + 1101, 17 - 564, 56 + 1242, 17 548, 17 @@ -166,22 +163,19 @@ 930, 17 - 772, 56 + 1451, 17 - 17, 95 + 17, 54 - 974, 56 - - - 974, 56 + 1653, 17 - 318, 95 + 316, 54 - 614, 95 + 607, 54 @@ -265,10 +259,36 @@ Ein hier definierter Knoten dient "lediglich" zur Layoutstruktur und stellt noch keinen Knoten in der Sichtnavigation dar. Knoten entstehen entweder durch eine hinterlegte Businesslogik oder durch manuelle Anlage durch den benutzer, wenn der Knoten ein manueller Knoten (Level = 1000) ist. - - 192 + + 1182, 54 + + + 978, 54 + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJnSURBVDhPpZPtT1JRHMf9W/RFMzfXelpzzVZbzQQU + uUQg4NMlkys2WjNNx2Wm2VaMhjRfNLGUHrXyTaY5c6WWLbFHpuW1QolbuCL0XhBI923QglTqRZ3tc7Zz + dr6fs/M756QASPkf1k3MVVWlzVKVhndUBTOjIblpTSn3llQzk6TS4CyTp61dv2rg1lURHyiK/Wo1IzQy + hPBrB8Ljo+DvdGFOX46XRQT7TC0mkgqiYZeW4hdvdWFl5g0iA7cRsVsQsZ3F9xttWB4bgLdeD4dSyD+V + 58QlsW5Wp0t1aSkPd82OFcaJyIXT8FuMWDDXIXTeiHALjZDpOEJ3r8N9hMTYwb2eR7LdqXGBS0vR840G + LDsnYjsuWWn4zlQj2KRbBXeCRKjnMl7kZ2NYmk3HBe+pw0yg5woi3Tb4TTX4UixNymINCd7cAK+xFg+I + LCYuYLSaYPheDyJWI/yn9PhT8ypE8FFFWLC1Yih/ezAumCaLg0vdHQg16xE8WbE2F29RwXy5CgttrRgU + b04IpspUjM/UgCULDe6YOrYwKcp8+BvrMVdfjQFBZuIIzhI5zcgECHZ3wq+RwVcuWRdm5UKwhRIE7Bcx + Kt6K/tyNiSK+KpamPi8lPO7KUgRudsQKNq8S/wwq8sDKhGBlYvCd7ZgskUbDnl5BeuIao0wUiohxxX7e + dUiFwNUOfGum4SWV+KRWwNdkAH+pHVPqAvTlZvC9gvTVD+kXT+T7iMcH9rAOyU58rquGr+VcjI+1R/FQ + tCUaZn8PrxNEGZHuShsWZxmGiB3M/YJt3KBgE9efl8n0CTMMvTkb/v6Z/oUfHdLOuUgtmkUAAAAASUVO + RK5CYII= + + + + 784, 54 + + + 140 + AAABAAgAEBAAAAEACABoBQAAhgAAABAQAAABACAAaAQAAO4FAAAYGAAAAQAIAMgGAABWCgAAGBgAAAEA diff --git a/app/DD-Record-Organizer/frmStructureNodeConfig.vb b/app/DD-Record-Organizer/frmStructureNodeConfig.vb index a380136..838e2e3 100644 --- a/app/DD-Record-Organizer/frmStructureNodeConfig.vb +++ b/app/DD-Record-Organizer/frmStructureNodeConfig.vb @@ -424,6 +424,21 @@ End If End If Me.bsitmSave.Visibility = DevExpress.XtraBars.BarItemVisibility.Never + If TYPE_NODENumericUpDown.Value = 1000 Then + GridControl_Right_AddmanNode_User.Enabled = True + GridControlFreeUsers.Enabled = True + btnAddUser.Enabled = True + btndeleteUser.Enabled = True + + Load_Users_Right_Man_Add() + Else + GridControl_Right_AddmanNode_User.Enabled = False + GridControlFreeUsers.Enabled = False + btnAddUser.Enabled = False + btndeleteUser.Enabled = False + DD_ECMAdmin.TBAD_Users.Clear() + DD_ECMAdmin.TBWH_Users1.Clear() + End If Catch ex As Exception MsgBox("Error in TreeView.AfterSelect:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try @@ -435,7 +450,8 @@ Private Sub LoadData() If cmbEntity.SelectedIndex <> -1 Then - Load_Nodes_entity + Load_nodes_Entity() + If DD_DMSDataSet.TBPMO_STRUCTURE_NODES_CONFIGURATION.Rows.Count > 0 Then Load_TreeView() Else @@ -505,8 +521,166 @@ Private Sub TYPE_NODENumericUpDown_ValueChanged(sender As Object, e As EventArgs) Handles TYPE_NODENumericUpDown.ValueChanged If TYPE_NODENumericUpDown.Value = 1000 Then CheckEdit1.Checked = True + Else CheckEdit1.Checked = False + + End If + End Sub + + Private Sub Load_Users_Right_Man_Add() + If GUIDTextBox.Text = "" Then + Exit Sub + End If + Dim oSql = String.Format("SELECT T.* FROM TBDD_USER T WITH (NOLOCK) INNER JOIN TBDD_USER_MODULES T1 WITH (NOLOCK) ON T.GUID = T1.USER_ID + INNER JOIN TBDD_MODULES T2 WITH (NOLOCK) ON T1.MODULE_ID = T2.GUID + WHERE T2.SHORT_NAME = 'ADDI' AND T.GUID IN (SELECT FK_TBDDUSER_ID FROM TBOF_MAP_RIGHT_NODE_ADD_USER WHERE FK_TBPMO_SN_CONFIG_ID = {0} ) + ORDER BY T.USERNAME", GUIDTextBox.Text) + Dim DT_USERS_CONFIGURED As DataTable = MYDB_ECM.GetDatatable(oSql) + + oSql = String.Format("SELECT * FROM TBDD_USER WITH (NOLOCK) WHERE GUID NOT IN (SELECT FK_TBDDUSER_ID FROM TBOF_MAP_RIGHT_NODE_ADD_USER WITH (NOLOCK) WHERE FK_TBPMO_SN_CONFIG_ID = {0} ) + ORDER BY USERNAME", GUIDTextBox.Text) + Dim DT_FREE_USER As DataTable = MYDB_ECM.GetDatatable(oSql) + Try + DD_ECMAdmin.TBAD_Users.Clear() + + For Each row As DataRow In DT_FREE_USER.Rows + Dim newUserRow As DD_ECMAdmin.TBAD_UsersRow + newUserRow = DD_ECMAdmin.TBAD_Users.NewTBAD_UsersRow + newUserRow.Username = row.Item("USERNAME") + newUserRow.Surname = If(IsDBNull(row("NAME")), "", row("NAME").ToString()) + newUserRow.Prename = If(IsDBNull(row("PRENAME")), "", row("PRENAME").ToString()) + Try + newUserRow.Email = row.Item("EMAIL") + Catch ex As Exception + newUserRow.Email = "" + End Try + + newUserRow.ID = row.Item("GUID") + DD_ECMAdmin.TBAD_Users.Rows.Add(newUserRow) + Next + + Try + DD_ECMAdmin.TBWH_Users1.Clear() + + For Each row As DataRow In DT_USERS_CONFIGURED.Rows + Dim newUserRow As DD_ECMAdmin.TBWH_Users1Row + newUserRow = DD_ECMAdmin.TBWH_Users1.NewTBWH_Users1Row + newUserRow.Surname = If(IsDBNull(row("NAME")), "", row("NAME").ToString()) + newUserRow.Prename = If(IsDBNull(row("PRENAME")), "", row("PRENAME").ToString()) + newUserRow.Username = row.Item("USERNAME") + Try + newUserRow.Email = row.Item("EMAIL") + Catch ex As Exception + newUserRow.Email = "" + End Try + + newUserRow.ID = row.Item("GUID") + DD_ECMAdmin.TBWH_Users1.Rows.Add(newUserRow) + Next + Catch ex As Exception + MsgBox("Error loading Users for Global Search:" & vbNewLine & ex.Message) + End Try + + Catch ex As Exception + MsgBox("Error in Load_Users_GS:" & vbNewLine & ex.Message) + End Try + End Sub + + Private Sub btnAddUser2ConstructorREL_Click(sender As Object, e As EventArgs) Handles btnAddUser.Click + If GUIDTextBox.Text = "" Then + MsgBox("Please choose a node by clicking in the treeview!", MsgBoxStyle.Exclamation) + Exit Sub + End If + Try + ' Zuerst alle ausgewählten User-IDs sammeln + Dim selectedUserIDs As New List(Of Object) + For Each row As DataRow In DD_ECMAdmin.TBAD_Users.Rows + If row.Item(0) = CBool(True) Then + selectedUserIDs.Add(row.Item(5)) + End If + Next + + + ' Dann die INSERTs ausführen + For Each userID In selectedUserIDs + Dim insert As String = String.Format( + "INSERT INTO TBOF_MAP_RIGHT_NODE_ADD_USER (FK_TBPMO_SN_CONFIG_ID, FK_TBDDUSER_ID, ADDED_WHO) VALUES ({0}, {1}, '{2}')", + GUIDTextBox.Text, userID, USER_USERNAME) + If MYDB_ECM.ExecuteNonQuery(insert) = False Then + MsgBox("Could not insert the User-Definition....Check the logfile!", MsgBoxStyle.Exclamation) + End If + Next + + For Each row As DataRow In DD_ECMAdmin.TBAD_Users.Rows + row.Item(0) = CBool(False) + Next + Load_Users_Right_Man_Add() + Catch ex As Exception + MsgBox("Error while adding user: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) + End Try + End Sub + + Private Sub btndeleteUserConstructorRel_Click(sender As Object, e As EventArgs) Handles btndeleteUser.Click + If GUIDTextBox.Text = "" Then + MsgBox("Please choose a node by clicking in the treeview!", MsgBoxStyle.Exclamation) + Exit Sub + End If + Try + Dim refresh As Boolean = False + For Each row As DataRow In DD_ECMAdmin.TBWH_Users1.Rows + If row.Item(0) = CBool(True) Then + Dim oUserID = row.Item(5) + Dim delete = String.Format("DELETE FROM [TBOF_MAP_RIGHT_NODE_ADD_USER] WHERE [FK_TBDDUSER_ID] = {0} And [FK_TBPMO_SN_CONFIG_ID] = {1}", oUserID, GUIDTextBox.Text) + If MYDB_ECM.ExecuteNonQuery(delete) Then + refresh = True + End If + End If + Next + If refresh = True Then Load_Users_Right_Man_Add() + Catch ex As Exception + MsgBox("Error while deleting user: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) + End Try + End Sub + + Private Sub AlleUserAuswählenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AlleUserAuswählenToolStripMenuItem.Click + ' Dynamisch ermitteln, welches GridControl das Menü geöffnet hat + Dim sourceControl = TryCast(ContextMenuStrip1.SourceControl, DevExpress.XtraGrid.GridControl) + If sourceControl Is Nothing Then Exit Sub + + If sourceControl Is GridControlFreeUsers Then + ' Select-Spalte (Index 0) in TBAD_Users setzen + For Each row As DataRow In DD_ECMAdmin.TBAD_Users.Rows + row.Item(0) = CBool(True) + Next + GridViewFreeUsers.SelectAll() + + ElseIf sourceControl Is GridControl_Right_AddmanNode_User Then + ' Select-Spalte (Index 0) in TBWH_Users1 setzen + For Each row As DataRow In DD_ECMAdmin.TBWH_Users1.Rows + row.Item(0) = CBool(True) + Next + GridViewRight_AddmanNode_User.SelectAll() + End If + End Sub + + Private Sub KeineAuswahlToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles KeineAuswahlToolStripMenuItem.Click + ' Dynamisch ermitteln, welches GridControl das Menü geöffnet hat + Dim sourceControl = TryCast(ContextMenuStrip1.SourceControl, DevExpress.XtraGrid.GridControl) + If sourceControl Is Nothing Then Exit Sub + + If sourceControl Is GridControlFreeUsers Then + ' Select-Spalte (Index 0) in TBAD_Users setzen + For Each row As DataRow In DD_ECMAdmin.TBAD_Users.Rows + row.Item(0) = CBool(False) + Next + GridViewFreeUsers.ClearSelection() + ElseIf sourceControl Is GridControl_Right_AddmanNode_User Then + ' Select-Spalte (Index 0) in TBWH_Users1 setzen + For Each row As DataRow In DD_ECMAdmin.TBWH_Users1.Rows + row.Item(0) = CBool(False) + Next + GridViewRight_AddmanNode_User.ClearSelection() End If End Sub End Class \ No newline at end of file diff --git a/app/OrgFlow.sln b/app/OrgFlow.sln index 6e32f78..f276311 100644 --- a/app/OrgFlow.sln +++ b/app/OrgFlow.sln @@ -9,6 +9,8 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "RecordOrganizer_RightManage EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Setup_NoUpdaterVS19", "Setup_NoUpdaterVS19\Setup_NoUpdaterVS19.wixproj", "{A7F7585A-C46A-4436-9F6E-17629325CE58}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Windream", "..\..\..\2_DLL Projekte\DDModules\Windream\Windream.vbproj", "{C602BA85-5E75-6E19-C485-79D912038170}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution CD_ROM|Any CPU = CD_ROM|Any CPU @@ -141,6 +143,46 @@ Global {A7F7585A-C46A-4436-9F6E-17629325CE58}.SingleImage|x64.Build.0 = Release|x86 {A7F7585A-C46A-4436-9F6E-17629325CE58}.SingleImage|x86.ActiveCfg = Release|x86 {A7F7585A-C46A-4436-9F6E-17629325CE58}.SingleImage|x86.Build.0 = Release|x86 + {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|Any CPU.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|x64.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|x64.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|x86.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|x86.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Debug|x64.ActiveCfg = Debug|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Debug|x64.Build.0 = Debug|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Debug|x86.ActiveCfg = Debug|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Debug|x86.Build.0 = Debug|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|Any CPU.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|Any CPU.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|Mixed Platforms.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|Mixed Platforms.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|x64.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|x64.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|x86.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|x86.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Release|Any CPU.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Release|x64.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Release|x64.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Release|x86.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.Release|x86.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|Any CPU.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|x64.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|x64.Build.0 = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|x86.ActiveCfg = Release|Any CPU + {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE