From f1c0a1efd640da5aafdc0ae5cdde4f14705c1cb0 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Fri, 14 Jun 2019 14:15:44 +0200 Subject: [PATCH 01/20] remove variables module --- DDMonorepo.sln | 7 -- Variables/CurrentApplication.vb | 3 - Variables/CurrentUser.vb | 9 -- Variables/My Project/Application.Designer.vb | 13 --- Variables/My Project/Application.myapp | 10 -- Variables/My Project/AssemblyInfo.vb | 35 ------ Variables/My Project/Resources.Designer.vb | 63 ---------- Variables/My Project/Resources.resx | 117 ------------------- Variables/My Project/Settings.Designer.vb | 73 ------------ Variables/My Project/Settings.settings | 7 -- Variables/Variables.vbproj | 104 ----------------- 11 files changed, 441 deletions(-) delete mode 100644 Variables/CurrentApplication.vb delete mode 100644 Variables/CurrentUser.vb delete mode 100644 Variables/My Project/Application.Designer.vb delete mode 100644 Variables/My Project/Application.myapp delete mode 100644 Variables/My Project/AssemblyInfo.vb delete mode 100644 Variables/My Project/Resources.Designer.vb delete mode 100644 Variables/My Project/Resources.resx delete mode 100644 Variables/My Project/Settings.Designer.vb delete mode 100644 Variables/My Project/Settings.settings delete mode 100644 Variables/Variables.vbproj diff --git a/DDMonorepo.sln b/DDMonorepo.sln index dc0ee726..d3da75c2 100644 --- a/DDMonorepo.sln +++ b/DDMonorepo.sln @@ -25,8 +25,6 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Messaging", "Message\Messag EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "DDTestService", "DDTestService\DDTestService.vbproj", "{63B0EAA3-8BF5-46DA-9040-15E781F4C3B1}" EndProject -Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Variables", "Variables\Variables.vbproj", "{836C9ADE-E04E-4E1E-B17A-201E68014790}" -EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Config", "Modules.Config\Config.vbproj", "{44982F9B-6116-44E2-85D0-F39650B1EF99}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Controls", "Controls", "{F98C0329-C004-417F-B2AB-7466E88D8220}" @@ -110,10 +108,6 @@ Global {63B0EAA3-8BF5-46DA-9040-15E781F4C3B1}.Debug|Any CPU.Build.0 = Debug|Any CPU {63B0EAA3-8BF5-46DA-9040-15E781F4C3B1}.Release|Any CPU.ActiveCfg = Release|Any CPU {63B0EAA3-8BF5-46DA-9040-15E781F4C3B1}.Release|Any CPU.Build.0 = Release|Any CPU - {836C9ADE-E04E-4E1E-B17A-201E68014790}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {836C9ADE-E04E-4E1E-B17A-201E68014790}.Debug|Any CPU.Build.0 = Debug|Any CPU - {836C9ADE-E04E-4E1E-B17A-201E68014790}.Release|Any CPU.ActiveCfg = Release|Any CPU - {836C9ADE-E04E-4E1E-B17A-201E68014790}.Release|Any CPU.Build.0 = Release|Any CPU {44982F9B-6116-44E2-85D0-F39650B1EF99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {44982F9B-6116-44E2-85D0-F39650B1EF99}.Debug|Any CPU.Build.0 = Debug|Any CPU {44982F9B-6116-44E2-85D0-F39650B1EF99}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -198,7 +192,6 @@ Global {EAF0EA75-5FA7-485D-89C7-B2D843B03A96} = {3E2008C8-27B1-41DD-9B1A-0C4029F6AECC} {AF664D85-0A4B-4BAB-A2F8-83110C06553A} = {3E2008C8-27B1-41DD-9B1A-0C4029F6AECC} {63B0EAA3-8BF5-46DA-9040-15E781F4C3B1} = {7AF3F9C2-C939-4A08-95C1-0453207E298A} - {836C9ADE-E04E-4E1E-B17A-201E68014790} = {3E2008C8-27B1-41DD-9B1A-0C4029F6AECC} {44982F9B-6116-44E2-85D0-F39650B1EF99} = {3E2008C8-27B1-41DD-9B1A-0C4029F6AECC} {3DCD6D1A-C830-4241-B7E4-27430E7EA483} = {F98C0329-C004-417F-B2AB-7466E88D8220} {991D0231-4623-496D-8BD0-9CA906029CBC} = {3E2008C8-27B1-41DD-9B1A-0C4029F6AECC} diff --git a/Variables/CurrentApplication.vb b/Variables/CurrentApplication.vb deleted file mode 100644 index 897b50ec..00000000 --- a/Variables/CurrentApplication.vb +++ /dev/null @@ -1,3 +0,0 @@ -Public Class CurrentApplication - Public IDBServiceOnline As Boolean = False -End Class diff --git a/Variables/CurrentUser.vb b/Variables/CurrentUser.vb deleted file mode 100644 index b8a60f73..00000000 --- a/Variables/CurrentUser.vb +++ /dev/null @@ -1,9 +0,0 @@ -Public Class CurrentUser - Public USER_GUID As String - Public USER_NAME As String - Public ReadOnly USER_LOGIN As DateTime - - Public Sub New() - USER_LOGIN = DateTime.Now - End Sub -End Class diff --git a/Variables/My Project/Application.Designer.vb b/Variables/My Project/Application.Designer.vb deleted file mode 100644 index 8ab460ba..00000000 --- a/Variables/My Project/Application.Designer.vb +++ /dev/null @@ -1,13 +0,0 @@ -'------------------------------------------------------------------------------ -' -' Dieser Code wurde von einem Tool generiert. -' Laufzeitversion:4.0.30319.42000 -' -' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -' der Code erneut generiert wird. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - diff --git a/Variables/My Project/Application.myapp b/Variables/My Project/Application.myapp deleted file mode 100644 index 758895de..00000000 --- a/Variables/My Project/Application.myapp +++ /dev/null @@ -1,10 +0,0 @@ - - - false - false - 0 - true - 0 - 1 - true - diff --git a/Variables/My Project/AssemblyInfo.vb b/Variables/My Project/AssemblyInfo.vb deleted file mode 100644 index 4b2458e2..00000000 --- a/Variables/My Project/AssemblyInfo.vb +++ /dev/null @@ -1,35 +0,0 @@ -Imports System -Imports System.Reflection -Imports System.Runtime.InteropServices - -' Allgemeine Informationen über eine Assembly werden über die folgenden -' Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -' die einer Assembly zugeordnet sind. - -' Werte der Assemblyattribute überprüfen - - - - - - - - - - -'Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird. - - -' Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -' -' Hauptversion -' Nebenversion -' Buildnummer -' Revision -' -' Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -' übernehmen, indem Sie "*" eingeben: -' - - - diff --git a/Variables/My Project/Resources.Designer.vb b/Variables/My Project/Resources.Designer.vb deleted file mode 100644 index 1c9f8325..00000000 --- a/Variables/My Project/Resources.Designer.vb +++ /dev/null @@ -1,63 +0,0 @@ -'------------------------------------------------------------------------------ -' -' Dieser Code wurde von einem Tool generiert. -' Laufzeitversion:4.0.30319.42000 -' -' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -' der Code erneut generiert wird. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - -Imports System - -Namespace My.Resources - - 'Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - '-Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - 'Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - 'mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - ''' - ''' Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - ''' - _ - Friend Module Resources - - Private resourceMan As Global.System.Resources.ResourceManager - - Private resourceCulture As Global.System.Globalization.CultureInfo - - ''' - ''' Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - ''' - _ - Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager - Get - If Object.ReferenceEquals(resourceMan, Nothing) Then - Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("DigitalData.Modules.Variables.Resources", GetType(Resources).Assembly) - resourceMan = temp - End If - Return resourceMan - End Get - End Property - - ''' - ''' Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - ''' Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. - ''' - _ - Friend Property Culture() As Global.System.Globalization.CultureInfo - Get - Return resourceCulture - End Get - Set - resourceCulture = value - End Set - End Property - End Module -End Namespace diff --git a/Variables/My Project/Resources.resx b/Variables/My Project/Resources.resx deleted file mode 100644 index af7dbebb..00000000 --- a/Variables/My Project/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Variables/My Project/Settings.Designer.vb b/Variables/My Project/Settings.Designer.vb deleted file mode 100644 index c9f54ee0..00000000 --- a/Variables/My Project/Settings.Designer.vb +++ /dev/null @@ -1,73 +0,0 @@ -'------------------------------------------------------------------------------ -' -' Dieser Code wurde von einem Tool generiert. -' Laufzeitversion:4.0.30319.42000 -' -' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -' der Code erneut generiert wird. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - - -Namespace My - - _ - Partial Friend NotInheritable Class MySettings - Inherits Global.System.Configuration.ApplicationSettingsBase - - Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) - -#Region "Automatische My.Settings-Speicherfunktion" -#If _MyType = "WindowsForms" Then - Private Shared addedHandler As Boolean - - Private Shared addedHandlerLockObject As New Object - - _ - Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) - If My.Application.SaveMySettingsOnExit Then - My.Settings.Save() - End If - End Sub -#End If -#End Region - - Public Shared ReadOnly Property [Default]() As MySettings - Get - -#If _MyType = "WindowsForms" Then - If Not addedHandler Then - SyncLock addedHandlerLockObject - If Not addedHandler Then - AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings - addedHandler = True - End If - End SyncLock - End If -#End If - Return defaultInstance - End Get - End Property - End Class -End Namespace - -Namespace My - - _ - Friend Module MySettingsProperty - - _ - Friend ReadOnly Property Settings() As Global.DigitalData.Modules.Variables.My.MySettings - Get - Return Global.DigitalData.Modules.Variables.My.MySettings.Default - End Get - End Property - End Module -End Namespace diff --git a/Variables/My Project/Settings.settings b/Variables/My Project/Settings.settings deleted file mode 100644 index 85b890b3..00000000 --- a/Variables/My Project/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Variables/Variables.vbproj b/Variables/Variables.vbproj deleted file mode 100644 index 90fa3e59..00000000 --- a/Variables/Variables.vbproj +++ /dev/null @@ -1,104 +0,0 @@ - - - - - Debug - AnyCPU - {836C9ADE-E04E-4E1E-B17A-201E68014790} - Library - DigitalData.Modules.Variables - DigitalData.Modules.Variables - 512 - Windows - v4.6.1 - - - true - full - true - true - bin\Debug\ - DigitalData.Modules.Variables.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - - - pdbonly - false - true - true - bin\Release\ - DigitalData.Modules.Variables.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - - - On - - - Binary - - - Off - - - On - - - - - - - - - - - - - - - - - - - - - - - - - - - True - Application.myapp - - - True - True - Resources.resx - - - True - Settings.settings - True - - - - - VbMyResourcesResXFileCodeGenerator - Resources.Designer.vb - My.Resources - Designer - - - - - MyApplicationCodeGenerator - Application.Designer.vb - - - SettingsSingleFileGenerator - My - Settings.Designer.vb - - - - \ No newline at end of file From d3b5955b454cbbe9c330ecfafd69fbbf6d543bae Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Fri, 14 Jun 2019 14:18:14 +0200 Subject: [PATCH 02/20] ClientSuite: Improve WorkerManager --- GUIs.ClientSuite/Workers/HeartbeatWorker.vb | 23 +++-- GUIs.ClientSuite/Workers/IWorker.vb | 1 + GUIs.ClientSuite/Workers/WorkerManager.vb | 85 +++++++++++++------ .../Workers/WorkflowOverviewWorker.vb | 1 + GUIs.ClientSuite/frmMain.vb | 4 +- 5 files changed, 71 insertions(+), 43 deletions(-) diff --git a/GUIs.ClientSuite/Workers/HeartbeatWorker.vb b/GUIs.ClientSuite/Workers/HeartbeatWorker.vb index 7bba52ba..892b90bd 100644 --- a/GUIs.ClientSuite/Workers/HeartbeatWorker.vb +++ b/GUIs.ClientSuite/Workers/HeartbeatWorker.vb @@ -1,47 +1,44 @@ Imports System.Timers -Imports DigitalData.GUIs.ClientSuite Imports DigitalData.GUIs.ClientSuite.Base -Imports DigitalData.Modules.EDMIAPI.IDBServiceReference Imports DigitalData.Modules.Logging + Namespace Workers Public Class HeartbeatWorker Inherits BaseClass Implements IWorker - Private _Channel As IIDBServiceChannel - Public Event OnlineChanged As OnlineChangedEventHandler Public Delegate Sub OnlineChangedEventHandler(sender As Object, Online As Boolean) Public ReadOnly Property Interval As Integer = 4000 Implements IWorker.Interval + Public ReadOnly Property Name As String = "Heartbeat Worker" Implements IWorker.Name Public Sub New(LogConfig As LogConfig) MyBase.New(LogConfig) End Sub Public Sub Setup() Implements IWorker.Setup - _Channel = My.ChannelFactory.CreateChannel() - _Channel.Open() + Logger.Debug("Starting {0}", "HeartbeatWorker") End Sub - Public Async Sub Callback(manager As WorkerManager, e As ElapsedEventArgs) Implements IWorker.Callback + Public Async Sub Callback(Manager As WorkerManager, e As ElapsedEventArgs) Implements IWorker.Callback Try - Logger.Debug("Checking if Service is up...") - - If _Channel.State = ServiceModel.CommunicationState.Faulted Then - _Channel = My.ChannelFactory.CreateChannel() + If My.Channel.State = ServiceModel.CommunicationState.Faulted Then + My.Channel = My.ChannelFactory.CreateChannel() End If ' Connect to service and send hearbeat request - Dim oResult = Await _Channel.HeartbeatAsync() + Dim oResult = Await My.Channel.HeartbeatAsync() Logger.Debug("Service is online") SetOnlineState(True) Catch ex As Exception + Logger.Debug("Service is offline!") Logger.Error(ex) + Manager.StopWorkers() SetOnlineState(False) Finally My.Application.Service.LastChecked = DateTime.Now @@ -49,7 +46,7 @@ Namespace Workers End Sub Public Sub Teardown() Implements IWorker.Teardown - ' TODO: Close channel gracefully + Logger.Debug("Stopping {0}", Name) End Sub Private Sub SetOnlineState(NewState As Boolean) diff --git a/GUIs.ClientSuite/Workers/IWorker.vb b/GUIs.ClientSuite/Workers/IWorker.vb index 9405ca10..3a967712 100644 --- a/GUIs.ClientSuite/Workers/IWorker.vb +++ b/GUIs.ClientSuite/Workers/IWorker.vb @@ -3,6 +3,7 @@ Namespace Workers Public Interface IWorker ReadOnly Property Interval As Integer + ReadOnly Property Name As String Sub Setup() Sub Teardown() diff --git a/GUIs.ClientSuite/Workers/WorkerManager.vb b/GUIs.ClientSuite/Workers/WorkerManager.vb index e48e1fa9..e3407bc7 100644 --- a/GUIs.ClientSuite/Workers/WorkerManager.vb +++ b/GUIs.ClientSuite/Workers/WorkerManager.vb @@ -6,6 +6,14 @@ Namespace Workers Public Class WorkerManager Inherits BaseClass + ''' + ''' Holds information about a worker + ''' + Class WorkerState + Public Worker As IWorker + Public Timer As Timer + End Class + ''' ''' List of workers that will be started. ''' @@ -13,52 +21,73 @@ Namespace Workers GetType(HeartbeatWorker), GetType(WorkflowOverviewWorker) } - Private Workers As New List(Of IWorker) - Private TimerList As New List(Of Timer) + Private Workers As New List(Of WorkerState) Public Sub New(LogConfig As LogConfig, SyncronizingObject As frmMain) MyBase.New(LogConfig) - Workers = CreateWorkers() - - For Each oWorker As IWorker In Workers - Dim oTimer = New Timer(oWorker.Interval) With { - .SynchronizingObject = SyncronizingObject, - .Enabled = True - } - - AddHandler oTimer.Elapsed, Sub(sender As Object, e As ElapsedEventArgs) - Try - oWorker.Callback(Me, e) - Catch ex As Exception - Logger.Warn("Worker {0} threw an error in callback.", oWorker.GetType.Name) - End Try - End Sub - - TimerList.Add(oTimer) - Next + Workers = CreateWorkers(SyncronizingObject) End Sub Public Function GetWorker(Of T)() As T - For Each oWorker In Workers - If TypeOf oWorker Is T Then - Return oWorker + For Each oWorkerState As WorkerState In Workers + If TypeOf oWorkerState.Worker Is T Then + Return oWorkerState.Worker End If Next Return Nothing End Function - Private Function CreateWorkers() As List(Of IWorker) - Dim oWorkers As New List(Of IWorker) + Public Sub StopWorkers() + Logger.Debug("Stopping all workers..") + For Each oWorkerState In Workers + oWorkerState.Timer.Stop() + + Try + oWorkerState.Worker.Teardown() + Catch ex As Exception + Logger.Warn("Worker {0} threw an error during teardown.", oWorkerState.Worker.Name) + End Try + Next + Logger.Debug("All workers stopped.") + End Sub + + Private Function CreateTimer(Worker As IWorker, SyncronizingObject As frmMain) + Dim oTimer = New Timer(Worker.Interval) With { + .SynchronizingObject = SyncronizingObject, + .Enabled = True + } + + AddHandler oTimer.Elapsed, Sub(sender As Object, e As ElapsedEventArgs) + Try + Worker.Callback(Me, e) + Catch ex As Exception + Logger.Warn("Worker {0} threw an error in callback.", Worker.Name) + Logger.Error(ex) + End Try + End Sub + + Return oTimer + End Function + + Private Function CreateWorkers(SyncronizingObject As frmMain) As List(Of WorkerState) + Dim oWorkers As New List(Of WorkerState) For Each oWorkerType In WorkerTypes + Dim oWorker As IWorker = Activator.CreateInstance(oWorkerType, New Object() {LogConfig}) + Try - Dim oWorker As IWorker = Activator.CreateInstance(oWorkerType, New Object() {LogConfig}) oWorker.Setup() - oWorkers.Add(oWorker) + + Dim oWorkerState As New WorkerState() With { + .Worker = oWorker, + .Timer = CreateTimer(oWorker, SyncronizingObject) + } + + oWorkers.Add(oWorkerState) Catch ex As Exception - Logger.Warn("Worker {0} threw an error while creating. Skipping.", oWorkerType.Name) + Logger.Warn("Worker {0} threw an error during setup. Skipping.", oWorker.Name) Logger.Error(ex) Continue For End Try diff --git a/GUIs.ClientSuite/Workers/WorkflowOverviewWorker.vb b/GUIs.ClientSuite/Workers/WorkflowOverviewWorker.vb index e7578624..1e70e8be 100644 --- a/GUIs.ClientSuite/Workers/WorkflowOverviewWorker.vb +++ b/GUIs.ClientSuite/Workers/WorkflowOverviewWorker.vb @@ -12,6 +12,7 @@ Namespace Workers End Sub Public ReadOnly Property Interval As Integer = 60000 Implements IWorker.Interval + Public ReadOnly Property Name As String = "WorkflowOverview Worker" Implements IWorker.Name Public Sub Setup() Implements IWorker.Setup Throw New NotImplementedException() diff --git a/GUIs.ClientSuite/frmMain.vb b/GUIs.ClientSuite/frmMain.vb index 72e3aa99..257ecca3 100644 --- a/GUIs.ClientSuite/frmMain.vb +++ b/GUIs.ClientSuite/frmMain.vb @@ -37,11 +37,11 @@ Public Class frmMain End Sub Private Sub HandleOnlineChanged(sender As Object, Online As Boolean) + SetOnlineLabel(Online) If Online = False Then - + MessageBox.Show($"Application will be closed now.{vbNewLine}Reason: Service is offline.", "Critical Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Application.Exit() End If - SetOnlineLabel(Online) End Sub Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles Me.Load From 0878c02acecb3337efe9ad1f39c5d688b5eae9e8 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Mon, 17 Jun 2019 10:45:09 +0200 Subject: [PATCH 03/20] fix appdata path and log path --- GUIs.ClientSuite/ApplicationEvents.vb | 9 +++++---- GUIs.ClientSuite/frmConfigUser.vb | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/GUIs.ClientSuite/ApplicationEvents.vb b/GUIs.ClientSuite/ApplicationEvents.vb index c581efb4..f970a639 100644 --- a/GUIs.ClientSuite/ApplicationEvents.vb +++ b/GUIs.ClientSuite/ApplicationEvents.vb @@ -13,18 +13,19 @@ Namespace My Private _Logger As Logger Private _BaseUserConfigPath As String = Windows.Forms.Application.UserAppDataPath + Private _BaseLocalUserConfigPath As String = Windows.Forms.Application.LocalUserAppDataPath Private _BaseMachineConfigPath As String = Windows.Forms.Application.CommonAppDataPath Public Sub App_Startup() Handles Me.Startup - Dim oLogConfig As New LogConfig(PathType.AppData) + Dim oLogConfig As New LogConfig(PathType.CustomPath, IO.Path.Combine(_BaseLocalUserConfigPath, "Log")) ' System Config files like Service Url will be saved in %LocalAppdata% so they will remain on the machine Dim oSystemConfigManager As New ConfigManager(Of ClassConfig)(oLogConfig, - Windows.Forms.Application.UserAppDataPath, - Windows.Forms.Application.CommonAppDataPath) + _BaseLocalUserConfigPath, + _BaseMachineConfigPath) ' Layout files will be saved in %Appdata% (Roaming) so they will be syncronized with the user profile - Dim oUIConfigPath = IO.Path.Combine(Windows.Forms.Application.UserAppDataPath, ClassConstants.FOLDER_NAME_LAYOUT) + Dim oUIConfigPath = IO.Path.Combine(_BaseUserConfigPath, ClassConstants.FOLDER_NAME_LAYOUT) Dim oUIConfigManager As New ConfigManager(Of ClassUIConfig)(oLogConfig, oUIConfigPath, oUIConfigPath) LogConfig = oLogConfig diff --git a/GUIs.ClientSuite/frmConfigUser.vb b/GUIs.ClientSuite/frmConfigUser.vb index 620653b4..80c884bf 100644 --- a/GUIs.ClientSuite/frmConfigUser.vb +++ b/GUIs.ClientSuite/frmConfigUser.vb @@ -22,7 +22,8 @@ Public Class frmConfigUser End Sub Private Sub btnAppFolder_Click(sender As Object, e As EventArgs) Handles btnAppFolder.Click - Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)) + Dim oAppData = Application.LocalUserAppDataPath + Process.Start(oAppData) End Sub Private Sub chkLogErrorsOnly_CheckedChanged(sender As Object, e As EventArgs) Handles chkLogErrorsOnly.CheckedChanged From d3d669cf3ad64ac3ed345d90797195f0152d931d Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Mon, 17 Jun 2019 14:54:41 +0200 Subject: [PATCH 04/20] fix numbering of group counts --- Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb index 96da49a9..cce1a012 100644 --- a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb +++ b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb @@ -238,6 +238,9 @@ Public Class ImportZUGFeRDFiles For Each oFile In oFileGroupFiles Dim oDocument As CrossIndustryDocumentType + ' Start a global group counter for each file + Dim oGlobalGroupCounter = 0 + ' Clear missing properties for the new file oMissingProperties = New List(Of String) oCurrentFileCount += 1 @@ -372,7 +375,7 @@ Public Class ImportZUGFeRDFiles Dim oTableName As String = oColumn.Key.TableName Dim oPropertyDescription As String = oColumn.Key.Description Dim oPropertyValue = oColumn.Value.Item(oRowIndex) - Dim oRowCounter = oRowIndex + 1 + Dim oRowCounter = oRowIndex + oGlobalGroupCounter + 1 _logger.Debug("Processing property {0}.", oPropertyDescription) @@ -414,6 +417,8 @@ Public Class ImportZUGFeRDFiles _firebird.ExecuteNonQueryWithConnection(oCommand, oConnection, Firebird.TransactionMode.ExternalTransaction, oTransaction) Next Next + + oGlobalGroupCounter += oRowCount Next ' Iterate through default properties From 274a7134add4c9cb2317102abd0151506bb6e2bb Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Mon, 17 Jun 2019 14:54:51 +0200 Subject: [PATCH 05/20] add button to open input path --- GUIs.Test.ZUGFeRDTest/Form1.Designer.vb | 12 ++++++++++++ GUIs.Test.ZUGFeRDTest/Form1.vb | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/GUIs.Test.ZUGFeRDTest/Form1.Designer.vb b/GUIs.Test.ZUGFeRDTest/Form1.Designer.vb index 70336604..db791236 100644 --- a/GUIs.Test.ZUGFeRDTest/Form1.Designer.vb +++ b/GUIs.Test.ZUGFeRDTest/Form1.Designer.vb @@ -29,6 +29,7 @@ Partial Class Form1 Me.Button3 = New System.Windows.Forms.Button() Me.Button4 = New System.Windows.Forms.Button() Me.txtMD5Checksum = New System.Windows.Forms.TextBox() + Me.Button5 = New System.Windows.Forms.Button() Me.SuspendLayout() ' 'OpenFileDialog1 @@ -88,11 +89,21 @@ Partial Class Form1 Me.txtMD5Checksum.TabIndex = 5 Me.txtMD5Checksum.Text = Global.ZUGFeRDTest.My.MySettings.Default.MD5Cheksum ' + 'Button5 + ' + Me.Button5.Location = New System.Drawing.Point(12, 41) + Me.Button5.Name = "Button5" + Me.Button5.Size = New System.Drawing.Size(221, 23) + Me.Button5.TabIndex = 6 + Me.Button5.Text = "Open Input Folder" + Me.Button5.UseVisualStyleBackColor = True + ' 'Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(916, 435) + Me.Controls.Add(Me.Button5) Me.Controls.Add(Me.txtMD5Checksum) Me.Controls.Add(Me.Button4) Me.Controls.Add(Me.Button3) @@ -113,4 +124,5 @@ Partial Class Form1 Friend WithEvents Button3 As Button Friend WithEvents Button4 As Button Friend WithEvents txtMD5Checksum As TextBox + Friend WithEvents Button5 As Button End Class diff --git a/GUIs.Test.ZUGFeRDTest/Form1.vb b/GUIs.Test.ZUGFeRDTest/Form1.vb index b48244f8..eafe4283 100644 --- a/GUIs.Test.ZUGFeRDTest/Form1.vb +++ b/GUIs.Test.ZUGFeRDTest/Form1.vb @@ -130,4 +130,8 @@ Public Class Form1 End Try End Function + + Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click + Process.Start("\\dd-sto01\DD-STO01-A2\SharedObjects\Public\Projekte\Test\Import\ZUGFerD\Email_in") + End Sub End Class From 8127760eff5266ef1dc4b69a5a5b7478bec37986 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Tue, 18 Jun 2019 13:53:04 +0200 Subject: [PATCH 06/20] add new test function for nodepaths --- GUIs.Test.ZUGFeRDTest/Form1.Designer.vb | 113 ++++++++++++++++++++---- GUIs.Test.ZUGFeRDTest/Form1.vb | 27 +++++- 2 files changed, 121 insertions(+), 19 deletions(-) diff --git a/GUIs.Test.ZUGFeRDTest/Form1.Designer.vb b/GUIs.Test.ZUGFeRDTest/Form1.Designer.vb index db791236..adc6be79 100644 --- a/GUIs.Test.ZUGFeRDTest/Form1.Designer.vb +++ b/GUIs.Test.ZUGFeRDTest/Form1.Designer.vb @@ -30,6 +30,16 @@ Partial Class Form1 Me.Button4 = New System.Windows.Forms.Button() Me.txtMD5Checksum = New System.Windows.Forms.TextBox() Me.Button5 = New System.Windows.Forms.Button() + Me.GroupBox1 = New System.Windows.Forms.GroupBox() + Me.GroupBox2 = New System.Windows.Forms.GroupBox() + Me.GroupBox3 = New System.Windows.Forms.GroupBox() + Me.txtPropName = New System.Windows.Forms.TextBox() + Me.GroupBox4 = New System.Windows.Forms.GroupBox() + Me.Button6 = New System.Windows.Forms.Button() + Me.GroupBox1.SuspendLayout() + Me.GroupBox2.SuspendLayout() + Me.GroupBox3.SuspendLayout() + Me.GroupBox4.SuspendLayout() Me.SuspendLayout() ' 'OpenFileDialog1 @@ -38,7 +48,7 @@ Partial Class Form1 ' 'Button1 ' - Me.Button1.Location = New System.Drawing.Point(12, 12) + Me.Button1.Location = New System.Drawing.Point(6, 19) Me.Button1.Name = "Button1" Me.Button1.Size = New System.Drawing.Size(221, 23) Me.Button1.TabIndex = 0 @@ -55,65 +65,128 @@ Partial Class Form1 ' 'Button2 ' - Me.Button2.Location = New System.Drawing.Point(12, 122) + Me.Button2.Location = New System.Drawing.Point(6, 19) Me.Button2.Name = "Button2" Me.Button2.Size = New System.Drawing.Size(221, 23) Me.Button2.TabIndex = 2 - Me.Button2.Text = "Validate Single File" + Me.Button2.Text = "Validate PDF" Me.Button2.UseVisualStyleBackColor = True ' 'Button3 ' - Me.Button3.Location = New System.Drawing.Point(12, 151) + Me.Button3.Location = New System.Drawing.Point(6, 48) Me.Button3.Name = "Button3" Me.Button3.Size = New System.Drawing.Size(221, 23) Me.Button3.TabIndex = 3 - Me.Button3.Text = "Load Single File" + Me.Button3.Text = "Validate and Serialize PDF" Me.Button3.UseVisualStyleBackColor = True ' 'Button4 ' - Me.Button4.Location = New System.Drawing.Point(12, 193) + Me.Button4.Location = New System.Drawing.Point(6, 19) Me.Button4.Name = "Button4" Me.Button4.Size = New System.Drawing.Size(221, 23) Me.Button4.TabIndex = 4 - Me.Button4.Text = "MD5Chcksum" + Me.Button4.Text = "Create MD5 Checksum for PDF" Me.Button4.UseVisualStyleBackColor = True ' 'txtMD5Checksum ' Me.txtMD5Checksum.DataBindings.Add(New System.Windows.Forms.Binding("Text", Global.ZUGFeRDTest.My.MySettings.Default, "MD5Cheksum", True, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)) - Me.txtMD5Checksum.Location = New System.Drawing.Point(12, 222) + Me.txtMD5Checksum.Location = New System.Drawing.Point(6, 49) Me.txtMD5Checksum.Name = "txtMD5Checksum" - Me.txtMD5Checksum.Size = New System.Drawing.Size(360, 20) + Me.txtMD5Checksum.Size = New System.Drawing.Size(348, 20) Me.txtMD5Checksum.TabIndex = 5 Me.txtMD5Checksum.Text = Global.ZUGFeRDTest.My.MySettings.Default.MD5Cheksum ' 'Button5 ' - Me.Button5.Location = New System.Drawing.Point(12, 41) + Me.Button5.Location = New System.Drawing.Point(6, 48) Me.Button5.Name = "Button5" Me.Button5.Size = New System.Drawing.Size(221, 23) Me.Button5.TabIndex = 6 Me.Button5.Text = "Open Input Folder" Me.Button5.UseVisualStyleBackColor = True ' + 'GroupBox1 + ' + Me.GroupBox1.Controls.Add(Me.Button1) + Me.GroupBox1.Controls.Add(Me.Button5) + Me.GroupBox1.Location = New System.Drawing.Point(12, 12) + Me.GroupBox1.Name = "GroupBox1" + Me.GroupBox1.Size = New System.Drawing.Size(360, 92) + Me.GroupBox1.TabIndex = 7 + Me.GroupBox1.TabStop = False + Me.GroupBox1.Text = "Run Job like in ZUGFeRD Service" + ' + 'GroupBox2 + ' + Me.GroupBox2.Controls.Add(Me.Button2) + Me.GroupBox2.Controls.Add(Me.Button3) + Me.GroupBox2.Location = New System.Drawing.Point(12, 110) + Me.GroupBox2.Name = "GroupBox2" + Me.GroupBox2.Size = New System.Drawing.Size(360, 90) + Me.GroupBox2.TabIndex = 8 + Me.GroupBox2.TabStop = False + Me.GroupBox2.Text = "Run Functions on a single file (needs Breakpoint)" + ' + 'GroupBox3 + ' + Me.GroupBox3.Controls.Add(Me.Button4) + Me.GroupBox3.Controls.Add(Me.txtMD5Checksum) + Me.GroupBox3.Location = New System.Drawing.Point(12, 206) + Me.GroupBox3.Name = "GroupBox3" + Me.GroupBox3.Size = New System.Drawing.Size(360, 85) + Me.GroupBox3.TabIndex = 9 + Me.GroupBox3.TabStop = False + Me.GroupBox3.Text = "Open PDF and calculate Checksum" + ' + 'txtPropName + ' + Me.txtPropName.Location = New System.Drawing.Point(6, 48) + Me.txtPropName.Name = "txtPropName" + Me.txtPropName.Size = New System.Drawing.Size(348, 20) + Me.txtPropName.TabIndex = 10 + ' + 'GroupBox4 + ' + Me.GroupBox4.Controls.Add(Me.Button6) + Me.GroupBox4.Controls.Add(Me.txtPropName) + Me.GroupBox4.Location = New System.Drawing.Point(12, 297) + Me.GroupBox4.Name = "GroupBox4" + Me.GroupBox4.Size = New System.Drawing.Size(360, 122) + Me.GroupBox4.TabIndex = 11 + Me.GroupBox4.TabStop = False + Me.GroupBox4.Text = "GroupBox4" + ' + 'Button6 + ' + Me.Button6.Location = New System.Drawing.Point(6, 19) + Me.Button6.Name = "Button6" + Me.Button6.Size = New System.Drawing.Size(221, 23) + Me.Button6.TabIndex = 11 + Me.Button6.Text = "Find and Extract XML Path Value" + Me.Button6.UseVisualStyleBackColor = True + ' 'Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(916, 435) - Me.Controls.Add(Me.Button5) - Me.Controls.Add(Me.txtMD5Checksum) - Me.Controls.Add(Me.Button4) - Me.Controls.Add(Me.Button3) - Me.Controls.Add(Me.Button2) + Me.Controls.Add(Me.GroupBox4) + Me.Controls.Add(Me.GroupBox3) + Me.Controls.Add(Me.GroupBox2) + Me.Controls.Add(Me.GroupBox1) Me.Controls.Add(Me.ListBox1) - Me.Controls.Add(Me.Button1) Me.Name = "Form1" Me.Text = "Form1" + Me.GroupBox1.ResumeLayout(False) + Me.GroupBox2.ResumeLayout(False) + Me.GroupBox3.ResumeLayout(False) + Me.GroupBox3.PerformLayout() + Me.GroupBox4.ResumeLayout(False) + Me.GroupBox4.PerformLayout() Me.ResumeLayout(False) - Me.PerformLayout() End Sub @@ -125,4 +198,10 @@ Partial Class Form1 Friend WithEvents Button4 As Button Friend WithEvents txtMD5Checksum As TextBox Friend WithEvents Button5 As Button + Friend WithEvents GroupBox1 As GroupBox + Friend WithEvents GroupBox2 As GroupBox + Friend WithEvents GroupBox3 As GroupBox + Friend WithEvents txtPropName As TextBox + Friend WithEvents GroupBox4 As GroupBox + Friend WithEvents Button6 As Button End Class diff --git a/GUIs.Test.ZUGFeRDTest/Form1.vb b/GUIs.Test.ZUGFeRDTest/Form1.vb index eafe4283..e03630b5 100644 --- a/GUIs.Test.ZUGFeRDTest/Form1.vb +++ b/GUIs.Test.ZUGFeRDTest/Form1.vb @@ -109,7 +109,11 @@ Public Class Form1 Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click My.Settings.Save() Dim result = checkMD5(txtMD5Checksum.Text) - MsgBox("Done") + If IsNothing(result) Then + MsgBox("Could not calculate MD5 Checksum") + Else + txtMD5Checksum.Text = result + End If End Sub Public Function checkMD5(ByVal filename As String) As String Try @@ -128,10 +132,29 @@ Public Class Form1 Catch ex As Exception Return Nothing End Try - End Function Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click Process.Start("\\dd-sto01\DD-STO01-A2\SharedObjects\Public\Projekte\Test\Import\ZUGFerD\Email_in") End Sub + + Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click + Dim oResult = OpenFileDialog1.ShowDialog() + + If oResult = DialogResult.OK Then + Dim oDoc = _zugferd.ValidateZUGFeRDFile(OpenFileDialog1.FileName) + Dim oZUGFERD As CrossIndustryDocumentType = _zugferd.SerializeZUGFeRDDocument(oDoc) + Dim oPropName As String = txtPropName.Text + + Try + Dim oExtractor = New PropertyValues(_logConfig) + Dim oValue As List(Of Object) = oExtractor.GetPropValue(oZUGFERD, oPropName) + Dim oFinalValue As List(Of Object) = oExtractor.GetFinalPropValue(oValue) + Console.WriteLine() + + Catch ex As Exception + MsgBox(ex.Message) + End Try + End If + End Sub End Class From 617315667c58552729fab3099fd2d7b6b43ca730 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Tue, 18 Jun 2019 13:55:52 +0200 Subject: [PATCH 07/20] flatten grouped results, add try..catch blocks at crititcal places --- Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb | 72 +++++++++++++++---------- Jobs/EDMI/ZUGFeRD/PropertyValues.vb | 33 ++++++++++++ 2 files changed, 77 insertions(+), 28 deletions(-) diff --git a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb index cce1a012..cb7aabbd 100644 --- a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb +++ b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb @@ -301,7 +301,6 @@ Public Class ImportZUGFeRDFiles Function(Item) Item) _logger.Debug("Found {0} properties grouped in {1} group(s)", args.PropertyMap.Count - oDefaultProperties.Count, oGroupedProperties.Count) - ' Iterate through groups to get group scope and group items For Each oGroup In oGroupedProperties Dim oGroupScope As String = oGroup.Key @@ -312,8 +311,20 @@ Public Class ImportZUGFeRDFiles ' get properties as a nested object, see `oPropertyList` For Each oProperty As KeyValuePair(Of String, XmlItemProperty) In oGroup - Dim oPropertyValues As List(Of Object) = oPropertyExtractor.GetPropValue(oDocument, oProperty.Key) + Dim oPropertyValues As List(Of Object) + + Try + oPropertyValues = oPropertyExtractor.GetPropValue(oDocument, oProperty.Key) + Catch ex As Exception + _logger.Warn("Unknown error occurred while fetching property {0} in group {1}:", oProperty.Value.Description, oGroupScope) + _logger.Error(ex) + oPropertyValues = New List(Of Object) + End Try + + ' Flatten result value + oPropertyValues = oPropertyExtractor.GetFinalPropValue(oPropertyValues) + ' Add to list oPropertyList.Add(oProperty.Value, oPropertyValues) ' check the first batch of values to determine the row count @@ -379,16 +390,6 @@ Public Class ImportZUGFeRDFiles _logger.Debug("Processing property {0}.", oPropertyDescription) - If TypeOf oPropertyValue Is List(Of Object) Then - Select Case oPropertyValue.Count - Case 0 - oPropertyValue = String.Empty - Case Else - Dim oList As List(Of Object) = DirectCast(oPropertyValue, List(Of Object)) - oPropertyValue = oList.Item(0) - End Select - End If - If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then If oColumn.Key.IsRequired Then _logger.Warn("Property {0} is empty or not found but was required. Continuing with Empty String.", oPropertyDescription) @@ -423,26 +424,41 @@ Public Class ImportZUGFeRDFiles ' Iterate through default properties For Each Item As KeyValuePair(Of String, XmlItemProperty) In oDefaultProperties - Dim oPropertyValueList As List(Of Object) = oPropertyExtractor.GetPropValue(oDocument, Item.Key) + Dim oPropertyValueList As List(Of Object) Dim oPropertyDescription As String = Item.Value.Description Dim oPropertyValue As Object = Nothing - If IsNothing(oPropertyValueList) Then - oPropertyValue = Nothing - ElseIf TypeOf oPropertyValueList Is List(Of Object) Then - Select Case oPropertyValueList.Count - Case 0 - oPropertyValue = Nothing - Case Else - oPropertyValue = oPropertyValueList.First() - - ' This should hopefully show config errors - If TypeOf oPropertyValue Is List(Of Object) Then - _logger.Warn("Property with Description {0} may be configured incorrectly", oPropertyDescription) + Try + oPropertyValueList = oPropertyExtractor.GetPropValue(oDocument, Item.Key) + Catch ex As Exception + _logger.Warn("Unknown error occurred while fetching property {0} in group {1}:", oPropertyDescription, Item.Value.GroupScope) + _logger.Error(ex) + oPropertyValueList = New List(Of Object) + End Try + + Try + If IsNothing(oPropertyValueList) Then + oPropertyValue = Nothing + ElseIf TypeOf oPropertyValueList Is List(Of Object) Then + Select Case oPropertyValueList.Count + Case 0 oPropertyValue = Nothing - End If - End Select - End If + Case Else + Dim oList As List(Of Object) = DirectCast(oPropertyValueList, List(Of Object)) + oPropertyValue = oList.Item(0) + + ' This should hopefully show config errors + If TypeOf oPropertyValue Is List(Of Object) Then + _logger.Warn("Property with Description {0} may be configured incorrectly", oPropertyDescription) + oPropertyValue = Nothing + End If + End Select + End If + Catch ex As Exception + _logger.Warn("Unknown error occurred while processing property {0}:", oPropertyDescription) + _logger.Error(ex) + oPropertyValue = Nothing + End Try If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then If Item.Value.IsRequired Then diff --git a/Jobs/EDMI/ZUGFeRD/PropertyValues.vb b/Jobs/EDMI/ZUGFeRD/PropertyValues.vb index 7baabe41..f8065f3c 100644 --- a/Jobs/EDMI/ZUGFeRD/PropertyValues.vb +++ b/Jobs/EDMI/ZUGFeRD/PropertyValues.vb @@ -1,4 +1,5 @@ Imports System.Collections.Generic +Imports System.Linq Imports System.Reflection Imports System.Text.RegularExpressions Imports DigitalData.Modules.Logging @@ -87,6 +88,38 @@ Public Class PropertyValues Return New List(Of Object) From {Obj} End Function + Public Function GetFinalPropValue(List As List(Of Object)) As List(Of Object) + Dim oResult As New List(Of Object) + + For Each Item In List + Dim oItemValue = DoGetFinalPropValue(Item) + + If Not IsNothing(oItemValue) Then + oResult.Add(oItemValue) + End If + Next + + Return oResult + End Function + + Private Function DoGetFinalPropValue(Value As Object) As String + If TypeOf Value Is List(Of Object) Then + Dim oList = DirectCast(Value, List(Of Object)) + Dim oCount = oList.Count + + Select Case oCount + Case 0 + Return Nothing + Case Else + Return DoGetFinalPropValue(oList.First()) + End Select + + Return DoGetFinalPropValue(Value) + Else + Return Value.ToString + End If + End Function + Private Function GetIndex(Prop As String) As Integer If Regex.IsMatch(Prop, _indexPattern) Then Dim oMatch = _indexRegex.Match(Prop) From 2c675b6181f859d5e5e88d813a676058266d16df Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Wed, 19 Jun 2019 11:58:11 +0200 Subject: [PATCH 08/20] fix split bug in propertyvalues, remove obsolete functions --- Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb | 40 ------------------------- Jobs/EDMI/ZUGFeRD/PropertyValues.vb | 6 +--- 2 files changed, 1 insertion(+), 45 deletions(-) diff --git a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb index cb7aabbd..1942f890 100644 --- a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb +++ b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb @@ -333,46 +333,6 @@ Public Class ImportZUGFeRDFiles End If Next - ' check for rows that are empty in every column - ' this happens when a grouped row is not filled - ' e.g. a row in a invoice that is just a note - _logger.Debug("Done Fetching Property values.") - Dim oIndexesToRemove As New List(Of Integer) - - For oRowIndex = 0 To oRowCount - 1 - Dim oColumnIsEmpty = False - - For Each oRow In oPropertyList - Dim oValue As List(Of Object) = oRow.Value - 'Dim oValue As List(Of Object) = oRow.Value.Item(oRowIndex) - oColumnIsEmpty = oValue.Count = 0 - Next - - If oColumnIsEmpty Then - oIndexesToRemove.Add(oRowIndex) - End If - Next - - _logger.Debug("Removing {0} empty rows.", oIndexesToRemove) - - - ' order indexes to remove descending to avoid indexOutOfRange errors - If oIndexesToRemove.Count > 0 Then - oIndexesToRemove = oIndexesToRemove. - OrderByDescending(Function(oIndex) oIndex). - ToList() - End If - - ' now remove all empty rows. - For Each oIndex In oIndexesToRemove - For Each oRow In oPropertyList - oRow.Value.RemoveAt(oIndex) - Next - Next - - ' decrease row count by rows removed - oRowCount -= oIndexesToRemove.Count - ' Structure of oPropertyList ' [ # Propertyname # Row 1 # Row 2 ' PositionsMenge: [BilledQuantity1, BilledQuantity2, ...], diff --git a/Jobs/EDMI/ZUGFeRD/PropertyValues.vb b/Jobs/EDMI/ZUGFeRD/PropertyValues.vb index f8065f3c..31c6bfc6 100644 --- a/Jobs/EDMI/ZUGFeRD/PropertyValues.vb +++ b/Jobs/EDMI/ZUGFeRD/PropertyValues.vb @@ -60,7 +60,7 @@ Public Class PropertyValues If IsArray(Obj) And Not oHasIndex Then Dim oCurrentPart As String = oPart - Dim oSplitString As String() = New String() {"." & oCurrentPart & "."} + Dim oSplitString As String() = New String() {oCurrentPart & "."} Dim oPathFragments = PropertyName.Split(oSplitString, StringSplitOptions.None) Dim oResults As New List(Of Object) @@ -72,10 +72,6 @@ Public Class PropertyValues For Each oArrayItem In Obj Dim oResult As List(Of Object) = GetPropValue(oArrayItem, oPathFragments(1)) - 'If Not IsNothing(oResult) AndAlso oResult.Count > 0 Then - ' oResults.Add(oResult.Item(0)) - 'End If - If Not IsNothing(oResult) Then oResults.Add(oResult) End If From e42638fb21bcce69c61e62a0477c1f5b958d8733 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Wed, 26 Jun 2019 11:02:44 +0200 Subject: [PATCH 09/20] Config: Add access to config paths, more logging --- Modules.Config/ConfigManager.vb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Modules.Config/ConfigManager.vb b/Modules.Config/ConfigManager.vb index 0791a6f1..27033859 100644 --- a/Modules.Config/ConfigManager.vb +++ b/Modules.Config/ConfigManager.vb @@ -33,6 +33,18 @@ Public Class ConfigManager(Of T) ''' Public ReadOnly Property Config As T + Public ReadOnly Property UserConfigPath As String + Get + Return _UserPath + End Get + End Property + + Public ReadOnly Property ComputerConfigPath As String + Get + Return _ComputerPath + End Get + End Property + ''' ''' Creates a new instance of the ConfigManager ''' @@ -164,6 +176,7 @@ Public Class ConfigManager(Of T) _Logger.Warn("Computer config could not be loaded!") End Try Else + _Logger.Debug("Computer config does not exist.") _ForceUserConfig = True End If @@ -190,6 +203,8 @@ Public Class ConfigManager(Of T) _Logger.Error(ex) _Logger.Warn("User config could not be loaded!") End Try + Else + _Logger.Debug("User config does not exist.") End If Return Config @@ -246,6 +261,7 @@ Public Class ConfigManager(Of T) oFileStream.Flush() End Using Catch ex As Exception + _Logger.Warn("Could not save config to {0}", Path) _Logger.Error(ex) Throw ex End Try @@ -273,6 +289,7 @@ Public Class ConfigManager(Of T) Return oConfig Catch ex As Exception + _Logger.Warn("Could not load config from {0}", Path) _Logger.Error(ex) Throw ex End Try From 15aa68c3efe77a5649281b12d990392eb8d0592e Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Wed, 26 Jun 2019 11:03:31 +0200 Subject: [PATCH 10/20] Logging: Version 0.0.1.0 When debug is enabled, save logs to memory at LogConfig.Logs --- Modules.Logging/LogConfig.vb | 32 +++++++++++++++++++++- Modules.Logging/My Project/AssemblyInfo.vb | 2 +- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/Modules.Logging/LogConfig.vb b/Modules.Logging/LogConfig.vb index 2fb378e0..13dc0281 100644 --- a/Modules.Logging/LogConfig.vb +++ b/Modules.Logging/LogConfig.vb @@ -4,7 +4,7 @@ Imports NLog.Config Imports NLog.Targets ''' LogConfig -''' 0.0.0.7 +''' 0.0.1.0 ''' 02.10.2018 ''' ''' Module that writes file-logs to different locations: @@ -100,6 +100,7 @@ Public Class LogConfig Private Const TARGET_ERROR As String = "errorTarget" Private Const TARGET_DETAIL As String = "detailTarget" Private Const TARGET_DEBUG As String = "debugTarget" + Private Const TARGET_MEMORY As String = "memoryTarget" Private Const DATE_FORMAT_LONG As String = "${longdate}" Private Const DATE_FORMAT_DEFAULT As String = "${date:format=yyyy-MM-dd HH\:mm\:ss}" @@ -110,6 +111,7 @@ Public Class LogConfig Private Const LOG_FORMAT_DEFAULT As String = LOG_FORMAT_BASE & " >> ${message}" Private Const LOG_FORMAT_EXCEPTION As String = LOG_FORMAT_BASE & " >> ${exception:format=Message}${newline}${exception:format=StackTrace}" Private Const LOG_FORMAT_DEBUG As String = LOG_FORMAT_BASE_LONG_DATE & " >> ${message}" + Private Const LOG_FORMAT_MEMORY As String = "${message}${newline}${exception:format=Message}${newline}${exception:format=StackTrace}" Private Const FOLDER_NAME_LOG = "Log" Private Const FILE_NAME_ACCESS_TEST = "accessTest.txt" @@ -158,6 +160,22 @@ Public Class LogConfig End Set End Property + ''' + ''' Returns Logs in Memory as List(Of String) if Debug is enabled + ''' Returns nothing if debug is disabled + ''' + ''' A list of log messages + Public ReadOnly Property Logs As List(Of String) + Get + If Debug = False Then + Return Nothing + End If + + Dim oTarget = config.FindTargetByName(Of MemoryTarget)(TARGET_MEMORY) + Return oTarget?.Logs.ToList() + End Get + End Property + ''' ''' Initializes a new LogConfig object with a logpath and optinally a filename-suffix. ''' @@ -288,6 +306,7 @@ Public Class LogConfig config.AddTarget(TARGET_ERROR, GetErrorLogTarget(basePath)) config.AddTarget(TARGET_DEFAULT, GetDefaultLogTarget(basePath)) config.AddTarget(TARGET_DEBUG, GetDebugLogTarget(basePath)) + config.AddTarget(TARGET_MEMORY, GetMemoryDebugTarget()) ' Add default rules AddDefaultRules(config) @@ -333,6 +352,7 @@ Public Class LogConfig ' Add debug rule, if configured If Debug Then config.AddRuleForOneLevel(LogLevel.Debug, TARGET_DEBUG) + config.AddRuleForAllLevels(TARGET_MEMORY) End If ' Reload all running loggers @@ -402,5 +422,15 @@ Public Class LogConfig Return debugLog End Function + + Private Function GetMemoryDebugTarget() As MemoryTarget + Dim memoryLog As New MemoryTarget() With { + .Layout = LOG_FORMAT_MEMORY, + .Name = TARGET_MEMORY, + .OptimizeBufferReuse = True + } + + Return memoryLog + End Function #End Region End Class diff --git a/Modules.Logging/My Project/AssemblyInfo.vb b/Modules.Logging/My Project/AssemblyInfo.vb index 7df792a5..89147117 100644 --- a/Modules.Logging/My Project/AssemblyInfo.vb +++ b/Modules.Logging/My Project/AssemblyInfo.vb @@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices ' übernehmen, indem Sie "*" eingeben: ' - + From bfa6dd3b7944c119278cdf34cef27afe07db7b6c Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Wed, 26 Jun 2019 15:05:09 +0200 Subject: [PATCH 11/20] add monodiag, add workflow overview --- DDMonorepo.sln | 7 + GUIs.ClientSuite/ClassPanelManager.vb | 5 +- GUIs.ClientSuite/ClientSuite.vbproj | 35 +- .../My Project/Resources.Designer.vb | 30 ++ GUIs.ClientSuite/My Project/Resources.resx | 9 + GUIs.ClientSuite/My Project/licenses.licx | 21 +- GUIs.ClientSuite/Resources/ampel-gelb.png | Bin 0 -> 10121 bytes GUIs.ClientSuite/Resources/ampel-gruen.png | Bin 0 -> 11293 bytes GUIs.ClientSuite/Resources/ampel-rot.png | Bin 0 -> 11822 bytes GUIs.ClientSuite/Workflow/WorkflowItem.vb | 42 ++ .../Workflow/frmWorkflowOverview.Designer.vb | 365 ++++++++++++++++++ .../Workflow/frmWorkflowOverview.resx | 269 +++++++++++++ .../Workflow/frmWorkflowOverview.vb | 18 + .../frmWorkflowStep.Designer.vb | 0 .../frmWorkflowStep.resx | 0 .../frmWorkflowStep.vb | 1 - GUIs.ClientSuite/frmMain.Designer.vb | 38 +- GUIs.ClientSuite/frmMain.resx | 20 + GUIs.ClientSuite/frmMain.vb | 7 + GUIs.ClientSuite/packages.config | 1 + GUIs.Test.TestGUI/Form1.Designer.vb | 23 ++ GUIs.Test.TestGUI/Form1.vb | 9 + LoggerDiag/App.config | 6 + LoggerDiag/DummyConfig.vb | 3 + LoggerDiag/MonoDiag.vbproj | 151 ++++++++ LoggerDiag/My Project/Application.Designer.vb | 38 ++ LoggerDiag/My Project/Application.myapp | 10 + LoggerDiag/My Project/AssemblyInfo.vb | 35 ++ LoggerDiag/My Project/Resources.Designer.vb | 63 +++ LoggerDiag/My Project/Resources.resx | 117 ++++++ LoggerDiag/My Project/Settings.Designer.vb | 73 ++++ LoggerDiag/My Project/Settings.settings | 7 + LoggerDiag/My Project/licenses.licx | 1 + LoggerDiag/frmMain.Designer.vb | 122 ++++++ LoggerDiag/frmMain.resx | 120 ++++++ LoggerDiag/frmMain.vb | 62 +++ LoggerDiag/packages.config | 4 + 37 files changed, 1678 insertions(+), 34 deletions(-) create mode 100644 GUIs.ClientSuite/Resources/ampel-gelb.png create mode 100644 GUIs.ClientSuite/Resources/ampel-gruen.png create mode 100644 GUIs.ClientSuite/Resources/ampel-rot.png create mode 100644 GUIs.ClientSuite/Workflow/WorkflowItem.vb create mode 100644 GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb create mode 100644 GUIs.ClientSuite/Workflow/frmWorkflowOverview.resx create mode 100644 GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb rename GUIs.ClientSuite/{FormWorkflow => Workflow}/frmWorkflowStep.Designer.vb (100%) rename GUIs.ClientSuite/{FormWorkflow => Workflow}/frmWorkflowStep.resx (100%) rename GUIs.ClientSuite/{FormWorkflow => Workflow}/frmWorkflowStep.vb (98%) create mode 100644 LoggerDiag/App.config create mode 100644 LoggerDiag/DummyConfig.vb create mode 100644 LoggerDiag/MonoDiag.vbproj create mode 100644 LoggerDiag/My Project/Application.Designer.vb create mode 100644 LoggerDiag/My Project/Application.myapp create mode 100644 LoggerDiag/My Project/AssemblyInfo.vb create mode 100644 LoggerDiag/My Project/Resources.Designer.vb create mode 100644 LoggerDiag/My Project/Resources.resx create mode 100644 LoggerDiag/My Project/Settings.Designer.vb create mode 100644 LoggerDiag/My Project/Settings.settings create mode 100644 LoggerDiag/My Project/licenses.licx create mode 100644 LoggerDiag/frmMain.Designer.vb create mode 100644 LoggerDiag/frmMain.resx create mode 100644 LoggerDiag/frmMain.vb create mode 100644 LoggerDiag/packages.config diff --git a/DDMonorepo.sln b/DDMonorepo.sln index d3da75c2..5f01bae5 100644 --- a/DDMonorepo.sln +++ b/DDMonorepo.sln @@ -74,6 +74,8 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "JobRunner", "Service.JobRun EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "LookupControlGui", "LookupControlGui\LookupControlGui.vbproj", "{B65E24B3-D334-455D-A0BF-B33B8358B013}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "MonoDiag", "LoggerDiag\MonoDiag.vbproj", "{3D437957-B90B-4D8F-9219-6D19B0C90994}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -180,6 +182,10 @@ Global {B65E24B3-D334-455D-A0BF-B33B8358B013}.Debug|Any CPU.Build.0 = Debug|Any CPU {B65E24B3-D334-455D-A0BF-B33B8358B013}.Release|Any CPU.ActiveCfg = Release|Any CPU {B65E24B3-D334-455D-A0BF-B33B8358B013}.Release|Any CPU.Build.0 = Release|Any CPU + {3D437957-B90B-4D8F-9219-6D19B0C90994}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D437957-B90B-4D8F-9219-6D19B0C90994}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D437957-B90B-4D8F-9219-6D19B0C90994}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D437957-B90B-4D8F-9219-6D19B0C90994}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -210,6 +216,7 @@ Global {7386AB04-DF8D-4DFB-809D-1FAC8212CB7E} = {CC368D6A-6AC4-4EB9-A092-14700FABEF7A} {926E6474-5613-4373-BB99-B101158B91EF} = {7AF3F9C2-C939-4A08-95C1-0453207E298A} {B65E24B3-D334-455D-A0BF-B33B8358B013} = {CC368D6A-6AC4-4EB9-A092-14700FABEF7A} + {3D437957-B90B-4D8F-9219-6D19B0C90994} = {8FFE925E-8B84-45F1-93CB-32B1C96F41EB} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C1BE4090-A0FD-48AF-86CB-39099D14B286} diff --git a/GUIs.ClientSuite/ClassPanelManager.vb b/GUIs.ClientSuite/ClassPanelManager.vb index 123e831e..a127fde9 100644 --- a/GUIs.ClientSuite/ClassPanelManager.vb +++ b/GUIs.ClientSuite/ClassPanelManager.vb @@ -40,9 +40,8 @@ Public Class PanelManager Private Sub View_DocumentDeactivated(sender As Object, e As DocumentEventArgs) Dim oDocument As BaseDocument = e.Document - ' TODO: oDocument.Control can be nothing - Dim oHashcode As Integer = oDocument.Control.GetHashCode + ' TODO: oDocument.Control can be nothing If oDocument Is Nothing Then Exit Sub End If @@ -51,7 +50,7 @@ Public Class PanelManager For Each oPanel As DockPanel In _dockManager.Panels Dim oTag As Integer = oPanel.Tag - If oTag = oHashcode Then + If oTag = oDocument.Control.GetHashCode Then oPanel.Hide() End If Next diff --git a/GUIs.ClientSuite/ClientSuite.vbproj b/GUIs.ClientSuite/ClientSuite.vbproj index 07cac5ef..355eee6f 100644 --- a/GUIs.ClientSuite/ClientSuite.vbproj +++ b/GUIs.ClientSuite/ClientSuite.vbproj @@ -69,6 +69,7 @@ + @@ -86,9 +87,9 @@ ..\packages\FirebirdSql.EntityFrameworkCore.Firebird.6.4.0\lib\netstandard2.0\FirebirdSql.EntityFrameworkCore.Firebird.dll + - False - ..\Modules.Logging\bin\Debug\NLog.dll + ..\packages\NLog.4.5.11\lib\net45\NLog.dll ..\packages\jacobslusser.ScintillaNET.3.6.3\lib\net40\ScintillaNET.dll @@ -101,6 +102,7 @@ + @@ -168,10 +170,16 @@ Form - + + frmWorkflowOverview.vb + + + Form + + frmWorkflowStep.vb - + Form @@ -197,6 +205,7 @@ + DockManagerTest.vb @@ -330,7 +339,10 @@ frmFormDesigner.vb - + + frmWorkflowOverview.vb + + frmWorkflowStep.vb @@ -489,6 +501,17 @@ - + + + + + + + + + + + + \ No newline at end of file diff --git a/GUIs.ClientSuite/My Project/Resources.Designer.vb b/GUIs.ClientSuite/My Project/Resources.Designer.vb index ae8e333e..a2e68ac4 100644 --- a/GUIs.ClientSuite/My Project/Resources.Designer.vb +++ b/GUIs.ClientSuite/My Project/Resources.Designer.vb @@ -60,6 +60,36 @@ Namespace My.Resources End Set End Property + ''' + ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + ''' + Friend ReadOnly Property ampel_gelb() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("ampel_gelb", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + ''' + Friend ReadOnly Property ampel_gruen() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("ampel_gruen", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + ''' + Friend ReadOnly Property ampel_rot() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("ampel_rot", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + ''' ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. ''' diff --git a/GUIs.ClientSuite/My Project/Resources.resx b/GUIs.ClientSuite/My Project/Resources.resx index c89d87db..c8fa5830 100644 --- a/GUIs.ClientSuite/My Project/Resources.resx +++ b/GUIs.ClientSuite/My Project/Resources.resx @@ -136,4 +136,13 @@ ..\Resources\CheckBox.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\ampel-gelb.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ampel-gruen.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ampel-rot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/GUIs.ClientSuite/My Project/licenses.licx b/GUIs.ClientSuite/My Project/licenses.licx index 8d76c874..89071046 100644 --- a/GUIs.ClientSuite/My Project/licenses.licx +++ b/GUIs.ClientSuite/My Project/licenses.licx @@ -1,15 +1,16 @@ -DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraBars.Docking2010.DocumentManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraBars.Ribbon.RibbonControl, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraBars.Docking.DockManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraBars.Navigation.OfficeNavigationBar, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraTabbedMdi.XtraTabbedMdiManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraBars.Ribbon.RibbonControl, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraVerticalGrid.PropertyGridControl, DevExpress.XtraVerticalGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraEditors.ButtonEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraNavBar.NavBarControl, DevExpress.XtraNavBar.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraBars.Docking2010.DocumentManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraLayout.LayoutControl, DevExpress.XtraLayout.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraTreeList.TreeList, DevExpress.XtraTreeList.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraVerticalGrid.PropertyGridControl, DevExpress.XtraVerticalGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraBars.Docking.DockManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraDataLayout.DataLayoutControl, DevExpress.XtraLayout.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.Utils.MVVM.MVVMContext, DevExpress.Utils.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraBars.Navigation.OfficeNavigationBar, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraTreeList.TreeList, DevExpress.XtraTreeList.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraEditors.TextEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraLayout.LayoutControl, DevExpress.XtraLayout.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraNavBar.NavBarControl, DevExpress.XtraNavBar.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/GUIs.ClientSuite/Resources/ampel-gelb.png b/GUIs.ClientSuite/Resources/ampel-gelb.png new file mode 100644 index 0000000000000000000000000000000000000000..5d51423edf0ee45b7a56ea934e15e1fb53c84eb5 GIT binary patch literal 10121 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 SsrN552auIi0@aEe2mcRWcRi8- literal 0 HcmV?d00001 diff --git a/GUIs.ClientSuite/Resources/ampel-gruen.png b/GUIs.ClientSuite/Resources/ampel-gruen.png new file mode 100644 index 0000000000000000000000000000000000000000..fe34e2a5811aeb5250165a652e3cb89eb7d861e1 GIT binary patch literal 11293 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 R|3KasDhlfIwX)`+{{yn*F|_~y literal 0 HcmV?d00001 diff --git a/GUIs.ClientSuite/Resources/ampel-rot.png b/GUIs.ClientSuite/Resources/ampel-rot.png new file mode 100644 index 0000000000000000000000000000000000000000..97dae97aa95863f079539319649ba3dff4a31e0c GIT binary patch literal 11822 zcmai)U2eVgLD`vsO(10<5XLv;^Suzmwlxmi#Y+ z;3%W(0swr)_|G5!nc2Ail5noFijr`n65wu5glcV}Y1K zNRwbTO9377@37_)=%kcEY7Fu@orWEcxlNC6PDWw&zdNYhv_0I;>}xtH-P}AD`Hy@& zHn)&!n&;&h{x3Iy9@#AIxJ7B#H7>R0zROR1fZ-+S+F&YB+*L@kh8!%(K{_3*b^=vCixMlfQ=jF^H6Kmy%((l{A&rQg5JpxyUa zJ20VZI$OlSK&Qn23mET3d4r~Ge)wbtPeb&Tp{(4=SgaHob4q%M7ohN)SK_EI2A4wg ztD_1Ws%o(0N=tI{jl280FTd}raCvP

%2u8M74SS%No%j@RX1g}g_df!TM;oIT|< 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 KiCQt^;Qs+A7yF6; literal 0 HcmV?d00001 diff --git a/GUIs.ClientSuite/Workflow/WorkflowItem.vb b/GUIs.ClientSuite/Workflow/WorkflowItem.vb new file mode 100644 index 00000000..2d34b8f3 --- /dev/null +++ b/GUIs.ClientSuite/Workflow/WorkflowItem.vb @@ -0,0 +1,42 @@ +Imports System.ComponentModel +Imports DigitalData.GUIs.ClientSuite + +Public Class WorkflowItem + Implements INotifyPropertyChanged + + + Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged + + Public Enum ItemState + Normal + Warning + Danger + End Enum + + Public Property StateImage As Image + + Public Property Title As String + + Public Property WorkflowName As String + + Private _state As ItemState + + Public Property State As ItemState + Get + Return _state + End Get + Set(value As ItemState) + _state = value + Select Case value + Case ItemState.Normal + StateImage = My.Resources.ampel_gruen + Case ItemState.Warning + StateImage = My.Resources.ampel_gelb + Case ItemState.Danger + StateImage = My.Resources.ampel_rot + Case Else + StateImage = Nothing + End Select + End Set + End Property +End Class diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb new file mode 100644 index 00000000..af720a62 --- /dev/null +++ b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb @@ -0,0 +1,365 @@ + +Partial Class frmWorkflowOverview + Inherits DevExpress.XtraBars.Ribbon.RibbonForm + + '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(frmWorkflowOverview)) + Dim WindowsUIButtonImageOptions3 As DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions = New DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions() + Dim WindowsUIButtonImageOptions4 As DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions = New DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions() + Me.RibbonControl1 = New DevExpress.XtraBars.Ribbon.RibbonControl() + Me.BarCheckItem1 = New DevExpress.XtraBars.BarCheckItem() + Me.BarCheckItem2 = New DevExpress.XtraBars.BarCheckItem() + Me.BarCheckItem3 = New DevExpress.XtraBars.BarCheckItem() + Me.RibbonPageCategory1 = New DevExpress.XtraBars.Ribbon.RibbonPageCategory() + Me.RibbonPage3 = New DevExpress.XtraBars.Ribbon.RibbonPage() + Me.RibbonPageGroup3 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() + Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() + Me.RibbonPage2 = New DevExpress.XtraBars.Ribbon.RibbonPage() + Me.NavBarControl1 = New DevExpress.XtraNavBar.NavBarControl() + Me.NavBarGroup1 = New DevExpress.XtraNavBar.NavBarGroup() + Me.NavBarItem1 = New DevExpress.XtraNavBar.NavBarItem() + Me.NavBarItem2 = New DevExpress.XtraNavBar.NavBarItem() + Me.NavBarItem3 = New DevExpress.XtraNavBar.NavBarItem() + Me.SplitContainerControl1 = New DevExpress.XtraEditors.SplitContainerControl() + Me.GridWorkflowOverview = New DevExpress.XtraGrid.GridControl() + Me.gvOverview = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.GridWorkflowDetails = New DevExpress.XtraGrid.GridControl() + Me.tvDetails = New DevExpress.XtraGrid.Views.Tile.TileView() + Me.LayoutControl1 = New DevExpress.XtraLayout.LayoutControl() + Me.WindowsUIButtonPanel1 = New DevExpress.XtraBars.Docking2010.WindowsUIButtonPanel() + Me.LayoutControlGroup1 = New DevExpress.XtraLayout.LayoutControlGroup() + Me.SimpleLabelItem1 = New DevExpress.XtraLayout.SimpleLabelItem() + Me.LayoutControlItem2 = New DevExpress.XtraLayout.LayoutControlItem() + Me.SimpleLabelItem2 = New DevExpress.XtraLayout.SimpleLabelItem() + Me.SimpleLabelItem3 = New DevExpress.XtraLayout.SimpleLabelItem() + CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.NavBarControl1, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SplitContainerControl1.SuspendLayout() + CType(Me.GridWorkflowOverview, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.gvOverview, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridWorkflowDetails, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.tvDetails, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).BeginInit() + Me.LayoutControl1.SuspendLayout() + CType(Me.LayoutControlGroup1, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.SimpleLabelItem1, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.LayoutControlItem2, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.SimpleLabelItem2, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.SimpleLabelItem3, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'RibbonControl1 + ' + Me.RibbonControl1.ExpandCollapseItem.Id = 0 + Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.BarCheckItem1, Me.BarCheckItem2, Me.BarCheckItem3}) + Me.RibbonControl1.Location = New System.Drawing.Point(0, 0) + Me.RibbonControl1.MaxItemId = 7 + Me.RibbonControl1.Name = "RibbonControl1" + Me.RibbonControl1.PageCategories.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageCategory() {Me.RibbonPageCategory1}) + Me.RibbonControl1.Size = New System.Drawing.Size(1134, 143) + Me.RibbonControl1.StatusBar = Me.RibbonStatusBar1 + ' + 'BarCheckItem1 + ' + Me.BarCheckItem1.Caption = "Alle" + Me.BarCheckItem1.CheckStyle = DevExpress.XtraBars.BarCheckStyles.Radio + Me.BarCheckItem1.Id = 3 + Me.BarCheckItem1.ImageOptions.Image = CType(resources.GetObject("BarCheckItem1.ImageOptions.Image"), System.Drawing.Image) + Me.BarCheckItem1.ImageOptions.LargeImage = CType(resources.GetObject("BarCheckItem1.ImageOptions.LargeImage"), System.Drawing.Image) + Me.BarCheckItem1.Name = "BarCheckItem1" + ' + 'BarCheckItem2 + ' + Me.BarCheckItem2.Caption = "Aktuell verantwortlich" + Me.BarCheckItem2.CheckStyle = DevExpress.XtraBars.BarCheckStyles.Radio + Me.BarCheckItem2.Id = 4 + Me.BarCheckItem2.ImageOptions.Image = CType(resources.GetObject("BarCheckItem2.ImageOptions.Image"), System.Drawing.Image) + Me.BarCheckItem2.ImageOptions.LargeImage = CType(resources.GetObject("BarCheckItem2.ImageOptions.LargeImage"), System.Drawing.Image) + Me.BarCheckItem2.Name = "BarCheckItem2" + ' + 'BarCheckItem3 + ' + Me.BarCheckItem3.Caption = "Beteiligt" + Me.BarCheckItem3.CheckStyle = DevExpress.XtraBars.BarCheckStyles.Radio + Me.BarCheckItem3.Id = 6 + Me.BarCheckItem3.ImageOptions.Image = CType(resources.GetObject("BarCheckItem3.ImageOptions.Image"), System.Drawing.Image) + Me.BarCheckItem3.ImageOptions.LargeImage = CType(resources.GetObject("BarCheckItem3.ImageOptions.LargeImage"), System.Drawing.Image) + Me.BarCheckItem3.Name = "BarCheckItem3" + ' + 'RibbonPageCategory1 + ' + Me.RibbonPageCategory1.Name = "RibbonPageCategory1" + Me.RibbonPageCategory1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage3}) + Me.RibbonPageCategory1.Text = "Worflows" + ' + 'RibbonPage3 + ' + Me.RibbonPage3.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup3}) + Me.RibbonPage3.Name = "RibbonPage3" + Me.RibbonPage3.Text = "Allgemein" + ' + 'RibbonPageGroup3 + ' + Me.RibbonPageGroup3.ItemLinks.Add(Me.BarCheckItem1) + Me.RibbonPageGroup3.ItemLinks.Add(Me.BarCheckItem3) + Me.RibbonPageGroup3.ItemLinks.Add(Me.BarCheckItem2) + Me.RibbonPageGroup3.Name = "RibbonPageGroup3" + Me.RibbonPageGroup3.Text = "Verantwortlichkeit" + ' + 'RibbonStatusBar1 + ' + Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 692) + Me.RibbonStatusBar1.Name = "RibbonStatusBar1" + Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1 + Me.RibbonStatusBar1.Size = New System.Drawing.Size(1134, 31) + ' + 'RibbonPage2 + ' + Me.RibbonPage2.Name = "RibbonPage2" + Me.RibbonPage2.Text = "RibbonPage2" + ' + 'NavBarControl1 + ' + Me.NavBarControl1.ActiveGroup = Me.NavBarGroup1 + Me.NavBarControl1.Dock = System.Windows.Forms.DockStyle.Left + Me.NavBarControl1.Groups.AddRange(New DevExpress.XtraNavBar.NavBarGroup() {Me.NavBarGroup1}) + Me.NavBarControl1.Items.AddRange(New DevExpress.XtraNavBar.NavBarItem() {Me.NavBarItem1, Me.NavBarItem2, Me.NavBarItem3}) + Me.NavBarControl1.Location = New System.Drawing.Point(0, 143) + Me.NavBarControl1.Name = "NavBarControl1" + Me.NavBarControl1.OptionsNavPane.ExpandedWidth = 200 + Me.NavBarControl1.OptionsNavPane.GroupImageShowMode = DevExpress.XtraNavBar.GroupImageShowMode.InCollapsedState + Me.NavBarControl1.Size = New System.Drawing.Size(200, 549) + Me.NavBarControl1.TabIndex = 2 + Me.NavBarControl1.Text = "NavBarControl1" + Me.NavBarControl1.View = New DevExpress.XtraNavBar.ViewInfo.SkinNavigationPaneViewInfoRegistrator() + ' + 'NavBarGroup1 + ' + Me.NavBarGroup1.Caption = "Workflows" + Me.NavBarGroup1.Expanded = True + Me.NavBarGroup1.ImageOptions.SmallImage = CType(resources.GetObject("NavBarGroup1.ImageOptions.SmallImage"), System.Drawing.Image) + Me.NavBarGroup1.ItemLinks.AddRange(New DevExpress.XtraNavBar.NavBarItemLink() {New DevExpress.XtraNavBar.NavBarItemLink(Me.NavBarItem1), New DevExpress.XtraNavBar.NavBarItemLink(Me.NavBarItem2), New DevExpress.XtraNavBar.NavBarItemLink(Me.NavBarItem3)}) + Me.NavBarGroup1.Name = "NavBarGroup1" + ' + 'NavBarItem1 + ' + Me.NavBarItem1.Caption = "Alle Workflows (100)" + Me.NavBarItem1.ImageOptions.SmallImage = CType(resources.GetObject("NavBarItem1.ImageOptions.SmallImage"), System.Drawing.Image) + Me.NavBarItem1.Name = "NavBarItem1" + ' + 'NavBarItem2 + ' + Me.NavBarItem2.Caption = "Rechnungseingang (80)" + Me.NavBarItem2.ImageOptions.SmallImage = CType(resources.GetObject("NavBarItem2.ImageOptions.SmallImage"), System.Drawing.Image) + Me.NavBarItem2.Name = "NavBarItem2" + ' + 'NavBarItem3 + ' + Me.NavBarItem3.Caption = "Vertragsprüfung (20)" + Me.NavBarItem3.ImageOptions.SmallImage = CType(resources.GetObject("NavBarItem3.ImageOptions.SmallImage"), System.Drawing.Image) + Me.NavBarItem3.Name = "NavBarItem3" + ' + 'SplitContainerControl1 + ' + Me.SplitContainerControl1.Dock = System.Windows.Forms.DockStyle.Fill + Me.SplitContainerControl1.Location = New System.Drawing.Point(200, 143) + Me.SplitContainerControl1.Name = "SplitContainerControl1" + Me.SplitContainerControl1.Panel1.Controls.Add(Me.GridWorkflowOverview) + Me.SplitContainerControl1.Panel1.Text = "Panel1" + Me.SplitContainerControl1.Panel2.Controls.Add(Me.GridWorkflowDetails) + Me.SplitContainerControl1.Panel2.Controls.Add(Me.LayoutControl1) + Me.SplitContainerControl1.Panel2.Text = "Panel2" + Me.SplitContainerControl1.Size = New System.Drawing.Size(934, 549) + Me.SplitContainerControl1.SplitterPosition = 471 + Me.SplitContainerControl1.TabIndex = 5 + Me.SplitContainerControl1.Text = "SplitContainerControl1" + ' + 'GridWorkflowOverview + ' + Me.GridWorkflowOverview.Dock = System.Windows.Forms.DockStyle.Fill + Me.GridWorkflowOverview.Location = New System.Drawing.Point(0, 0) + Me.GridWorkflowOverview.MainView = Me.gvOverview + Me.GridWorkflowOverview.MenuManager = Me.RibbonControl1 + Me.GridWorkflowOverview.Name = "GridWorkflowOverview" + Me.GridWorkflowOverview.Size = New System.Drawing.Size(471, 549) + Me.GridWorkflowOverview.TabIndex = 0 + Me.GridWorkflowOverview.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.gvOverview}) + ' + 'gvOverview + ' + Me.gvOverview.GridControl = Me.GridWorkflowOverview + Me.gvOverview.Name = "gvOverview" + ' + 'GridWorkflowDetails + ' + Me.GridWorkflowDetails.Dock = System.Windows.Forms.DockStyle.Fill + Me.GridWorkflowDetails.Location = New System.Drawing.Point(0, 166) + Me.GridWorkflowDetails.MainView = Me.tvDetails + Me.GridWorkflowDetails.MenuManager = Me.RibbonControl1 + Me.GridWorkflowDetails.Name = "GridWorkflowDetails" + Me.GridWorkflowDetails.Size = New System.Drawing.Size(458, 383) + Me.GridWorkflowDetails.TabIndex = 1 + Me.GridWorkflowDetails.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.tvDetails}) + ' + 'tvDetails + ' + Me.tvDetails.GridControl = Me.GridWorkflowDetails + Me.tvDetails.Name = "tvDetails" + ' + 'LayoutControl1 + ' + Me.LayoutControl1.Controls.Add(Me.WindowsUIButtonPanel1) + Me.LayoutControl1.Dock = System.Windows.Forms.DockStyle.Top + Me.LayoutControl1.Location = New System.Drawing.Point(0, 0) + Me.LayoutControl1.Name = "LayoutControl1" + Me.LayoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = New System.Drawing.Rectangle(1186, 56, 650, 400) + Me.LayoutControl1.Root = Me.LayoutControlGroup1 + Me.LayoutControl1.Size = New System.Drawing.Size(458, 166) + Me.LayoutControl1.TabIndex = 0 + Me.LayoutControl1.Text = "LayoutControl1" + ' + 'WindowsUIButtonPanel1 + ' + WindowsUIButtonImageOptions3.Image = CType(resources.GetObject("WindowsUIButtonImageOptions3.Image"), System.Drawing.Image) + WindowsUIButtonImageOptions4.Image = CType(resources.GetObject("WindowsUIButtonImageOptions4.Image"), System.Drawing.Image) + Me.WindowsUIButtonPanel1.Buttons.AddRange(New DevExpress.XtraEditors.ButtonPanel.IBaseButton() {New DevExpress.XtraBars.Docking2010.WindowsUIButton("Verlängerung", True, WindowsUIButtonImageOptions3, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, "", -1, True, Nothing, True, False, True, Nothing, -1, False), New DevExpress.XtraBars.Docking2010.WindowsUIButton("Kündigung", True, WindowsUIButtonImageOptions4, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, "", -1, True, Nothing, True, False, True, Nothing, -1, False)}) + Me.WindowsUIButtonPanel1.ContentAlignment = System.Drawing.ContentAlignment.MiddleLeft + Me.WindowsUIButtonPanel1.Location = New System.Drawing.Point(12, 96) + Me.WindowsUIButtonPanel1.Name = "WindowsUIButtonPanel1" + Me.WindowsUIButtonPanel1.Size = New System.Drawing.Size(434, 55) + Me.WindowsUIButtonPanel1.TabIndex = 5 + Me.WindowsUIButtonPanel1.Text = "WindowsUIButtonPanel1" + ' + 'LayoutControlGroup1 + ' + Me.LayoutControlGroup1.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.[True] + Me.LayoutControlGroup1.GroupBordersVisible = False + Me.LayoutControlGroup1.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.SimpleLabelItem1, Me.LayoutControlItem2, Me.SimpleLabelItem2, Me.SimpleLabelItem3}) + Me.LayoutControlGroup1.Name = "Root" + Me.LayoutControlGroup1.Size = New System.Drawing.Size(458, 166) + Me.LayoutControlGroup1.TextVisible = False + ' + 'SimpleLabelItem1 + ' + Me.SimpleLabelItem1.AllowHotTrack = False + Me.SimpleLabelItem1.AppearanceItemCaption.Font = New System.Drawing.Font("Segoe UI", 15.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.SimpleLabelItem1.AppearanceItemCaption.ForeColor = System.Drawing.SystemColors.MenuHighlight + Me.SimpleLabelItem1.AppearanceItemCaption.Options.UseFont = True + Me.SimpleLabelItem1.AppearanceItemCaption.Options.UseForeColor = True + Me.SimpleLabelItem1.Location = New System.Drawing.Point(0, 0) + Me.SimpleLabelItem1.Name = "SimpleLabelItem1" + Me.SimpleLabelItem1.Size = New System.Drawing.Size(438, 34) + Me.SimpleLabelItem1.Text = "Vertragsnr. 4711" + Me.SimpleLabelItem1.TextSize = New System.Drawing.Size(151, 30) + ' + 'LayoutControlItem2 + ' + Me.LayoutControlItem2.Control = Me.WindowsUIButtonPanel1 + Me.LayoutControlItem2.Location = New System.Drawing.Point(0, 84) + Me.LayoutControlItem2.Name = "LayoutControlItem2" + Me.LayoutControlItem2.Size = New System.Drawing.Size(438, 62) + Me.LayoutControlItem2.TextSize = New System.Drawing.Size(0, 0) + Me.LayoutControlItem2.TextVisible = False + ' + 'SimpleLabelItem2 + ' + Me.SimpleLabelItem2.AllowHotTrack = False + Me.SimpleLabelItem2.AppearanceItemCaption.Font = New System.Drawing.Font("Segoe UI", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.SimpleLabelItem2.AppearanceItemCaption.Options.UseFont = True + Me.SimpleLabelItem2.Location = New System.Drawing.Point(0, 59) + Me.SimpleLabelItem2.Name = "SimpleLabelItem2" + Me.SimpleLabelItem2.Size = New System.Drawing.Size(438, 25) + Me.SimpleLabelItem2.Text = "Sunshine GmbH" + Me.SimpleLabelItem2.TextSize = New System.Drawing.Size(151, 21) + ' + 'SimpleLabelItem3 + ' + Me.SimpleLabelItem3.AllowHotTrack = False + Me.SimpleLabelItem3.AppearanceItemCaption.Font = New System.Drawing.Font("Segoe UI", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.SimpleLabelItem3.AppearanceItemCaption.Options.UseFont = True + Me.SimpleLabelItem3.Location = New System.Drawing.Point(0, 34) + Me.SimpleLabelItem3.Name = "SimpleLabelItem3" + Me.SimpleLabelItem3.Size = New System.Drawing.Size(438, 25) + Me.SimpleLabelItem3.Text = "Objekt: Haus Nr. 9" + Me.SimpleLabelItem3.TextSize = New System.Drawing.Size(151, 21) + ' + 'frmWorkflowOverview + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(1134, 723) + Me.Controls.Add(Me.SplitContainerControl1) + Me.Controls.Add(Me.NavBarControl1) + Me.Controls.Add(Me.RibbonStatusBar1) + Me.Controls.Add(Me.RibbonControl1) + Me.Name = "frmWorkflowOverview" + Me.Ribbon = Me.RibbonControl1 + Me.StatusBar = Me.RibbonStatusBar1 + Me.Text = "Workflow Übersicht" + CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.NavBarControl1, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).EndInit() + Me.SplitContainerControl1.ResumeLayout(False) + CType(Me.GridWorkflowOverview, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.gvOverview, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridWorkflowDetails, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.tvDetails, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).EndInit() + Me.LayoutControl1.ResumeLayout(False) + CType(Me.LayoutControlGroup1, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.SimpleLabelItem1, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.LayoutControlItem2, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.SimpleLabelItem2, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.SimpleLabelItem3, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Friend WithEvents RibbonControl1 As DevExpress.XtraBars.Ribbon.RibbonControl + Friend WithEvents RibbonStatusBar1 As DevExpress.XtraBars.Ribbon.RibbonStatusBar + Friend WithEvents RibbonPage2 As DevExpress.XtraBars.Ribbon.RibbonPage + Friend WithEvents NavBarControl1 As DevExpress.XtraNavBar.NavBarControl + Friend WithEvents NavBarGroup1 As DevExpress.XtraNavBar.NavBarGroup + Friend WithEvents NavBarItem1 As DevExpress.XtraNavBar.NavBarItem + Friend WithEvents NavBarItem2 As DevExpress.XtraNavBar.NavBarItem + Friend WithEvents NavBarItem3 As DevExpress.XtraNavBar.NavBarItem + Friend WithEvents RibbonPageCategory1 As DevExpress.XtraBars.Ribbon.RibbonPageCategory + Friend WithEvents RibbonPage3 As DevExpress.XtraBars.Ribbon.RibbonPage + Friend WithEvents RibbonPageGroup3 As DevExpress.XtraBars.Ribbon.RibbonPageGroup + Friend WithEvents SplitContainerControl1 As DevExpress.XtraEditors.SplitContainerControl + Friend WithEvents GridWorkflowOverview As DevExpress.XtraGrid.GridControl + Friend WithEvents gvOverview As DevExpress.XtraGrid.Views.Grid.GridView + Friend WithEvents GridWorkflowDetails As DevExpress.XtraGrid.GridControl + Friend WithEvents LayoutControl1 As DevExpress.XtraLayout.LayoutControl + Friend WithEvents LayoutControlGroup1 As DevExpress.XtraLayout.LayoutControlGroup + Friend WithEvents BarCheckItem1 As DevExpress.XtraBars.BarCheckItem + Friend WithEvents BarCheckItem2 As DevExpress.XtraBars.BarCheckItem + Friend WithEvents BarCheckItem3 As DevExpress.XtraBars.BarCheckItem + Friend WithEvents WindowsUIButtonPanel1 As DevExpress.XtraBars.Docking2010.WindowsUIButtonPanel + Friend WithEvents SimpleLabelItem1 As DevExpress.XtraLayout.SimpleLabelItem + Friend WithEvents LayoutControlItem2 As DevExpress.XtraLayout.LayoutControlItem + Friend WithEvents SimpleLabelItem2 As DevExpress.XtraLayout.SimpleLabelItem + Friend WithEvents SimpleLabelItem3 As DevExpress.XtraLayout.SimpleLabelItem + Friend WithEvents tvDetails As DevExpress.XtraGrid.Views.Tile.TileView +End Class diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.resx b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.resx new file mode 100644 index 00000000..0913fcab --- /dev/null +++ b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.resx @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAYdEVYdFRpdGxlAFRlYW07UGVvcGxlO0dyb3VwO1w5 + 6BYAAADzSURBVDhPpdA9CsJAEAVglYBYeQYPoJ2tBxDEMq2FJ5BASsVrWNhqmc4rKHgJsbAXTKXre2En + TNZJESw+iPPzzKTlnPuLWWyifJhtT23YwdPbQwfMuhUwBhdgzaxbAbEauMISIm8BZ5B+bAWkvvmBunPe + wJnUCujDCy5Qdw57nOn/BPiQBA6gzxGssZfoHb3MW4cwADlHY429EURlAH50YQM3uMMU5BxZLl4b2OMM + Z7nTY8AR9D/RCniO/OYza3qGMgbkqvCANcg5E694bWCPMzKfl9/Af4fwnLlXeW29EwZY54QyvRMG6HPq + 5HqnEtCca30Bw6t+WSTe8moAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAYdEVYdFRpdGxlAFRlYW07UGVvcGxlO0dyb3VwO1w5 + 6BYAAAJ9SURBVFhHxdbNq41RFMfx461wURSljExuESJCoRiR7kAmTBhgoJiJgUxu/gKGElJckpFEGVFC + XiciRt4Zka6IPL6/2/Oc1l7P2veeczs9Bp/u2WuvtfY+z8s+t1UUxX8VBpvUGhi8kbMR1/EZv/EFN7EJ + Ub50XRMGsQZ/UAQU34Be1GQ3cB5Ro8ol9KImu4EniJpUnqIXNdkNvIJvUDmHlfA1c7AWZ/EXvu41fE24 + gWXI3ctBKGcX7sA+bHexGxNwFL5WPZcgWS8ZlAbgi2UYM3DMxCLHMQ3fTKyi3sl6yaA0Fc/gi+9hOr6b + WOQHZuG2iYl6qneyXjIwdCltsVzDahfLWQ/l29ge1NaqBUr6pp9gG5zEVhfLUd4JM1avPtTWqgWMzfiF + qom+/QEzHs1BrCo/q8cWRGuMugHRG3EK97EQeg78YpEHWIQzqD35VhjEZESFtxAt6CnP1qmXetrYCB9Y + gP14jI+YBzuvRrkzoqL5pbA9dU6op3pr3O5ZfZiN09ChYpu9wV7ofm7HJPjXy9MBpcNoMfbhHey81tBa + WnNkA3PxEjYpR6/XNhfzNL/OxSI67udrA0MmOJarUM1FE7MuQPPKi+a9ISXriI0mc3ZgCg5Bt0ixtzgC + 3aKdZawTw9pAdGZHXkCLi+6xamWm+Tyx/KvnRflRH+trVdipfujyHzYxS7+CV6C8aL6m9k9ikKRfQF3e + 56h2rtNND5vN06W3r6jyVad6m5eslwzEJetp9q+R9RCX8cjEPNWrT7uvXS8ZiElcjm4f0Bz1WYGuNtDp + sdup9vFs10sGUiXhJ6JG46V+XW3gA6JG4/UeY2+gaWGwSWGwSWGwOUXrHy0ANvXoR9wdAAAAAElFTkSu + QmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAATdEVYdFRpdGxlAFBlb3BsZTtBc3NpZ25+WIkkAAAA + 4ElEQVQ4T6XRPQ4BURQF4ClEr1FrSSSiokLPGuxEQqbQWIRFSKYXCWuwAmoKRJ5zJu/Ke/fd0Si+MRnn + nMxP5pz7S3nI81wbwAHu3hFGkGStgRpcwClXqEOUtwbaoMuiA1HeGhiDVaYJRHlrYA1WmfhflLcGhvAG + XeY1vtwobw3QHvQAryXZqgF+sidImeet2arIYOF/S1UDNIeT1wvKTspkDTRgA99v7sNSrhzoww5ewNve + QheaCIbliAxM4QHyzCGWl7ooZOCsSiF5aeFI8gg3VdL0SDLwU1gAjvjzIvsAqlQYjVXYUosAAAAASUVO + RK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAATdEVYdFRpdGxlAFBlb3BsZTtBc3NpZ25+WIkkAAAB + 0UlEQVRYR8XWsStFYRgG8DNIGQyKrIrFwG69UhSD8sfIcON2B2UmBnZlMCoWVjYZlBSxIWUg5HgenXP6 + vu88597zHjeGX3K+732fx7mUKI7jf+V902w2y5iFXbiDj8Q97ME8qBmpSoENiNvYATWbYy0wDSpQWQC1 + w2MtwNeuwpR9UDs81gKXoMKUK1A7PNYCL6DClGdQOzzWAiqoyBuoHR5LgRqooFY4o3ZlLAU2QYW0whm1 + K2MpsAoqpBXOqF0ZS4FheAQVpPAuZ9SujKUA1UGFKYugdnisBcZAhSm8q3Z4rAXoEFSg6wjUbE6VAuPw + CiqYeMY7ajanSgGagXcIw/mMZ2pGqlqgGx4gLPAEPFMzUtUCNABLwN+JE1iGQVB3C1kLTMB68EzZBt5V + Z54yBYagARfA18x/v0ZA3SX++X0B73KmNtc4iKCefM0pKtAHW8BA93OmY+gB9z71whmk91aSEIbHaWBI + FRiF62RJkVOYhK7EFJxDeh6Gly7QDzfOonY+E+4zFV66wFqwzCr9rMPwQmEBy0+vMJhvQIYpYQG11CJ9 + A6VLhAVug4VVFJXIPndXWODXggC3RHj2wyvQCSIkLaHO/qQAsYR63vkCNnH0DUZ2qvqAgwutAAAAAElF + TkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAcdEVYdFRpdGxlAFRlYW07UGVvcGxlO0dyb3VwO1Vz + ZXKTe2BJAAAA8klEQVQ4T6XQvw7BUBQG8BKJmPoMHoDN6gEsxq4GTyCiI29hMBgx9jFIvIQY7BKduL6v + uac5vU6HxvBL6vz59DRyzv3FLDZRPqwO2xbs4OntoQ1m3QoYgQuwZtatgEQNXGEOHW8GZ5B+YgWkvvmB + unPewJnUCojhBReoO4c9zsQ/AT5kCUfQ5wjW2FvqHb3MWwfQBzlHY429IXTKAPzowgZucIcJyDmyXLw2 + sMcZznKnx4AT6H+iBfAc+c1n1vQMZQzIVeEBa5Bzxl7x2sAeZ2Q+L7+B/w7hOVOv8tp6JwywzglleicM + 0OfUyfVOJaA5F30Bv8maeRXqkFsAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAcdEVYdFRpdGxlAFRlYW07UGVvcGxlO0dyb3VwO1Vz + ZXKTe2BJAAACnklEQVRYR8XVz4tPYRTH8cEoP4YaRalZ2UwRIkINxYo0C9mwYYGFYqexkI38BSwsJKTM + kKyk1KwoIT83IlZ+syKNRuTr/dE9+jzPPHfmmsXX4lXfc+55zrlz73Of6Wi1Wv9VMdlOSTAweMptxHV8 + xA98wg1sQl4batf4HJcEFIa1+IlWgfIb4PWN1viskAQUhQsoNQqX4PWN1viskAQUhUfVojqP4fWN1vis + kAQUhRfVopLzWAWvl3lYh3P4hXzdS58VkoAiWY66d3kMqtmFW/DNdhu7MQVHkK9Vz6U+T5KAAumvFuRG + 0IWjlis5jpn4YrnQ7/MkCSiQGXhSLXB3MAtfLVfyDXNx03KinjN8niQBBUGP0hfLNazJcnXWQ/We2+Oz + QhJQFPSXfoA3OImtWa6O6k5YrF6zfVZIAorcZnxHNNFff8Di8RzE6uq3emzxOS4JKMzpiziNu1gE7YN8 + WMk9LMZZjNn5LgkoDp1aaHEYRmlgbjjrq16dngtJQFEP9uMh3mMB/AbUqO6MCLq+LOupc0I91bvHZ0ZR + N85Ah4o3e4W90PvcjmnIP6+cDigdRkuwD2/g1zVDs7r/3AA/5uM5vKiOPq9tWS6n631ZrkTH/ULdwJAl + J3IVWjNoOXexeqKqK13PDalYR2zpYp0dmI5D0CtS7jUOQ69oZ5VrYkQ3UDqzS55Bw0XvWGtljv2eWj0B + 7RfVl/q4z393Y7VwIr3Q4x+wnNN/wSvo9b7jSQJr5PQfUI/3KeLOdbpps3mdHr1/oqrXui6fkUsCinPa + zfln5O7jMh5YLqf1fT7HJQGFbgX+dYPWUZ+VPiskAUWu6bHbVHI8hySgyI2i1GiyRn1WSAKK3DuUGk3W + W58VxiTarZhsp2KynYrJ9ml1/AZUr3hglRjmdgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAsdEVYdFRpdGxlAERvY3VtZW50O01hcDtTY2hlbWU7 + RGlhZ3JhbTtIaWVyYXI7TmV0Tg8qRAAAAHVJREFUOE/NzMENgDAMQ9EuyDoMwBKMwLXHbhf0JUBtYqCo + Fw5PCNdOMrMhMpyWYorvIQRQY/geQgA1hu8hBFBj+B5CADWG7yEEUGP4HkJQyznbQb6j+akGbx4P8D1d + A5e1B+ZttRqFnuz2wJfsJwdGyLCfpR37LNV02NfAHQAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAWdEVYdFRpdGxlAFByb2R1Y3Q7Qm94O0l0ZW0O9Rpk + AAAAR0lEQVQ4T2P4//8/RRhMvDtS9J8cPIgMoASDCaiJ39DwSyB+DsVvoWLIGKgVjxdA4sgYlxraGUAM + HjWAmgZQgrEKEo//MwAAv2IUTk4dsmsAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAsdEVYdFRpdGxlAEFkZDtJdGVtO0FkZEl0ZW07QmFy + cztSaWJib247SXRlbTtQbHVzTjLvgQAAAG5JREFUOE/VjNEJgDAMBbOTc7iU5LvzuIyL+GFMpJXX0laD + iHhwNLTNkYg88hyYWTpu8Rxw2cwCPew9hLCUEVdAWcuIK4AqvgDy08A4zYeG/dX5w4BxK5CWWiovBxBY + pKRe54GWxmWgJn5WKwGhHZsDINkhyk7EAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAPdEVYdFRpdGxlAFNob3c7RXllO0njByUAAAE3SURB + VDhPpZKxSsRQEEXzG5ba+QHCYuMX+Df6AxIIWKQMiGBSprEQLBYbixSRFNkopNDeRgxaCAsmYZzzyJO3 + MeKqAwfe3Ll3svsST0T+xaT4G74Ivu/vKqdRFEkQBAbtH9CYjf1ucFO5SpJEFouFNE0jXdcZOKMxw4N3 + ZYEKe8pLnufairwtW7m+e5TDsxvTu4UHLxltPcLbymtd18ZA+Pj8VvaP5oapwkuGLAvmRVEMIzFPtuHv + FlBkyLJg2bbtIIv52essIEP2xwUu7p24Cy7s5VHjv+DCzJbmDsiyYEt5rqrKDMaXaEFjRuElQ9a+xp0w + DCXLMmNwXyNwtmE86n8io+3Kh7SRpqnEcSxlWZqPp+97A2c09eTKJV6b+1xg0eFMOVHulfcBzmizsX+l + +QuT4vqI9wEq0AjdmqGMVgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAARdEVYdFRpdGxlAFJlc2V0O1VuZG87E4EW/wAAAYJJ + REFUWEfFlj1Ow2AMhnsAJK7TIdyEEzDCUhYmDsEpunOTbhyAgakSW/BTpdVr1+nHh6gzPFLs+LWdfL+r + cRwXJXVWkjorSZ2VOGMYhhZrY2NsjZ2xn+AZH++IybQHtB44IxNM3BlvxpcxNiCGWDRnubQeOMMCXqLA + eDD4wqzYJdCgdfm0HjjDAhBqE8/GtxGT/xa05OhqAGiC7rPi78ajwVjfTvCMj3cxnhynP6H1wBmT4Mhn + sD+MJ+PGOH1RgHfEEKtahuMwJ7QeOEMEERLeG7HgHMTGJpiYrh44IwgUvioWaYFGc7A61loPnBEEyqsR + C7RgOOKc2Gg9cEYIjmRLtAUTU3NstR44IwRn9DbB6lD9TuuBM0LwHD1NsERVu9d64AwL+G8Wb6B7CIBT + TUVMJE3aQ/ckBI5UFbGULu1+c/xpGQK/LR67ZRvREbZNFZdtxUc4OOIdgIR81VUPI2WR4zhSfiHJoPuy + K9kcZZfSFoz19a7lS5A6K0mdlaTOOsbVD4kgpriFBNvrAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAApdEVYdFRpdGxlAFJlbW92ZTtEZWxldGU7QmFycztS + aWJib247U3RhbmRhcmQ7Y1ZIMAAAAUFJREFUWEfFlUEOwjAMBHlYheBjSLw8xJKN3N1N43AIhxFi8Xp8 + KOqttfZXZLgTGe5Ehjuh4DgO5C6yKnfcj1AAC16d5p/424xvFx0ZCsSCYOUI6qInoKAPqwXfRZ0sUgy7 + 6DIo6IMPKCJXR4zkwQN9py9GHzLeqaRQR8zktpN8FNiQs3JESW6gj4IYdCpHlOUG+ijIw87siCtOcgN9 + FGDB+eUIkhvoo0CVnJUjpNxAHwWqlKgcMZQb6KNAlRKzB87I/w4CfRSoklORB8Mj0EeBKnVW5IE8An0U + iNIv8oCOQB8FUJjJ7YGbPZinI9BHQRquyGO2fAT6KPDBFXlQOgJ9FPSh2etYyYPZEfPXsdEHR4uu5MFl + F10UBF6gBUWGXfRQkPHiqjyQXXRQgPTSMy9YhLq4n4LdyHAnMtyJDPfRbh/esgzdHdsY9wAAAABJRU5E + rkJggg== + + + \ No newline at end of file diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb new file mode 100644 index 00000000..55823875 --- /dev/null +++ b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb @@ -0,0 +1,18 @@ +Imports System.ComponentModel + +Public Class frmWorkflowOverview + Private WorkflowItems As BindingList(Of WorkflowItem) + + Private Sub frmWorkflowOverview_Load(sender As Object, e As EventArgs) Handles MyBase.Load + WorkflowItems = New BindingList(Of WorkflowItem) From { + New WorkflowItem() With {.Title = "Eingangsrechnung XYZ", .State = WorkflowItem.ItemState.Danger, .WorkflowName = "Rechnungseingang"}, + New WorkflowItem() With {.Title = "Eingangsrechnung ABC", .State = WorkflowItem.ItemState.Normal, .WorkflowName = "Rechnungseingang"}, + New WorkflowItem() With {.Title = "Mietvertrag XYZ läuft aus", .State = WorkflowItem.ItemState.Warning, .WorkflowName = "Vertragsprüfung"} + } + + GridWorkflowOverview.DataSource = WorkflowItems + + + + End Sub +End Class \ No newline at end of file diff --git a/GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.Designer.vb b/GUIs.ClientSuite/Workflow/frmWorkflowStep.Designer.vb similarity index 100% rename from GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.Designer.vb rename to GUIs.ClientSuite/Workflow/frmWorkflowStep.Designer.vb diff --git a/GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.resx b/GUIs.ClientSuite/Workflow/frmWorkflowStep.resx similarity index 100% rename from GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.resx rename to GUIs.ClientSuite/Workflow/frmWorkflowStep.resx diff --git a/GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.vb b/GUIs.ClientSuite/Workflow/frmWorkflowStep.vb similarity index 98% rename from GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.vb rename to GUIs.ClientSuite/Workflow/frmWorkflowStep.vb index 92bb6297..d76fd577 100644 --- a/GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.vb +++ b/GUIs.ClientSuite/Workflow/frmWorkflowStep.vb @@ -1,5 +1,4 @@ Imports DevExpress.XtraLayout -Imports DigitalData.GUIs.ClientSuite Imports DigitalData.GUIs.ClientSuite.Controls Public Class frmWorkflowStep diff --git a/GUIs.ClientSuite/frmMain.Designer.vb b/GUIs.ClientSuite/frmMain.Designer.vb index 05fcebf0..d8636b59 100644 --- a/GUIs.ClientSuite/frmMain.Designer.vb +++ b/GUIs.ClientSuite/frmMain.Designer.vb @@ -21,11 +21,10 @@ Partial Class frmMain 'Do not modify it using the code editor. Private Sub InitializeComponent() - Me.components = New System.ComponentModel.Container() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmMain)) - Dim PushTransition1 As DevExpress.Utils.Animation.PushTransition = New DevExpress.Utils.Animation.PushTransition() + Dim PushTransition2 As DevExpress.Utils.Animation.PushTransition = New DevExpress.Utils.Animation.PushTransition() Me.RibbonControl = New DevExpress.XtraBars.Ribbon.RibbonControl() - Me.MainMenu = New DevExpress.XtraBars.Ribbon.ApplicationMenu(Me.components) + Me.MainMenu = New DevExpress.XtraBars.Ribbon.ApplicationMenu() Me.BarButtonExit = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonUserSettings = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonConnectionSettings = New DevExpress.XtraBars.BarButtonItem() @@ -51,13 +50,14 @@ Partial Class frmMain Me.RibbonPageGroup6 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonStatusBar = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() - Me.DocumentManager = New DevExpress.XtraBars.Docking2010.DocumentManager(Me.components) - Me.TabbedView1 = New DevExpress.XtraBars.Docking2010.Views.Tabbed.TabbedView(Me.components) - Me.DockManager = New DevExpress.XtraBars.Docking.DockManager(Me.components) + Me.DocumentManager = New DevExpress.XtraBars.Docking2010.DocumentManager() + Me.TabbedView1 = New DevExpress.XtraBars.Docking2010.Views.Tabbed.TabbedView() + Me.DockManager = New DevExpress.XtraBars.Docking.DockManager() Me.MainNav = New DevExpress.XtraBars.Navigation.OfficeNavigationBar() Me.NavbarItemHome = New DevExpress.XtraBars.Navigation.NavigationBarItem() Me.NavbarItemSearch = New DevExpress.XtraBars.Navigation.NavigationBarItem() Me.NavbarItemWorkflow = New DevExpress.XtraBars.Navigation.NavigationBarItem() + Me.BarButtonItem5 = New DevExpress.XtraBars.BarButtonItem() CType(Me.RibbonControl, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.MainMenu, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.DocumentManager, System.ComponentModel.ISupportInitialize).BeginInit() @@ -70,15 +70,15 @@ Partial Class frmMain ' Me.RibbonControl.ApplicationButtonDropDownControl = Me.MainMenu Me.RibbonControl.ExpandCollapseItem.Id = 0 - Me.RibbonControl.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl.ExpandCollapseItem, Me.BarButtonExit, Me.BarButtonUserSettings, Me.LabelCurrentUser, Me.LabelCurrentMachine, Me.LabelCurrentVersion, Me.BarButtonItem1, Me.SkinDropDownButtonItem1, Me.BarButtonDeleteControl, Me.BarButtonConnectionSettings, Me.LabelCurrentLanguage, Me.BarButtonItem2, Me.BarWorkspaceMenuItem1, Me.LabelServiceOnline, Me.BarButtonUserManager, Me.LabelServiceOffline, Me.BarButtonItem3, Me.BarButtonFormDesigner, Me.BarButtonItem4}) + Me.RibbonControl.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl.ExpandCollapseItem, Me.BarButtonExit, Me.BarButtonUserSettings, Me.LabelCurrentUser, Me.LabelCurrentMachine, Me.LabelCurrentVersion, Me.BarButtonItem1, Me.SkinDropDownButtonItem1, Me.BarButtonDeleteControl, Me.BarButtonConnectionSettings, Me.LabelCurrentLanguage, Me.BarButtonItem2, Me.BarWorkspaceMenuItem1, Me.LabelServiceOnline, Me.BarButtonUserManager, Me.LabelServiceOffline, Me.BarButtonItem3, Me.BarButtonFormDesigner, Me.BarButtonItem4, Me.BarButtonItem5}) Me.RibbonControl.Location = New System.Drawing.Point(0, 0) - Me.RibbonControl.MaxItemId = 25 + Me.RibbonControl.MaxItemId = 26 Me.RibbonControl.MdiMergeStyle = DevExpress.XtraBars.Ribbon.RibbonMdiMergeStyle.Always Me.RibbonControl.Name = "RibbonControl" Me.RibbonControl.PageHeaderItemLinks.Add(Me.SkinDropDownButtonItem1) Me.RibbonControl.PageHeaderItemLinks.Add(Me.BarWorkspaceMenuItem1) Me.RibbonControl.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPageStart, Me.RibbonPageAdmin}) - Me.RibbonControl.Size = New System.Drawing.Size(1139, 146) + Me.RibbonControl.Size = New System.Drawing.Size(1139, 143) Me.RibbonControl.StatusBar = Me.RibbonStatusBar ' 'MainMenu @@ -181,7 +181,7 @@ Partial Class frmMain 'WorkspaceManager1 ' Me.WorkspaceManager1.TargetControl = Me - Me.WorkspaceManager1.TransitionType = PushTransition1 + Me.WorkspaceManager1.TransitionType = PushTransition2 ' 'LabelServiceOnline ' @@ -223,7 +223,7 @@ Partial Class frmMain ' 'BarButtonItem4 ' - Me.BarButtonItem4.Caption = "Workflow Test" + Me.BarButtonItem4.Caption = "Workflow Step" Me.BarButtonItem4.Id = 24 Me.BarButtonItem4.ImageOptions.Image = CType(resources.GetObject("BarButtonItem4.ImageOptions.Image"), System.Drawing.Image) Me.BarButtonItem4.ImageOptions.LargeImage = CType(resources.GetObject("BarButtonItem4.ImageOptions.LargeImage"), System.Drawing.Image) @@ -241,6 +241,7 @@ Partial Class frmMain Me.RibbonPageGroup3.ItemLinks.Add(Me.BarButtonItem3) Me.RibbonPageGroup3.ItemLinks.Add(Me.BarButtonItem2) Me.RibbonPageGroup3.ItemLinks.Add(Me.BarButtonItem4) + Me.RibbonPageGroup3.ItemLinks.Add(Me.BarButtonItem5) Me.RibbonPageGroup3.Name = "RibbonPageGroup3" Me.RibbonPageGroup3.Text = "DEBUG" ' @@ -270,10 +271,10 @@ Partial Class frmMain Me.RibbonStatusBar.ItemLinks.Add(Me.LabelCurrentLanguage) Me.RibbonStatusBar.ItemLinks.Add(Me.LabelServiceOnline) Me.RibbonStatusBar.ItemLinks.Add(Me.LabelServiceOffline) - Me.RibbonStatusBar.Location = New System.Drawing.Point(0, 556) + Me.RibbonStatusBar.Location = New System.Drawing.Point(0, 546) Me.RibbonStatusBar.Name = "RibbonStatusBar" Me.RibbonStatusBar.Ribbon = Me.RibbonControl - Me.RibbonStatusBar.Size = New System.Drawing.Size(1139, 21) + Me.RibbonStatusBar.Size = New System.Drawing.Size(1139, 31) ' 'DocumentManager ' @@ -297,7 +298,7 @@ Partial Class frmMain ' Me.MainNav.Dock = System.Windows.Forms.DockStyle.Bottom Me.MainNav.Items.AddRange(New DevExpress.XtraBars.Navigation.NavigationBarItem() {Me.NavbarItemHome, Me.NavbarItemSearch, Me.NavbarItemWorkflow}) - Me.MainNav.Location = New System.Drawing.Point(0, 511) + Me.MainNav.Location = New System.Drawing.Point(0, 501) Me.MainNav.Name = "MainNav" Me.MainNav.Size = New System.Drawing.Size(1139, 45) Me.MainNav.TabIndex = 4 @@ -318,6 +319,14 @@ Partial Class frmMain Me.NavbarItemWorkflow.Name = "NavbarItemWorkflow" Me.NavbarItemWorkflow.Text = "Workflow" ' + 'BarButtonItem5 + ' + Me.BarButtonItem5.Caption = "Workflow Overview" + Me.BarButtonItem5.Id = 25 + Me.BarButtonItem5.ImageOptions.Image = CType(resources.GetObject("BarButtonItem5.ImageOptions.Image"), System.Drawing.Image) + Me.BarButtonItem5.ImageOptions.LargeImage = CType(resources.GetObject("BarButtonItem5.ImageOptions.LargeImage"), System.Drawing.Image) + Me.BarButtonItem5.Name = "BarButtonItem5" + ' 'frmMain ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -377,4 +386,5 @@ Partial Class frmMain Friend WithEvents RibbonPageGroup1 As DevExpress.XtraBars.Ribbon.RibbonPageGroup Friend WithEvents BarButtonFormDesigner As DevExpress.XtraBars.BarButtonItem Friend WithEvents BarButtonItem4 As DevExpress.XtraBars.BarButtonItem + Friend WithEvents BarButtonItem5 As DevExpress.XtraBars.BarButtonItem End Class diff --git a/GUIs.ClientSuite/frmMain.resx b/GUIs.ClientSuite/frmMain.resx index ed5110e8..9a7f64cc 100644 --- a/GUIs.ClientSuite/frmMain.resx +++ b/GUIs.ClientSuite/frmMain.resx @@ -446,6 +446,26 @@ Ixl2CEPBSIYdwlAwkmGHMBSMZNghDKWWbpVS4o3v1CEMRSNDD5B2gN71YvgpPhq3GLYfdNj1nbYYth90 +O8BevftiO/Wx/Vxj1/qP1v5Vm9f/a6aB8wD5gHzgPVxJoYjMRwnlhd3GhRitUujhAAAAABJRU5ErkJg gg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAALHRFWHRUaXRsZQBEb2N1bWVu + dDtNYXA7U2NoZW1lO0RpYWdyYW07SGllcmFyO05ldE4PKkQAAAB1SURBVDhPzczBDYAwDEPRLsg6DMAS + jMC1x24X9CVAbWKgqBcOTwjXTjKzITKclmKK7yEEUGP4HkIANYbvIQRQY/geQgA1hu8hBFBj+B5CUMs5 + 20G+o/mpBm8eD/A9XQOXtQfmbbUahZ7s9sCX7CcHRsiwn6Ud+yzVdNjXwB0AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAALHRFWHRUaXRsZQBEb2N1bWVu + dDtNYXA7U2NoZW1lO0RpYWdyYW07SGllcmFyO05ldE4PKkQAAADDSURBVFhH7dKxDcIwEAXQLMg6DMAS + jEDrku0OHGEJRU+HIwWncfFS/IT/r2CJiFMxHImhXG7P2IEdwlAwkmGHMBSMZNghDAUjGXYIQ8FIhh3C + UDCSYYcwFIxk2CEMBSMZdghDwUiGHcJQMJJhhzAUjGTYIQyllm6VUuKN79QhDEUjQw+QdoDe9WL4KT4a + txi2H3TY9Z22GLYfdPjvAXr37Yjv1sf1cY9f6j9b+VZvX/2umgfMA+YB84D1cSaGIzEcJ5YXdxoUYrVL + o4QAAAAASUVORK5CYII= diff --git a/GUIs.ClientSuite/frmMain.vb b/GUIs.ClientSuite/frmMain.vb index 257ecca3..c68d8803 100644 --- a/GUIs.ClientSuite/frmMain.vb +++ b/GUIs.ClientSuite/frmMain.vb @@ -222,4 +222,11 @@ Public Class frmMain } oForm.Show() End Sub + + Private Sub BarButtonItem5_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem5.ItemClick + Dim oForm As New frmWorkflowOverview() With { + .MdiParent = DocumentManager.MdiParent + } + oForm.Show() + End Sub End Class \ No newline at end of file diff --git a/GUIs.ClientSuite/packages.config b/GUIs.ClientSuite/packages.config index cd1527a3..55fed1f5 100644 --- a/GUIs.ClientSuite/packages.config +++ b/GUIs.ClientSuite/packages.config @@ -3,5 +3,6 @@ + \ No newline at end of file diff --git a/GUIs.Test.TestGUI/Form1.Designer.vb b/GUIs.Test.TestGUI/Form1.Designer.vb index e744c1bb..579d5dc9 100644 --- a/GUIs.Test.TestGUI/Form1.Designer.vb +++ b/GUIs.Test.TestGUI/Form1.Designer.vb @@ -43,6 +43,8 @@ Partial Class Form1 Me.TextBox1 = New System.Windows.Forms.TextBox() Me.Label6 = New System.Windows.Forms.Label() Me.Button4 = New System.Windows.Forms.Button() + Me.Button6 = New System.Windows.Forms.Button() + Me.ListBox1 = New System.Windows.Forms.ListBox() CType(Me.GridControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.GridView1, System.ComponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() @@ -228,11 +230,30 @@ Partial Class Form1 Me.Button4.Text = "Test Background Worker Logging" Me.Button4.UseVisualStyleBackColor = True ' + 'Button6 + ' + Me.Button6.Location = New System.Drawing.Point(683, 143) + Me.Button6.Name = "Button6" + Me.Button6.Size = New System.Drawing.Size(75, 23) + Me.Button6.TabIndex = 23 + Me.Button6.Text = "Get Logs" + Me.Button6.UseVisualStyleBackColor = True + ' + 'ListBox1 + ' + Me.ListBox1.FormattingEnabled = True + Me.ListBox1.Location = New System.Drawing.Point(683, 172) + Me.ListBox1.Name = "ListBox1" + Me.ListBox1.Size = New System.Drawing.Size(355, 303) + Me.ListBox1.TabIndex = 24 + ' 'Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(1050, 487) + Me.Controls.Add(Me.ListBox1) + Me.Controls.Add(Me.Button6) Me.Controls.Add(Me.Button4) Me.Controls.Add(Me.Label6) Me.Controls.Add(Me.TextBox1) @@ -284,4 +305,6 @@ Partial Class Form1 Friend WithEvents TextBox1 As TextBox Friend WithEvents Label6 As Label Friend WithEvents Button4 As Button + Friend WithEvents Button6 As Button + Friend WithEvents ListBox1 As ListBox End Class diff --git a/GUIs.Test.TestGUI/Form1.vb b/GUIs.Test.TestGUI/Form1.vb index a41b5a2a..532f188c 100644 --- a/GUIs.Test.TestGUI/Form1.vb +++ b/GUIs.Test.TestGUI/Form1.vb @@ -41,6 +41,7 @@ Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load MyLogger = New LogConfig(LogConfig.PathType.CurrentDirectory, Nothing, "MAIN") + MyLogger.Debug = True Logger = MyLogger.GetLogger() Dim MySecondLogger = New LogConfig(LogConfig.PathType.CurrentDirectory, Nothing, "MAIN2") @@ -169,4 +170,12 @@ Public Class Form1 bw1.RunWorkerAsync() End Sub + Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click + Logger.Error(New ApplicationException("Some Error occurred!")) + + ListBox1.Items.Clear() + For Each oLog In MyLogger.Logs + ListBox1.Items.Add(oLog) + Next + End Sub End Class diff --git a/LoggerDiag/App.config b/LoggerDiag/App.config new file mode 100644 index 00000000..5534e287 --- /dev/null +++ b/LoggerDiag/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/LoggerDiag/DummyConfig.vb b/LoggerDiag/DummyConfig.vb new file mode 100644 index 00000000..8fe9c12d --- /dev/null +++ b/LoggerDiag/DummyConfig.vb @@ -0,0 +1,3 @@ +Public Class DummyConfig + Public SomeSetting As String = "Default_Value" +End Class diff --git a/LoggerDiag/MonoDiag.vbproj b/LoggerDiag/MonoDiag.vbproj new file mode 100644 index 00000000..c374a4ff --- /dev/null +++ b/LoggerDiag/MonoDiag.vbproj @@ -0,0 +1,151 @@ + + + + + Debug + AnyCPU + {3D437957-B90B-4D8F-9219-6D19B0C90994} + WinExe + MonoDiag.My.MyApplication + MonoDiag + MonoDiag + 512 + WindowsForms + v4.6.1 + true + + + AnyCPU + true + full + true + true + bin\Debug\ + MonoDiag.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + AnyCPU + pdbonly + false + true + true + bin\Release\ + MonoDiag.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + + + + + + + + + + ..\packages\NLog.4.5.11\lib\net45\NLog.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + frmMain.vb + Form + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + frmMain.vb + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + + + {44982f9b-6116-44e2-85d0-f39650b1ef99} + Config + + + {903b2d7d-3b80-4be9-8713-7447b704e1b0} + Logging + + + + \ No newline at end of file diff --git a/LoggerDiag/My Project/Application.Designer.vb b/LoggerDiag/My Project/Application.Designer.vb new file mode 100644 index 00000000..a12c37f8 --- /dev/null +++ b/LoggerDiag/My Project/Application.Designer.vb @@ -0,0 +1,38 @@ +'------------------------------------------------------------------------------ +' +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:4.0.30319.42000 +' +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + 'HINWEIS: Diese Datei wird automatisch generiert und darf nicht direkt bearbeitet werden. Wenn Sie Änderungen vornehmen möchten + ' oder in dieser Datei Buildfehler auftreten, wechseln Sie zum Projekt-Designer. + ' (Wechseln Sie dazu zu den Projekteigenschaften, oder doppelklicken Sie auf den Knoten "Mein Projekt" im + ' Projektmappen-Explorer). Nehmen Sie auf der Registerkarte "Anwendung" entsprechende Änderungen vor. + ' + Partial Friend Class MyApplication + + _ + Public Sub New() + MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) + Me.IsSingleInstance = false + Me.EnableVisualStyles = true + Me.SaveMySettingsOnExit = true + Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses + End Sub + + _ + Protected Overrides Sub OnCreateMainForm() + Me.MainForm = Global.MonoDiag.frmMain + End Sub + End Class +End Namespace diff --git a/LoggerDiag/My Project/Application.myapp b/LoggerDiag/My Project/Application.myapp new file mode 100644 index 00000000..739ea6fe --- /dev/null +++ b/LoggerDiag/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + true + frmMain + false + 0 + true + 0 + true + \ No newline at end of file diff --git a/LoggerDiag/My Project/AssemblyInfo.vb b/LoggerDiag/My Project/AssemblyInfo.vb new file mode 100644 index 00000000..5af86104 --- /dev/null +++ b/LoggerDiag/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' Allgemeine Informationen über eine Assembly werden über die folgenden +' Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +' die einer Assembly zugeordnet sind. + +' Werte der Assemblyattribute überprüfen + + + + + + + + + + +'Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird. + + +' Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +' +' Hauptversion +' Nebenversion +' Buildnummer +' Revision +' +' Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, +' übernehmen, indem Sie "*" eingeben: +' + + + diff --git a/LoggerDiag/My Project/Resources.Designer.vb b/LoggerDiag/My Project/Resources.Designer.vb new file mode 100644 index 00000000..b31b1912 --- /dev/null +++ b/LoggerDiag/My Project/Resources.Designer.vb @@ -0,0 +1,63 @@ +'------------------------------------------------------------------------------ +' +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:4.0.30319.42000 +' +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + '-Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + 'Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + 'mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + '''

+ ''' Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("MonoDiag.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + ''' Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/LoggerDiag/My Project/Resources.resx b/LoggerDiag/My Project/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/LoggerDiag/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LoggerDiag/My Project/Settings.Designer.vb b/LoggerDiag/My Project/Settings.Designer.vb new file mode 100644 index 00000000..b2d12459 --- /dev/null +++ b/LoggerDiag/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:4.0.30319.42000 +' +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "Automatische My.Settings-Speicherfunktion" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.MonoDiag.My.MySettings + Get + Return Global.MonoDiag.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/LoggerDiag/My Project/Settings.settings b/LoggerDiag/My Project/Settings.settings new file mode 100644 index 00000000..85b890b3 --- /dev/null +++ b/LoggerDiag/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/LoggerDiag/My Project/licenses.licx b/LoggerDiag/My Project/licenses.licx new file mode 100644 index 00000000..824a99fc --- /dev/null +++ b/LoggerDiag/My Project/licenses.licx @@ -0,0 +1 @@ +DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/LoggerDiag/frmMain.Designer.vb b/LoggerDiag/frmMain.Designer.vb new file mode 100644 index 00000000..14cf6f4f --- /dev/null +++ b/LoggerDiag/frmMain.Designer.vb @@ -0,0 +1,122 @@ + _ +Partial Class frmMain + Inherits System.Windows.Forms.Form + + '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() + Me.GridControlLogs = New DevExpress.XtraGrid.GridControl() + Me.GridView1 = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.btnRefresh = New System.Windows.Forms.Button() + Me.Button1 = New System.Windows.Forms.Button() + Me.TextBox1 = New System.Windows.Forms.TextBox() + Me.Label1 = New System.Windows.Forms.Label() + Me.Button2 = New System.Windows.Forms.Button() + CType(Me.GridControlLogs, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridView1, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'GridControlLogs + ' + Me.GridControlLogs.Dock = System.Windows.Forms.DockStyle.Right + Me.GridControlLogs.Location = New System.Drawing.Point(251, 0) + Me.GridControlLogs.MainView = Me.GridView1 + Me.GridControlLogs.Name = "GridControlLogs" + Me.GridControlLogs.Size = New System.Drawing.Size(888, 679) + Me.GridControlLogs.TabIndex = 0 + Me.GridControlLogs.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridView1}) + ' + 'GridView1 + ' + Me.GridView1.GridControl = Me.GridControlLogs + Me.GridView1.Name = "GridView1" + ' + 'btnRefresh + ' + Me.btnRefresh.Location = New System.Drawing.Point(12, 12) + Me.btnRefresh.Name = "btnRefresh" + Me.btnRefresh.Size = New System.Drawing.Size(233, 35) + Me.btnRefresh.TabIndex = 1 + Me.btnRefresh.Text = "Refresh Logs" + Me.btnRefresh.UseVisualStyleBackColor = True + ' + 'Button1 + ' + Me.Button1.Location = New System.Drawing.Point(12, 53) + Me.Button1.Name = "Button1" + Me.Button1.Size = New System.Drawing.Size(233, 32) + Me.Button1.TabIndex = 2 + Me.Button1.Text = "Read Config" + Me.Button1.UseVisualStyleBackColor = True + ' + 'TextBox1 + ' + Me.TextBox1.Location = New System.Drawing.Point(12, 143) + Me.TextBox1.Name = "TextBox1" + Me.TextBox1.Size = New System.Drawing.Size(233, 20) + Me.TextBox1.TabIndex = 3 + ' + 'Label1 + ' + Me.Label1.AutoSize = True + Me.Label1.Location = New System.Drawing.Point(9, 127) + Me.Label1.Name = "Label1" + Me.Label1.Size = New System.Drawing.Size(109, 13) + Me.Label1.TabIndex = 4 + Me.Label1.Text = "Value of Test-Setting:" + ' + 'Button2 + ' + Me.Button2.Location = New System.Drawing.Point(12, 91) + Me.Button2.Name = "Button2" + Me.Button2.Size = New System.Drawing.Size(233, 33) + Me.Button2.TabIndex = 5 + Me.Button2.Text = "Save Config" + Me.Button2.UseVisualStyleBackColor = True + ' + 'frmMain + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(1139, 679) + Me.Controls.Add(Me.Button2) + Me.Controls.Add(Me.Label1) + Me.Controls.Add(Me.TextBox1) + Me.Controls.Add(Me.Button1) + Me.Controls.Add(Me.btnRefresh) + Me.Controls.Add(Me.GridControlLogs) + Me.MinimumSize = New System.Drawing.Size(1155, 718) + Me.Name = "frmMain" + Me.Text = "Digital Data Diagnose" + CType(Me.GridControlLogs, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridView1, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Friend WithEvents GridControlLogs As DevExpress.XtraGrid.GridControl + Friend WithEvents GridView1 As DevExpress.XtraGrid.Views.Grid.GridView + Friend WithEvents btnRefresh As Button + Friend WithEvents Button1 As Button + Friend WithEvents TextBox1 As TextBox + Friend WithEvents Label1 As Label + Friend WithEvents Button2 As Button +End Class diff --git a/LoggerDiag/frmMain.resx b/LoggerDiag/frmMain.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/LoggerDiag/frmMain.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/LoggerDiag/frmMain.vb b/LoggerDiag/frmMain.vb new file mode 100644 index 00000000..2fc491b3 --- /dev/null +++ b/LoggerDiag/frmMain.vb @@ -0,0 +1,62 @@ +Imports System.IO +Imports DigitalData.Modules.Config +Imports DigitalData.Modules.Logging + +Public Class frmMain + Public LogConfig As LogConfig + Public Logger As Logger + Public Config As ConfigManager(Of DummyConfig) + + + Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load + LogConfig = New LogConfig(LogConfig.PathType.AppData) With { + .Debug = True + } + + Dim productName As String = My.Application.Info.ProductName + Dim companyName As String = My.Application.Info.CompanyName + + Dim appDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + Dim basePath = Path.Combine(appDataDir, companyName, productName, "Log") + + Logger = LogConfig.GetLogger() + Logger.Info("Initializing Config") + Logger.Info("Logging Path: {0}", basePath) + Logger.Info("UserConfig.xml Path: {0}", Application.UserAppDataPath) + Logger.Info("ComputerConfig.xml Path: {0}", Application.CommonAppDataPath) + + Config = New ConfigManager(Of DummyConfig)(LogConfig, Application.UserAppDataPath, Application.CommonAppDataPath) + + RefreshLogs() + End Sub + + Private Sub RefreshLogs() + GridControlLogs.DataSource = LogConfig.Logs + End Sub + + Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnRefresh.Click + RefreshLogs() + End Sub + + Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click + Try + Logger.Info("Value of TestSetting is: {0}", Config.Config.SomeSetting) + TextBox1.Text = Config.Config.SomeSetting + RefreshLogs() + Catch ex As Exception + Logger.Error(ex) + RefreshLogs() + End Try + End Sub + + Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click + Try + Config.Config.SomeSetting = TextBox1.Text + Config.Save() + RefreshLogs() + Catch ex As Exception + Logger.Error(ex) + RefreshLogs() + End Try + End Sub +End Class diff --git a/LoggerDiag/packages.config b/LoggerDiag/packages.config new file mode 100644 index 00000000..f89fa324 --- /dev/null +++ b/LoggerDiag/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 6ab1cf669c448d633755dc5ab76592d500f59bf8 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Thu, 27 Jun 2019 14:34:51 +0200 Subject: [PATCH 12/20] fuck around in workflow form --- GUIs.ClientSuite/ClientSuite.vbproj | 1 + GUIs.ClientSuite/Workflow/WorkflowDetail.vb | 3 + GUIs.ClientSuite/Workflow/WorkflowItem.vb | 3 +- .../Workflow/frmWorkflowOverview.Designer.vb | 81 ++++++++++++++----- .../Workflow/frmWorkflowOverview.vb | 37 ++++++++- 5 files changed, 100 insertions(+), 25 deletions(-) create mode 100644 GUIs.ClientSuite/Workflow/WorkflowDetail.vb diff --git a/GUIs.ClientSuite/ClientSuite.vbproj b/GUIs.ClientSuite/ClientSuite.vbproj index 355eee6f..69cdd064 100644 --- a/GUIs.ClientSuite/ClientSuite.vbproj +++ b/GUIs.ClientSuite/ClientSuite.vbproj @@ -205,6 +205,7 @@ + DockManagerTest.vb diff --git a/GUIs.ClientSuite/Workflow/WorkflowDetail.vb b/GUIs.ClientSuite/Workflow/WorkflowDetail.vb new file mode 100644 index 00000000..089ffd99 --- /dev/null +++ b/GUIs.ClientSuite/Workflow/WorkflowDetail.vb @@ -0,0 +1,3 @@ +Public Class WorkflowDetail + Public Property Title +End Class diff --git a/GUIs.ClientSuite/Workflow/WorkflowItem.vb b/GUIs.ClientSuite/Workflow/WorkflowItem.vb index 2d34b8f3..cdab45cf 100644 --- a/GUIs.ClientSuite/Workflow/WorkflowItem.vb +++ b/GUIs.ClientSuite/Workflow/WorkflowItem.vb @@ -14,9 +14,8 @@ Public Class WorkflowItem End Enum Public Property StateImage As Image - Public Property Title As String - + Public Property CreatedAt As DateTime Public Property WorkflowName As String Private _state As ItemState diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb index af720a62..ab97be22 100644 --- a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb +++ b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb @@ -22,7 +22,16 @@ Partial Class frmWorkflowOverview 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmWorkflowOverview)) + Dim TableColumnDefinition1 As DevExpress.XtraEditors.TableLayout.TableColumnDefinition = New DevExpress.XtraEditors.TableLayout.TableColumnDefinition() + Dim TableColumnDefinition2 As DevExpress.XtraEditors.TableLayout.TableColumnDefinition = New DevExpress.XtraEditors.TableLayout.TableColumnDefinition() + Dim TableColumnDefinition3 As DevExpress.XtraEditors.TableLayout.TableColumnDefinition = New DevExpress.XtraEditors.TableLayout.TableColumnDefinition() + Dim TableRowDefinition1 As DevExpress.XtraEditors.TableLayout.TableRowDefinition = New DevExpress.XtraEditors.TableLayout.TableRowDefinition() + Dim TableRowDefinition2 As DevExpress.XtraEditors.TableLayout.TableRowDefinition = New DevExpress.XtraEditors.TableLayout.TableRowDefinition() + Dim TableRowDefinition3 As DevExpress.XtraEditors.TableLayout.TableRowDefinition = New DevExpress.XtraEditors.TableLayout.TableRowDefinition() + Dim TableSpan1 As DevExpress.XtraEditors.TableLayout.TableSpan = New DevExpress.XtraEditors.TableLayout.TableSpan() + Dim TileViewItemElement1 As DevExpress.XtraGrid.Views.Tile.TileViewItemElement = New DevExpress.XtraGrid.Views.Tile.TileViewItemElement() Dim WindowsUIButtonImageOptions3 As DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions = New DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions() Dim WindowsUIButtonImageOptions4 As DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions = New DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions() Me.RibbonControl1 = New DevExpress.XtraBars.Ribbon.RibbonControl() @@ -42,6 +51,7 @@ Partial Class frmWorkflowOverview Me.SplitContainerControl1 = New DevExpress.XtraEditors.SplitContainerControl() Me.GridWorkflowOverview = New DevExpress.XtraGrid.GridControl() Me.gvOverview = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.GridView1 = New DevExpress.XtraGrid.Views.Grid.GridView() Me.GridWorkflowDetails = New DevExpress.XtraGrid.GridControl() Me.tvDetails = New DevExpress.XtraGrid.Views.Tile.TileView() Me.LayoutControl1 = New DevExpress.XtraLayout.LayoutControl() @@ -57,6 +67,7 @@ Partial Class frmWorkflowOverview Me.SplitContainerControl1.SuspendLayout() CType(Me.GridWorkflowOverview, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.gvOverview, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridView1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.GridWorkflowDetails, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.tvDetails, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).BeginInit() @@ -76,7 +87,7 @@ Partial Class frmWorkflowOverview Me.RibbonControl1.MaxItemId = 7 Me.RibbonControl1.Name = "RibbonControl1" Me.RibbonControl1.PageCategories.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageCategory() {Me.RibbonPageCategory1}) - Me.RibbonControl1.Size = New System.Drawing.Size(1134, 143) + Me.RibbonControl1.Size = New System.Drawing.Size(1134, 146) Me.RibbonControl1.StatusBar = Me.RibbonStatusBar1 ' 'BarCheckItem1 @@ -128,10 +139,10 @@ Partial Class frmWorkflowOverview ' 'RibbonStatusBar1 ' - Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 692) + Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 702) Me.RibbonStatusBar1.Name = "RibbonStatusBar1" Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1 - Me.RibbonStatusBar1.Size = New System.Drawing.Size(1134, 31) + Me.RibbonStatusBar1.Size = New System.Drawing.Size(1134, 21) ' 'RibbonPage2 ' @@ -144,11 +155,11 @@ Partial Class frmWorkflowOverview Me.NavBarControl1.Dock = System.Windows.Forms.DockStyle.Left Me.NavBarControl1.Groups.AddRange(New DevExpress.XtraNavBar.NavBarGroup() {Me.NavBarGroup1}) Me.NavBarControl1.Items.AddRange(New DevExpress.XtraNavBar.NavBarItem() {Me.NavBarItem1, Me.NavBarItem2, Me.NavBarItem3}) - Me.NavBarControl1.Location = New System.Drawing.Point(0, 143) + Me.NavBarControl1.Location = New System.Drawing.Point(0, 146) Me.NavBarControl1.Name = "NavBarControl1" Me.NavBarControl1.OptionsNavPane.ExpandedWidth = 200 Me.NavBarControl1.OptionsNavPane.GroupImageShowMode = DevExpress.XtraNavBar.GroupImageShowMode.InCollapsedState - Me.NavBarControl1.Size = New System.Drawing.Size(200, 549) + Me.NavBarControl1.Size = New System.Drawing.Size(200, 556) Me.NavBarControl1.TabIndex = 2 Me.NavBarControl1.Text = "NavBarControl1" Me.NavBarControl1.View = New DevExpress.XtraNavBar.ViewInfo.SkinNavigationPaneViewInfoRegistrator() @@ -182,14 +193,14 @@ Partial Class frmWorkflowOverview 'SplitContainerControl1 ' Me.SplitContainerControl1.Dock = System.Windows.Forms.DockStyle.Fill - Me.SplitContainerControl1.Location = New System.Drawing.Point(200, 143) + Me.SplitContainerControl1.Location = New System.Drawing.Point(200, 146) Me.SplitContainerControl1.Name = "SplitContainerControl1" Me.SplitContainerControl1.Panel1.Controls.Add(Me.GridWorkflowOverview) Me.SplitContainerControl1.Panel1.Text = "Panel1" Me.SplitContainerControl1.Panel2.Controls.Add(Me.GridWorkflowDetails) Me.SplitContainerControl1.Panel2.Controls.Add(Me.LayoutControl1) Me.SplitContainerControl1.Panel2.Text = "Panel2" - Me.SplitContainerControl1.Size = New System.Drawing.Size(934, 549) + Me.SplitContainerControl1.Size = New System.Drawing.Size(934, 556) Me.SplitContainerControl1.SplitterPosition = 471 Me.SplitContainerControl1.TabIndex = 5 Me.SplitContainerControl1.Text = "SplitContainerControl1" @@ -201,14 +212,23 @@ Partial Class frmWorkflowOverview Me.GridWorkflowOverview.MainView = Me.gvOverview Me.GridWorkflowOverview.MenuManager = Me.RibbonControl1 Me.GridWorkflowOverview.Name = "GridWorkflowOverview" - Me.GridWorkflowOverview.Size = New System.Drawing.Size(471, 549) + Me.GridWorkflowOverview.Size = New System.Drawing.Size(471, 556) Me.GridWorkflowOverview.TabIndex = 0 - Me.GridWorkflowOverview.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.gvOverview}) + Me.GridWorkflowOverview.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.gvOverview, Me.GridView1}) ' 'gvOverview ' Me.gvOverview.GridControl = Me.GridWorkflowOverview Me.gvOverview.Name = "gvOverview" + Me.gvOverview.OptionsFind.AlwaysVisible = True + Me.gvOverview.OptionsView.GroupDrawMode = DevExpress.XtraGrid.Views.Grid.GroupDrawMode.Office + Me.gvOverview.OptionsView.ShowGroupedColumns = True + Me.gvOverview.OptionsView.ShowVerticalLines = DevExpress.Utils.DefaultBoolean.[True] + ' + 'GridView1 + ' + Me.GridView1.GridControl = Me.GridWorkflowOverview + Me.GridView1.Name = "GridView1" ' 'GridWorkflowDetails ' @@ -217,7 +237,7 @@ Partial Class frmWorkflowOverview Me.GridWorkflowDetails.MainView = Me.tvDetails Me.GridWorkflowDetails.MenuManager = Me.RibbonControl1 Me.GridWorkflowDetails.Name = "GridWorkflowDetails" - Me.GridWorkflowDetails.Size = New System.Drawing.Size(458, 383) + Me.GridWorkflowDetails.Size = New System.Drawing.Size(451, 390) Me.GridWorkflowDetails.TabIndex = 1 Me.GridWorkflowDetails.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.tvDetails}) ' @@ -225,6 +245,25 @@ Partial Class frmWorkflowOverview ' Me.tvDetails.GridControl = Me.GridWorkflowDetails Me.tvDetails.Name = "tvDetails" + Me.tvDetails.OptionsTiles.ItemSize = New System.Drawing.Size(248, 123) + Me.tvDetails.OptionsTiles.LayoutMode = DevExpress.XtraGrid.Views.Tile.TileViewLayoutMode.List + Me.tvDetails.TileColumns.Add(TableColumnDefinition1) + Me.tvDetails.TileColumns.Add(TableColumnDefinition2) + Me.tvDetails.TileColumns.Add(TableColumnDefinition3) + TableRowDefinition1.Length.Value = 15.0R + TableRowDefinition2.Length.Value = 13.0R + TableRowDefinition3.Length.Value = 13.0R + Me.tvDetails.TileRows.Add(TableRowDefinition1) + Me.tvDetails.TileRows.Add(TableRowDefinition2) + Me.tvDetails.TileRows.Add(TableRowDefinition3) + TableSpan1.ColumnSpan = 2 + TableSpan1.RowSpan = 2 + Me.tvDetails.TileSpans.Add(TableSpan1) + TileViewItemElement1.ImageOptions.ImageAlignment = DevExpress.XtraEditors.TileItemContentAlignment.MiddleCenter + TileViewItemElement1.ImageOptions.ImageScaleMode = DevExpress.XtraEditors.TileItemImageScaleMode.ZoomInside + TileViewItemElement1.Text = "element1" + TileViewItemElement1.TextAlignment = DevExpress.XtraEditors.TileItemContentAlignment.MiddleCenter + Me.tvDetails.TileTemplate.Add(TileViewItemElement1) ' 'LayoutControl1 ' @@ -234,7 +273,7 @@ Partial Class frmWorkflowOverview Me.LayoutControl1.Name = "LayoutControl1" Me.LayoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = New System.Drawing.Rectangle(1186, 56, 650, 400) Me.LayoutControl1.Root = Me.LayoutControlGroup1 - Me.LayoutControl1.Size = New System.Drawing.Size(458, 166) + Me.LayoutControl1.Size = New System.Drawing.Size(451, 166) Me.LayoutControl1.TabIndex = 0 Me.LayoutControl1.Text = "LayoutControl1" ' @@ -246,8 +285,8 @@ Partial Class frmWorkflowOverview Me.WindowsUIButtonPanel1.ContentAlignment = System.Drawing.ContentAlignment.MiddleLeft Me.WindowsUIButtonPanel1.Location = New System.Drawing.Point(12, 96) Me.WindowsUIButtonPanel1.Name = "WindowsUIButtonPanel1" - Me.WindowsUIButtonPanel1.Size = New System.Drawing.Size(434, 55) - Me.WindowsUIButtonPanel1.TabIndex = 5 + Me.WindowsUIButtonPanel1.Size = New System.Drawing.Size(427, 55) + Me.WindowsUIButtonPanel1.TabIndex = 0 Me.WindowsUIButtonPanel1.Text = "WindowsUIButtonPanel1" ' 'LayoutControlGroup1 @@ -256,7 +295,7 @@ Partial Class frmWorkflowOverview Me.LayoutControlGroup1.GroupBordersVisible = False Me.LayoutControlGroup1.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.SimpleLabelItem1, Me.LayoutControlItem2, Me.SimpleLabelItem2, Me.SimpleLabelItem3}) Me.LayoutControlGroup1.Name = "Root" - Me.LayoutControlGroup1.Size = New System.Drawing.Size(458, 166) + Me.LayoutControlGroup1.Size = New System.Drawing.Size(451, 166) Me.LayoutControlGroup1.TextVisible = False ' 'SimpleLabelItem1 @@ -268,7 +307,7 @@ Partial Class frmWorkflowOverview Me.SimpleLabelItem1.AppearanceItemCaption.Options.UseForeColor = True Me.SimpleLabelItem1.Location = New System.Drawing.Point(0, 0) Me.SimpleLabelItem1.Name = "SimpleLabelItem1" - Me.SimpleLabelItem1.Size = New System.Drawing.Size(438, 34) + Me.SimpleLabelItem1.Size = New System.Drawing.Size(431, 34) Me.SimpleLabelItem1.Text = "Vertragsnr. 4711" Me.SimpleLabelItem1.TextSize = New System.Drawing.Size(151, 30) ' @@ -277,7 +316,7 @@ Partial Class frmWorkflowOverview Me.LayoutControlItem2.Control = Me.WindowsUIButtonPanel1 Me.LayoutControlItem2.Location = New System.Drawing.Point(0, 84) Me.LayoutControlItem2.Name = "LayoutControlItem2" - Me.LayoutControlItem2.Size = New System.Drawing.Size(438, 62) + Me.LayoutControlItem2.Size = New System.Drawing.Size(431, 62) Me.LayoutControlItem2.TextSize = New System.Drawing.Size(0, 0) Me.LayoutControlItem2.TextVisible = False ' @@ -288,7 +327,7 @@ Partial Class frmWorkflowOverview Me.SimpleLabelItem2.AppearanceItemCaption.Options.UseFont = True Me.SimpleLabelItem2.Location = New System.Drawing.Point(0, 59) Me.SimpleLabelItem2.Name = "SimpleLabelItem2" - Me.SimpleLabelItem2.Size = New System.Drawing.Size(438, 25) + Me.SimpleLabelItem2.Size = New System.Drawing.Size(431, 25) Me.SimpleLabelItem2.Text = "Sunshine GmbH" Me.SimpleLabelItem2.TextSize = New System.Drawing.Size(151, 21) ' @@ -299,7 +338,7 @@ Partial Class frmWorkflowOverview Me.SimpleLabelItem3.AppearanceItemCaption.Options.UseFont = True Me.SimpleLabelItem3.Location = New System.Drawing.Point(0, 34) Me.SimpleLabelItem3.Name = "SimpleLabelItem3" - Me.SimpleLabelItem3.Size = New System.Drawing.Size(438, 25) + Me.SimpleLabelItem3.Size = New System.Drawing.Size(431, 25) Me.SimpleLabelItem3.Text = "Objekt: Haus Nr. 9" Me.SimpleLabelItem3.TextSize = New System.Drawing.Size(151, 21) ' @@ -322,6 +361,7 @@ Partial Class frmWorkflowOverview Me.SplitContainerControl1.ResumeLayout(False) CType(Me.GridWorkflowOverview, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.gvOverview, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridView1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.GridWorkflowDetails, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.tvDetails, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).EndInit() @@ -348,8 +388,6 @@ Partial Class frmWorkflowOverview Friend WithEvents RibbonPage3 As DevExpress.XtraBars.Ribbon.RibbonPage Friend WithEvents RibbonPageGroup3 As DevExpress.XtraBars.Ribbon.RibbonPageGroup Friend WithEvents SplitContainerControl1 As DevExpress.XtraEditors.SplitContainerControl - Friend WithEvents GridWorkflowOverview As DevExpress.XtraGrid.GridControl - Friend WithEvents gvOverview As DevExpress.XtraGrid.Views.Grid.GridView Friend WithEvents GridWorkflowDetails As DevExpress.XtraGrid.GridControl Friend WithEvents LayoutControl1 As DevExpress.XtraLayout.LayoutControl Friend WithEvents LayoutControlGroup1 As DevExpress.XtraLayout.LayoutControlGroup @@ -362,4 +400,7 @@ Partial Class frmWorkflowOverview Friend WithEvents SimpleLabelItem2 As DevExpress.XtraLayout.SimpleLabelItem Friend WithEvents SimpleLabelItem3 As DevExpress.XtraLayout.SimpleLabelItem Friend WithEvents tvDetails As DevExpress.XtraGrid.Views.Tile.TileView + Friend WithEvents GridWorkflowOverview As DevExpress.XtraGrid.GridControl + Friend WithEvents gvOverview As DevExpress.XtraGrid.Views.Grid.GridView + Friend WithEvents GridView1 As DevExpress.XtraGrid.Views.Grid.GridView End Class diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb index 55823875..5eca8adf 100644 --- a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb +++ b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb @@ -1,18 +1,49 @@ Imports System.ComponentModel +Imports DevExpress.Utils Public Class frmWorkflowOverview Private WorkflowItems As BindingList(Of WorkflowItem) + Private WorkflowDetails As BindingList(Of WorkflowDetail) Private Sub frmWorkflowOverview_Load(sender As Object, e As EventArgs) Handles MyBase.Load WorkflowItems = New BindingList(Of WorkflowItem) From { - New WorkflowItem() With {.Title = "Eingangsrechnung XYZ", .State = WorkflowItem.ItemState.Danger, .WorkflowName = "Rechnungseingang"}, - New WorkflowItem() With {.Title = "Eingangsrechnung ABC", .State = WorkflowItem.ItemState.Normal, .WorkflowName = "Rechnungseingang"}, - New WorkflowItem() With {.Title = "Mietvertrag XYZ läuft aus", .State = WorkflowItem.ItemState.Warning, .WorkflowName = "Vertragsprüfung"} + New WorkflowItem() With { + .Title = "Eingangsrechnung XYZ", + .State = WorkflowItem.ItemState.Danger, + .WorkflowName = "Rechnungseingang", + .CreatedAt = DateTime.Now.AddDays(-3) + }, + New WorkflowItem() With { + .Title = "Eingangsrechnung ABC", + .State = WorkflowItem.ItemState.Normal, + .WorkflowName = "Rechnungseingang", + .CreatedAt = DateTime.Now + }, + New WorkflowItem() With { + .Title = "Mietvertrag XYZ läuft aus", + .State = WorkflowItem.ItemState.Warning, + .WorkflowName = "Vertragsprüfung", + .CreatedAt = DateTime.Now.AddDays(-1) + } + } + + WorkflowDetails = New BindingList(Of WorkflowDetail) From { + New WorkflowDetail() With { + .Title = "foooo!" + } } GridWorkflowOverview.DataSource = WorkflowItems + GridWorkflowDetails.DataSource = WorkflowDetails + gvOverview.GroupFormat = "[#image]{1} {2}" + With gvOverview.Columns.Item("CreatedAt") + .OptionsFilter.FilterPopupMode = DevExpress.XtraGrid.Columns.FilterPopupMode.DateAlt + .GroupInterval = DevExpress.XtraGrid.ColumnGroupInterval.DateRange + .SortOrder = DevExpress.Data.ColumnSortOrder.Descending + .Group() + End With End Sub End Class \ No newline at end of file From a57f0c6b9bfcb55ef601e6504f1b3a185c7da716 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Fri, 28 Jun 2019 10:54:25 +0200 Subject: [PATCH 13/20] ZUGFeRDImporter: Fix index out of range error --- Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb index 1942f890..5c594898 100644 --- a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb +++ b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb @@ -345,9 +345,11 @@ Public Class ImportZUGFeRDFiles For Each oColumn As KeyValuePair(Of XmlItemProperty, List(Of Object)) In oPropertyList Dim oTableName As String = oColumn.Key.TableName Dim oPropertyDescription As String = oColumn.Key.Description - Dim oPropertyValue = oColumn.Value.Item(oRowIndex) Dim oRowCounter = oRowIndex + oGlobalGroupCounter + 1 + ' Returns nothing if oColumn.Value contains an empty list + Dim oPropertyValue = oColumn.Value.ElementAtOrDefault(oRowIndex) + _logger.Debug("Processing property {0}.", oPropertyDescription) If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then From 8a30f645f8f022a685ef18e113cf743deffaadf8 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Fri, 28 Jun 2019 14:42:53 +0200 Subject: [PATCH 14/20] Add attachment subfolder for success and error directories --- DDZUGFeRDService/ThreadRunner.vb | 4 +++ Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb | 43 ++++++++++++++++++++----- Jobs/EDMI/ZUGFeRD/WorkerArgs.vb | 2 ++ 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/DDZUGFeRDService/ThreadRunner.vb b/DDZUGFeRDService/ThreadRunner.vb index 45dbb8d5..d1ffbe67 100644 --- a/DDZUGFeRDService/ThreadRunner.vb +++ b/DDZUGFeRDService/ThreadRunner.vb @@ -20,6 +20,7 @@ Public Class ThreadRunner Private _successDirectory As String Private _errorDirectory As String Private _originalEmailDirectory As String + Private _attachmentDirectory As String Private _zugferd As ZUGFeRDInterface Private _jobArguments As WorkerArgs Private _mssql As MSSQLServer @@ -148,6 +149,9 @@ Public Class ThreadRunner Case ZUGFERD_REJECTED_EML args.RejectedEmailDirectory = row.Item("FOLDER_PATH") + Case ZUGFERD_ATTACHMENTS + args.AttachmentsSubDirectory = row.Item("FOLDER_PATH") + End Select Next diff --git a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb index 5c594898..1d3250ad 100644 --- a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb +++ b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb @@ -20,6 +20,7 @@ Public Class ImportZUGFeRDFiles Public Const ZUGFERD_SUCCESS = "ZUGFeRD Success" Public Const ZUGFERD_EML = "ZUGFeRD Eml" Public Const ZUGFERD_REJECTED_EML = "ZUGFeRD Eml Rejected" + Public Const ZUGFERD_ATTACHMENTS = "ZUGFeRD Attachments" Private _logger As Logger Private _logConfig As LogConfig @@ -226,7 +227,10 @@ Public Class ImportZUGFeRDFiles Dim oZUGFeRDCount As Integer = 0 ' Set the default Move Directory Dim oMoveDirectory As String = args.SuccessDirectory + ' Create file lists Dim oFileGroupFiles As List(Of FileInfo) = oFileGroup.Value + Dim oFileAttachmentFiles As New List(Of FileInfo) + Dim oFileGroupId As String = oFileGroup.Key Dim oMissingProperties As New List(Of String) Dim oMD5CheckSum As String = String.Empty @@ -248,6 +252,7 @@ Public Class ImportZUGFeRDFiles ' Only pdf files are allowed from here on If Not oFile.Name.EndsWith(".pdf") Then _logger.Debug("Skipping non-pdf file {0}", oFile.Name) + oFileAttachmentFiles.Add(oFile) Continue For End If @@ -257,6 +262,7 @@ Public Class ImportZUGFeRDFiles oDocument = _zugferd.ExtractZUGFeRDFile(oFile.FullName) Catch ex As Exception _logger.Warn("File is not a valid ZUGFeRD document! Skipping.") + oFileAttachmentFiles.Add(oFile) Continue For End Try @@ -509,14 +515,16 @@ Public Class ImportZUGFeRDFiles oConnection.Close() ' Move all files of the current group - For Each oFile In oFileGroupFiles - _filesystem.MoveTo(oFile.FullName, oMoveDirectory) - _logger.Info("Finished processing file {0}", oFile.Name) - _logger.Info("File moved to {0}", oMoveDirectory) - Next - - _logger.Info("Finished processing file group {0}", oFileGroupId) - _logger.EndBlock() + Try + MoveFiles(args, oFileGroupFiles, oFileAttachmentFiles, oMoveDirectory) + _logger.Info("Finished processing file group {0}", oFileGroupId) + Catch ex As Exception + _logger.Warn("Could not move files!") + _logger.Error(ex) + Throw ex + Finally + _logger.EndBlock() + End Try End Try Next End If @@ -529,6 +537,25 @@ Public Class ImportZUGFeRDFiles End Try End Sub + Private Sub MoveFiles(Args As WorkerArgs, Files As List(Of FileInfo), AttachmentFiles As List(Of FileInfo), MoveDirectory As String) + For Each oFile In Files + Dim oFinalMoveDirectory As String = MoveDirectory + + If AttachmentFiles.Contains(oFile) Then + oFinalMoveDirectory = Path.Combine(MoveDirectory, Args.AttachmentsSubDirectory) + + If Not Directory.Exists(oFinalMoveDirectory) Then + Directory.CreateDirectory(oFinalMoveDirectory) + End If + End If + + _filesystem.MoveTo(oFile.FullName, oFinalMoveDirectory) + _logger.Info("Finished processing file {0}", oFile.Name) + _logger.Info("File moved to {0}", oFinalMoveDirectory) + Next + End Sub + + Private Function CreateBodyForMissingProperties(OriginalFilename As String, MissingProperties As List(Of String)) Dim oBody = $"

The following file is not ZUGFeRD-compliant: {OriginalFilename}

" diff --git a/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb b/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb index 68c39324..71b3f456 100644 --- a/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb +++ b/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb @@ -6,6 +6,7 @@ Public Class WorkerArgs Public ErrorDirectory As String Public OriginalEmailDirectory As String Public RejectedEmailDirectory As String + Public AttachmentsSubDirectory As String Public PropertyMap As Dictionary(Of String, XmlItemProperty) Public InsertIntoSQLServer As Boolean @@ -15,6 +16,7 @@ Public Class WorkerArgs ErrorDirectory = Nothing OriginalEmailDirectory = Nothing RejectedEmailDirectory = Nothing + AttachmentsSubDirectory = Nothing PropertyMap = New Dictionary(Of String, XmlItemProperty) InsertIntoSQLServer = False End Sub From 507e67309fe93417dba6d4db0e5770119b49c45d Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Tue, 2 Jul 2019 14:54:57 +0200 Subject: [PATCH 15/20] workflows --- Filesystem/Encryption.vb | 41 +++-- GUIs.ClientSuite/ClientSuite.vbproj | 18 +++ GUIs.ClientSuite/Common/ClassCommonViews.vb | 22 +++ .../Workflow/GridOverview.Designer.vb | 74 +++++++++ GUIs.ClientSuite/Workflow/GridOverview.resx | 120 +++++++++++++++ GUIs.ClientSuite/Workflow/GridOverview.vb | 27 ++++ .../Workflow/NavControlOverview.Designer.vb | 60 ++++++++ .../Workflow/NavControlOverview.resx | 120 +++++++++++++++ .../Workflow/NavControlOverview.vb | 40 +++++ GUIs.ClientSuite/Workflow/WorkflowItem.vb | 25 +-- .../Workflow/frmWorkflowOverview.Designer.vb | 145 +++++------------- .../Workflow/frmWorkflowOverview.resx | 42 +---- .../Workflow/frmWorkflowOverview.vb | 75 +++++---- Modules.Config/ConfigManager.vb | 4 +- 14 files changed, 599 insertions(+), 214 deletions(-) create mode 100644 GUIs.ClientSuite/Workflow/GridOverview.Designer.vb create mode 100644 GUIs.ClientSuite/Workflow/GridOverview.resx create mode 100644 GUIs.ClientSuite/Workflow/GridOverview.vb create mode 100644 GUIs.ClientSuite/Workflow/NavControlOverview.Designer.vb create mode 100644 GUIs.ClientSuite/Workflow/NavControlOverview.resx create mode 100644 GUIs.ClientSuite/Workflow/NavControlOverview.vb diff --git a/Filesystem/Encryption.vb b/Filesystem/Encryption.vb index b7a3b95b..1ec620de 100644 --- a/Filesystem/Encryption.vb +++ b/Filesystem/Encryption.vb @@ -1,5 +1,6 @@ Imports System.IO Imports System.Security.Cryptography +Imports System.Text.Encoding Imports DigitalData.Modules.Logging ''' @@ -19,8 +20,6 @@ Public Class Encryption Private ReadOnly _password As String Private _logger As Logger - - Public Sub New(LogConfig As LogConfig, Password As String) _logger = LogConfig.GetLogger() @@ -31,13 +30,24 @@ Public Class Encryption _password = Password End Sub - Public Async Function EncryptAsync(oPlainTextBytes As Byte()) As Task(Of Byte()) + Public Async Function EncryptAsync(PlainTextBytes As Byte()) As Task(Of Byte()) Return Await Task.Run(Function() As Byte() - Return Encrypt(oPlainTextBytes) + Return Encrypt(PlainTextBytes) End Function) End Function - Public Function Encrypt(oPlainTextBytes As Byte()) As Byte() + Public Function Encrypt(PlainText As String) As String + Try + Dim oBytes As Byte() = UTF8.GetBytes(PlainText) + Dim oEncrypted As Byte() = Encrypt(oBytes) + Return UTF8.GetString(oEncrypted) + Catch ex As Exception + _logger.Error(ex) + Throw ex + End Try + End Function + + Public Function Encrypt(PlainTextBytes As Byte()) As Byte() Try ' Salt and IV is randomly generated each time, but is preprended to encrypted cipher text ' so that the same Salt and IV values can be used when decrypting. @@ -53,7 +63,7 @@ Public Class Encryption Using oEncryptor = oSymmetricKey.CreateEncryptor(oKeyBytes, oIvStringBytes) Using oMemoryStream = New MemoryStream() Using oCryptoStream = New CryptoStream(oMemoryStream, oEncryptor, CryptoStreamMode.Write) - oCryptoStream.Write(oPlainTextBytes, 0, oPlainTextBytes.Length) + oCryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length) oCryptoStream.FlushFinalBlock() ' Create the final bytes as a concatenation of the random salt bytes, the random iv bytes and the cipher bytes. Dim oCipherTextBytes = oSaltStringBytes @@ -79,16 +89,27 @@ Public Class Encryption End Function) End Function - Public Function Decrypt(cipherTextBytesWithSaltAndIv As Byte()) As Byte() + Public Function Decrypt(CipherTextPlainWithSaltAndIv As String) As String + Try + Dim oBytes As Byte() = UTF8.GetBytes(CipherTextPlainWithSaltAndIv) + Dim oDecrypted As Byte() = Decrypt(oBytes) + Return UTF8.GetString(oDecrypted) + Catch ex As Exception + _logger.Error(ex) + Throw ex + End Try + End Function + + Public Function Decrypt(CipherTextBytesWithSaltAndIv As Byte()) As Byte() Try ' Get the complete stream of bytes that represent: ' [32 bytes of Salt] + [32 bytes of IV] + [n bytes of CipherText] ' Get the saltbytes by extracting the first 32 bytes from the supplied cipherText bytes. - Dim oSaltStringBytes = cipherTextBytesWithSaltAndIv.Take(KEY_SIZE / 8).ToArray() + Dim oSaltStringBytes = CipherTextBytesWithSaltAndIv.Take(KEY_SIZE / 8).ToArray() ' Get the IV bytes by extracting the next 32 bytes from the supplied cipherText bytes. - Dim oIvStringBytes = cipherTextBytesWithSaltAndIv.Skip(KEY_SIZE / 8).Take(KEY_SIZE / 8).ToArray() + Dim oIvStringBytes = CipherTextBytesWithSaltAndIv.Skip(KEY_SIZE / 8).Take(KEY_SIZE / 8).ToArray() ' Get the actual cipher text bytes by removing the first 64 bytes from the cipherText string. - Dim oCipherTextBytes = cipherTextBytesWithSaltAndIv.Skip((KEY_SIZE / 8) * 2).Take(cipherTextBytesWithSaltAndIv.Length - ((KEY_SIZE / 8) * 2)).ToArray() + Dim oCipherTextBytes = CipherTextBytesWithSaltAndIv.Skip((KEY_SIZE / 8) * 2).Take(CipherTextBytesWithSaltAndIv.Length - ((KEY_SIZE / 8) * 2)).ToArray() Using oPassword = New Rfc2898DeriveBytes(_password, oSaltStringBytes, DERIVATION_ITERATIONS) Dim oKeyBytes = oPassword.GetBytes(KEY_SIZE / 8) diff --git a/GUIs.ClientSuite/ClientSuite.vbproj b/GUIs.ClientSuite/ClientSuite.vbproj index 69cdd064..1f8f53dd 100644 --- a/GUIs.ClientSuite/ClientSuite.vbproj +++ b/GUIs.ClientSuite/ClientSuite.vbproj @@ -205,6 +205,18 @@ + + GridOverview.vb + + + UserControl + + + NavControlOverview.vb + + + UserControl + @@ -352,6 +364,12 @@ DocumentPanel.vb + + GridOverview.vb + + + NavControlOverview.vb + DockManagerTest.vb diff --git a/GUIs.ClientSuite/Common/ClassCommonViews.vb b/GUIs.ClientSuite/Common/ClassCommonViews.vb index 759b61db..d7d583c2 100644 --- a/GUIs.ClientSuite/Common/ClassCommonViews.vb +++ b/GUIs.ClientSuite/Common/ClassCommonViews.vb @@ -52,4 +52,26 @@ Public Class ClassCommonViews Throw ex End Try End Function + + Public Async Function VWIDB_GUI_WF_OVERVIEW(UserId As Int64, FormId As Int64) As Task(Of DataTable) + Try + My.Channel.CreateDatabaseRequest("Load Control Data", True) + + Dim oSQL As String = $"SELECT * FROM VWIDB_GUI_WF_OVERVIEW WHERE USERID = {UserId} AND FORMID = {FormId}" + Dim oResult = Await My.Channel.ReturnDatatableAsync(oSQL) + Dim oTable = oResult.Table + + If Not oResult.OK Then + _Logger.Error(New ApplicationException(oResult.ErrorMessage)) + Return Nothing + End If + + My.Channel.CloseDatabaseRequest() + + Return oResult.Table + Catch ex As Exception + _Logger.Error(ex) + Throw ex + End Try + End Function End Class diff --git a/GUIs.ClientSuite/Workflow/GridOverview.Designer.vb b/GUIs.ClientSuite/Workflow/GridOverview.Designer.vb new file mode 100644 index 00000000..15a1c6bd --- /dev/null +++ b/GUIs.ClientSuite/Workflow/GridOverview.Designer.vb @@ -0,0 +1,74 @@ + _ +Partial Class GridOverview + Inherits System.Windows.Forms.UserControl + + 'UserControl ü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() + Me.GridControl = New DevExpress.XtraGrid.GridControl() + Me.gvOverview = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.GridView1 = New DevExpress.XtraGrid.Views.Grid.GridView() + CType(Me.GridControl, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.gvOverview, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridView1, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'GridControl + ' + Me.GridControl.Dock = System.Windows.Forms.DockStyle.Fill + Me.GridControl.Location = New System.Drawing.Point(0, 0) + Me.GridControl.MainView = Me.gvOverview + Me.GridControl.Name = "GridControl" + Me.GridControl.Size = New System.Drawing.Size(626, 461) + Me.GridControl.TabIndex = 1 + Me.GridControl.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.gvOverview, Me.GridView1}) + ' + 'gvOverview + ' + Me.gvOverview.GridControl = Me.GridControl + Me.gvOverview.Name = "gvOverview" + Me.gvOverview.OptionsFind.AlwaysVisible = True + Me.gvOverview.OptionsView.GroupDrawMode = DevExpress.XtraGrid.Views.Grid.GroupDrawMode.Office + Me.gvOverview.OptionsView.ShowGroupedColumns = True + Me.gvOverview.OptionsView.ShowVerticalLines = DevExpress.Utils.DefaultBoolean.[True] + ' + 'GridView1 + ' + Me.GridView1.GridControl = Me.GridControl + Me.GridView1.Name = "GridView1" + ' + 'GridOverview + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.Controls.Add(Me.GridControl) + Me.Name = "GridOverview" + Me.Size = New System.Drawing.Size(626, 461) + CType(Me.GridControl, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.gvOverview, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridView1, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + + End Sub + + Friend WithEvents GridControl As DevExpress.XtraGrid.GridControl + Friend WithEvents gvOverview As DevExpress.XtraGrid.Views.Grid.GridView + Friend WithEvents GridView1 As DevExpress.XtraGrid.Views.Grid.GridView +End Class diff --git a/GUIs.ClientSuite/Workflow/GridOverview.resx b/GUIs.ClientSuite/Workflow/GridOverview.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/GUIs.ClientSuite/Workflow/GridOverview.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/GUIs.ClientSuite/Workflow/GridOverview.vb b/GUIs.ClientSuite/Workflow/GridOverview.vb new file mode 100644 index 00000000..9020cd81 --- /dev/null +++ b/GUIs.ClientSuite/Workflow/GridOverview.vb @@ -0,0 +1,27 @@ +Public Class GridOverview + Private _DataSource As List(Of WorkflowItem) + + Public Property DataSource As List(Of WorkflowItem) + Get + Return _DataSource + End Get + Set(value As List(Of WorkflowItem)) + _DataSource = value + GridControl.DataSource = value + + If Not IsNothing(value) Then + ApplyStyles() + End If + End Set + End Property + + Private Sub ApplyStyles() + With gvOverview.Columns.Item("StateImage") + .VisibleIndex = 0 + .MaxWidth = 20 + .OptionsColumn.ShowCaption = False + End With + gvOverview.Columns.Item("Process").VisibleIndex = 1 + gvOverview.Columns.Item("State").Visible = False + End Sub +End Class diff --git a/GUIs.ClientSuite/Workflow/NavControlOverview.Designer.vb b/GUIs.ClientSuite/Workflow/NavControlOverview.Designer.vb new file mode 100644 index 00000000..56bf792f --- /dev/null +++ b/GUIs.ClientSuite/Workflow/NavControlOverview.Designer.vb @@ -0,0 +1,60 @@ + _ +Partial Class NavControlOverview + Inherits System.Windows.Forms.UserControl + + 'UserControl ü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() + Me.NavBarControl = New DevExpress.XtraNavBar.NavBarControl() + Me.NavBarGroup1 = New DevExpress.XtraNavBar.NavBarGroup() + CType(Me.NavBarControl, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'NavBarControl + ' + Me.NavBarControl.ActiveGroup = Me.NavBarGroup1 + Me.NavBarControl.Dock = System.Windows.Forms.DockStyle.Fill + Me.NavBarControl.Groups.AddRange(New DevExpress.XtraNavBar.NavBarGroup() {Me.NavBarGroup1}) + Me.NavBarControl.Location = New System.Drawing.Point(0, 0) + Me.NavBarControl.Name = "NavBarControl" + Me.NavBarControl.Size = New System.Drawing.Size(150, 150) + Me.NavBarControl.TabIndex = 0 + Me.NavBarControl.Text = "NavBarControl1" + ' + 'NavBarGroup1 + ' + Me.NavBarGroup1.Caption = "Workflow" + Me.NavBarGroup1.Expanded = True + Me.NavBarGroup1.Name = "NavBarGroup1" + ' + 'NavControlOverview + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.Controls.Add(Me.NavBarControl) + Me.Name = "NavControlOverview" + CType(Me.NavBarControl, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + + End Sub + + Friend WithEvents NavBarControl As DevExpress.XtraNavBar.NavBarControl + Friend WithEvents NavBarGroup1 As DevExpress.XtraNavBar.NavBarGroup +End Class diff --git a/GUIs.ClientSuite/Workflow/NavControlOverview.resx b/GUIs.ClientSuite/Workflow/NavControlOverview.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/GUIs.ClientSuite/Workflow/NavControlOverview.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/GUIs.ClientSuite/Workflow/NavControlOverview.vb b/GUIs.ClientSuite/Workflow/NavControlOverview.vb new file mode 100644 index 00000000..d2150829 --- /dev/null +++ b/GUIs.ClientSuite/Workflow/NavControlOverview.vb @@ -0,0 +1,40 @@ +Imports DevExpress.XtraNavBar + +Public Class NavControlOverview + Private _DataSource As List(Of WorkflowItem) + + Public Property DataSource As List(Of WorkflowItem) + Get + Return _DataSource + End Get + Set(value As List(Of WorkflowItem)) + _DataSource = value + + 'TODO: Update Navbar Items + If Not IsNothing(value) Then + UpdateItems(value) + End If + + End Set + End Property + + Private Sub UpdateItems(WorkflowItems As List(Of WorkflowItem)) + Dim oTotalItems = WorkflowItems.Count + Dim oGroupedItems = WorkflowItems.GroupBy(Function(Item As WorkflowItem) + Return Item.Process + End Function) + + AddItem("Alle Workflows", oTotalItems) + + For Each oGroupedItem As IGrouping(Of String, WorkflowItem) In oGroupedItems + AddItem(oGroupedItem.Key, oGroupedItem.Count) + Next + End Sub + + Private Sub AddItem(Title As String, Count As Integer) + Dim oItem = New NavBarItem() With { + .Caption = $"{Title} ({Count})" + } + NavBarControl.Groups.First().ItemLinks.Add(oItem) + End Sub +End Class diff --git a/GUIs.ClientSuite/Workflow/WorkflowItem.vb b/GUIs.ClientSuite/Workflow/WorkflowItem.vb index cdab45cf..250e874f 100644 --- a/GUIs.ClientSuite/Workflow/WorkflowItem.vb +++ b/GUIs.ClientSuite/Workflow/WorkflowItem.vb @@ -4,35 +4,26 @@ Imports DigitalData.GUIs.ClientSuite Public Class WorkflowItem Implements INotifyPropertyChanged - Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged - Public Enum ItemState - Normal - Warning - Danger - End Enum + Private _state As String - Public Property StateImage As Image Public Property Title As String Public Property CreatedAt As DateTime - Public Property WorkflowName As String + Public Property Process As String - Private _state As ItemState - - Public Property State As ItemState + Public Property StateImage As Image + Public Property State As String Get Return _state End Get - Set(value As ItemState) + Set(value As String) _state = value Select Case value - Case ItemState.Normal - StateImage = My.Resources.ampel_gruen - Case ItemState.Warning + Case "Start" + StateImage = My.Resources. + Case "Not started" StateImage = My.Resources.ampel_gelb - Case ItemState.Danger - StateImage = My.Resources.ampel_rot Case Else StateImage = Nothing End Select diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb index ab97be22..dfcaaf9a 100644 --- a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb +++ b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb @@ -1,6 +1,6 @@  Partial Class frmWorkflowOverview - Inherits DevExpress.XtraBars.Ribbon.RibbonForm + Inherits DigitalData.GUIs.ClientSuite.Base.BaseRibbonForm 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. @@ -32,8 +32,8 @@ Partial Class frmWorkflowOverview Dim TableRowDefinition3 As DevExpress.XtraEditors.TableLayout.TableRowDefinition = New DevExpress.XtraEditors.TableLayout.TableRowDefinition() Dim TableSpan1 As DevExpress.XtraEditors.TableLayout.TableSpan = New DevExpress.XtraEditors.TableLayout.TableSpan() Dim TileViewItemElement1 As DevExpress.XtraGrid.Views.Tile.TileViewItemElement = New DevExpress.XtraGrid.Views.Tile.TileViewItemElement() - Dim WindowsUIButtonImageOptions3 As DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions = New DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions() - Dim WindowsUIButtonImageOptions4 As DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions = New DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions() + Dim WindowsUIButtonImageOptions1 As DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions = New DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions() + Dim WindowsUIButtonImageOptions2 As DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions = New DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions() Me.RibbonControl1 = New DevExpress.XtraBars.Ribbon.RibbonControl() Me.BarCheckItem1 = New DevExpress.XtraBars.BarCheckItem() Me.BarCheckItem2 = New DevExpress.XtraBars.BarCheckItem() @@ -43,15 +43,8 @@ Partial Class frmWorkflowOverview Me.RibbonPageGroup3 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() Me.RibbonPage2 = New DevExpress.XtraBars.Ribbon.RibbonPage() - Me.NavBarControl1 = New DevExpress.XtraNavBar.NavBarControl() - Me.NavBarGroup1 = New DevExpress.XtraNavBar.NavBarGroup() - Me.NavBarItem1 = New DevExpress.XtraNavBar.NavBarItem() - Me.NavBarItem2 = New DevExpress.XtraNavBar.NavBarItem() - Me.NavBarItem3 = New DevExpress.XtraNavBar.NavBarItem() Me.SplitContainerControl1 = New DevExpress.XtraEditors.SplitContainerControl() - Me.GridWorkflowOverview = New DevExpress.XtraGrid.GridControl() - Me.gvOverview = New DevExpress.XtraGrid.Views.Grid.GridView() - Me.GridView1 = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.NavControlOverview = New DigitalData.GUIs.ClientSuite.NavControlOverview() Me.GridWorkflowDetails = New DevExpress.XtraGrid.GridControl() Me.tvDetails = New DevExpress.XtraGrid.Views.Tile.TileView() Me.LayoutControl1 = New DevExpress.XtraLayout.LayoutControl() @@ -61,13 +54,10 @@ Partial Class frmWorkflowOverview Me.LayoutControlItem2 = New DevExpress.XtraLayout.LayoutControlItem() Me.SimpleLabelItem2 = New DevExpress.XtraLayout.SimpleLabelItem() Me.SimpleLabelItem3 = New DevExpress.XtraLayout.SimpleLabelItem() + Me.GridOverview = New DigitalData.GUIs.ClientSuite.GridOverview() CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.NavBarControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit() Me.SplitContainerControl1.SuspendLayout() - CType(Me.GridWorkflowOverview, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.gvOverview, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.GridView1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.GridWorkflowDetails, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.tvDetails, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).BeginInit() @@ -149,86 +139,30 @@ Partial Class frmWorkflowOverview Me.RibbonPage2.Name = "RibbonPage2" Me.RibbonPage2.Text = "RibbonPage2" ' - 'NavBarControl1 - ' - Me.NavBarControl1.ActiveGroup = Me.NavBarGroup1 - Me.NavBarControl1.Dock = System.Windows.Forms.DockStyle.Left - Me.NavBarControl1.Groups.AddRange(New DevExpress.XtraNavBar.NavBarGroup() {Me.NavBarGroup1}) - Me.NavBarControl1.Items.AddRange(New DevExpress.XtraNavBar.NavBarItem() {Me.NavBarItem1, Me.NavBarItem2, Me.NavBarItem3}) - Me.NavBarControl1.Location = New System.Drawing.Point(0, 146) - Me.NavBarControl1.Name = "NavBarControl1" - Me.NavBarControl1.OptionsNavPane.ExpandedWidth = 200 - Me.NavBarControl1.OptionsNavPane.GroupImageShowMode = DevExpress.XtraNavBar.GroupImageShowMode.InCollapsedState - Me.NavBarControl1.Size = New System.Drawing.Size(200, 556) - Me.NavBarControl1.TabIndex = 2 - Me.NavBarControl1.Text = "NavBarControl1" - Me.NavBarControl1.View = New DevExpress.XtraNavBar.ViewInfo.SkinNavigationPaneViewInfoRegistrator() - ' - 'NavBarGroup1 - ' - Me.NavBarGroup1.Caption = "Workflows" - Me.NavBarGroup1.Expanded = True - Me.NavBarGroup1.ImageOptions.SmallImage = CType(resources.GetObject("NavBarGroup1.ImageOptions.SmallImage"), System.Drawing.Image) - Me.NavBarGroup1.ItemLinks.AddRange(New DevExpress.XtraNavBar.NavBarItemLink() {New DevExpress.XtraNavBar.NavBarItemLink(Me.NavBarItem1), New DevExpress.XtraNavBar.NavBarItemLink(Me.NavBarItem2), New DevExpress.XtraNavBar.NavBarItemLink(Me.NavBarItem3)}) - Me.NavBarGroup1.Name = "NavBarGroup1" - ' - 'NavBarItem1 - ' - Me.NavBarItem1.Caption = "Alle Workflows (100)" - Me.NavBarItem1.ImageOptions.SmallImage = CType(resources.GetObject("NavBarItem1.ImageOptions.SmallImage"), System.Drawing.Image) - Me.NavBarItem1.Name = "NavBarItem1" - ' - 'NavBarItem2 - ' - Me.NavBarItem2.Caption = "Rechnungseingang (80)" - Me.NavBarItem2.ImageOptions.SmallImage = CType(resources.GetObject("NavBarItem2.ImageOptions.SmallImage"), System.Drawing.Image) - Me.NavBarItem2.Name = "NavBarItem2" - ' - 'NavBarItem3 - ' - Me.NavBarItem3.Caption = "Vertragsprüfung (20)" - Me.NavBarItem3.ImageOptions.SmallImage = CType(resources.GetObject("NavBarItem3.ImageOptions.SmallImage"), System.Drawing.Image) - Me.NavBarItem3.Name = "NavBarItem3" - ' 'SplitContainerControl1 ' Me.SplitContainerControl1.Dock = System.Windows.Forms.DockStyle.Fill - Me.SplitContainerControl1.Location = New System.Drawing.Point(200, 146) + Me.SplitContainerControl1.Location = New System.Drawing.Point(0, 146) Me.SplitContainerControl1.Name = "SplitContainerControl1" - Me.SplitContainerControl1.Panel1.Controls.Add(Me.GridWorkflowOverview) + Me.SplitContainerControl1.Panel1.Controls.Add(Me.GridOverview) + Me.SplitContainerControl1.Panel1.Controls.Add(Me.NavControlOverview) Me.SplitContainerControl1.Panel1.Text = "Panel1" Me.SplitContainerControl1.Panel2.Controls.Add(Me.GridWorkflowDetails) Me.SplitContainerControl1.Panel2.Controls.Add(Me.LayoutControl1) Me.SplitContainerControl1.Panel2.Text = "Panel2" - Me.SplitContainerControl1.Size = New System.Drawing.Size(934, 556) - Me.SplitContainerControl1.SplitterPosition = 471 + Me.SplitContainerControl1.Size = New System.Drawing.Size(1134, 556) + Me.SplitContainerControl1.SplitterPosition = 841 Me.SplitContainerControl1.TabIndex = 5 Me.SplitContainerControl1.Text = "SplitContainerControl1" ' - 'GridWorkflowOverview - ' - Me.GridWorkflowOverview.Dock = System.Windows.Forms.DockStyle.Fill - Me.GridWorkflowOverview.Location = New System.Drawing.Point(0, 0) - Me.GridWorkflowOverview.MainView = Me.gvOverview - Me.GridWorkflowOverview.MenuManager = Me.RibbonControl1 - Me.GridWorkflowOverview.Name = "GridWorkflowOverview" - Me.GridWorkflowOverview.Size = New System.Drawing.Size(471, 556) - Me.GridWorkflowOverview.TabIndex = 0 - Me.GridWorkflowOverview.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.gvOverview, Me.GridView1}) - ' - 'gvOverview + 'NavControlOverview ' - Me.gvOverview.GridControl = Me.GridWorkflowOverview - Me.gvOverview.Name = "gvOverview" - Me.gvOverview.OptionsFind.AlwaysVisible = True - Me.gvOverview.OptionsView.GroupDrawMode = DevExpress.XtraGrid.Views.Grid.GroupDrawMode.Office - Me.gvOverview.OptionsView.ShowGroupedColumns = True - Me.gvOverview.OptionsView.ShowVerticalLines = DevExpress.Utils.DefaultBoolean.[True] - ' - 'GridView1 - ' - Me.GridView1.GridControl = Me.GridWorkflowOverview - Me.GridView1.Name = "GridView1" + Me.NavControlOverview.DataSource = Nothing + Me.NavControlOverview.Dock = System.Windows.Forms.DockStyle.Left + Me.NavControlOverview.Location = New System.Drawing.Point(0, 0) + Me.NavControlOverview.Name = "NavControlOverview" + Me.NavControlOverview.Size = New System.Drawing.Size(185, 556) + Me.NavControlOverview.TabIndex = 1 ' 'GridWorkflowDetails ' @@ -237,7 +171,7 @@ Partial Class frmWorkflowOverview Me.GridWorkflowDetails.MainView = Me.tvDetails Me.GridWorkflowDetails.MenuManager = Me.RibbonControl1 Me.GridWorkflowDetails.Name = "GridWorkflowDetails" - Me.GridWorkflowDetails.Size = New System.Drawing.Size(451, 390) + Me.GridWorkflowDetails.Size = New System.Drawing.Size(281, 390) Me.GridWorkflowDetails.TabIndex = 1 Me.GridWorkflowDetails.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.tvDetails}) ' @@ -273,19 +207,19 @@ Partial Class frmWorkflowOverview Me.LayoutControl1.Name = "LayoutControl1" Me.LayoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = New System.Drawing.Rectangle(1186, 56, 650, 400) Me.LayoutControl1.Root = Me.LayoutControlGroup1 - Me.LayoutControl1.Size = New System.Drawing.Size(451, 166) + Me.LayoutControl1.Size = New System.Drawing.Size(281, 166) Me.LayoutControl1.TabIndex = 0 Me.LayoutControl1.Text = "LayoutControl1" ' 'WindowsUIButtonPanel1 ' - WindowsUIButtonImageOptions3.Image = CType(resources.GetObject("WindowsUIButtonImageOptions3.Image"), System.Drawing.Image) - WindowsUIButtonImageOptions4.Image = CType(resources.GetObject("WindowsUIButtonImageOptions4.Image"), System.Drawing.Image) - Me.WindowsUIButtonPanel1.Buttons.AddRange(New DevExpress.XtraEditors.ButtonPanel.IBaseButton() {New DevExpress.XtraBars.Docking2010.WindowsUIButton("Verlängerung", True, WindowsUIButtonImageOptions3, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, "", -1, True, Nothing, True, False, True, Nothing, -1, False), New DevExpress.XtraBars.Docking2010.WindowsUIButton("Kündigung", True, WindowsUIButtonImageOptions4, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, "", -1, True, Nothing, True, False, True, Nothing, -1, False)}) + WindowsUIButtonImageOptions1.Image = CType(resources.GetObject("WindowsUIButtonImageOptions1.Image"), System.Drawing.Image) + WindowsUIButtonImageOptions2.Image = CType(resources.GetObject("WindowsUIButtonImageOptions2.Image"), System.Drawing.Image) + Me.WindowsUIButtonPanel1.Buttons.AddRange(New DevExpress.XtraEditors.ButtonPanel.IBaseButton() {New DevExpress.XtraBars.Docking2010.WindowsUIButton("Verlängerung", True, WindowsUIButtonImageOptions1, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, "", -1, True, Nothing, True, False, True, Nothing, -1, False), New DevExpress.XtraBars.Docking2010.WindowsUIButton("Kündigung", True, WindowsUIButtonImageOptions2, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, "", -1, True, Nothing, True, False, True, Nothing, -1, False)}) Me.WindowsUIButtonPanel1.ContentAlignment = System.Drawing.ContentAlignment.MiddleLeft Me.WindowsUIButtonPanel1.Location = New System.Drawing.Point(12, 96) Me.WindowsUIButtonPanel1.Name = "WindowsUIButtonPanel1" - Me.WindowsUIButtonPanel1.Size = New System.Drawing.Size(427, 55) + Me.WindowsUIButtonPanel1.Size = New System.Drawing.Size(257, 55) Me.WindowsUIButtonPanel1.TabIndex = 0 Me.WindowsUIButtonPanel1.Text = "WindowsUIButtonPanel1" ' @@ -295,7 +229,7 @@ Partial Class frmWorkflowOverview Me.LayoutControlGroup1.GroupBordersVisible = False Me.LayoutControlGroup1.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.SimpleLabelItem1, Me.LayoutControlItem2, Me.SimpleLabelItem2, Me.SimpleLabelItem3}) Me.LayoutControlGroup1.Name = "Root" - Me.LayoutControlGroup1.Size = New System.Drawing.Size(451, 166) + Me.LayoutControlGroup1.Size = New System.Drawing.Size(281, 166) Me.LayoutControlGroup1.TextVisible = False ' 'SimpleLabelItem1 @@ -307,7 +241,7 @@ Partial Class frmWorkflowOverview Me.SimpleLabelItem1.AppearanceItemCaption.Options.UseForeColor = True Me.SimpleLabelItem1.Location = New System.Drawing.Point(0, 0) Me.SimpleLabelItem1.Name = "SimpleLabelItem1" - Me.SimpleLabelItem1.Size = New System.Drawing.Size(431, 34) + Me.SimpleLabelItem1.Size = New System.Drawing.Size(261, 34) Me.SimpleLabelItem1.Text = "Vertragsnr. 4711" Me.SimpleLabelItem1.TextSize = New System.Drawing.Size(151, 30) ' @@ -316,7 +250,7 @@ Partial Class frmWorkflowOverview Me.LayoutControlItem2.Control = Me.WindowsUIButtonPanel1 Me.LayoutControlItem2.Location = New System.Drawing.Point(0, 84) Me.LayoutControlItem2.Name = "LayoutControlItem2" - Me.LayoutControlItem2.Size = New System.Drawing.Size(431, 62) + Me.LayoutControlItem2.Size = New System.Drawing.Size(261, 62) Me.LayoutControlItem2.TextSize = New System.Drawing.Size(0, 0) Me.LayoutControlItem2.TextVisible = False ' @@ -327,7 +261,7 @@ Partial Class frmWorkflowOverview Me.SimpleLabelItem2.AppearanceItemCaption.Options.UseFont = True Me.SimpleLabelItem2.Location = New System.Drawing.Point(0, 59) Me.SimpleLabelItem2.Name = "SimpleLabelItem2" - Me.SimpleLabelItem2.Size = New System.Drawing.Size(431, 25) + Me.SimpleLabelItem2.Size = New System.Drawing.Size(261, 25) Me.SimpleLabelItem2.Text = "Sunshine GmbH" Me.SimpleLabelItem2.TextSize = New System.Drawing.Size(151, 21) ' @@ -338,17 +272,24 @@ Partial Class frmWorkflowOverview Me.SimpleLabelItem3.AppearanceItemCaption.Options.UseFont = True Me.SimpleLabelItem3.Location = New System.Drawing.Point(0, 34) Me.SimpleLabelItem3.Name = "SimpleLabelItem3" - Me.SimpleLabelItem3.Size = New System.Drawing.Size(431, 25) + Me.SimpleLabelItem3.Size = New System.Drawing.Size(261, 25) Me.SimpleLabelItem3.Text = "Objekt: Haus Nr. 9" Me.SimpleLabelItem3.TextSize = New System.Drawing.Size(151, 21) ' + 'GridOverview1 + ' + Me.GridOverview.Dock = System.Windows.Forms.DockStyle.Fill + Me.GridOverview.Location = New System.Drawing.Point(185, 0) + Me.GridOverview.Name = "GridOverview1" + Me.GridOverview.Size = New System.Drawing.Size(656, 556) + Me.GridOverview.TabIndex = 2 + ' 'frmWorkflowOverview ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(1134, 723) Me.Controls.Add(Me.SplitContainerControl1) - Me.Controls.Add(Me.NavBarControl1) Me.Controls.Add(Me.RibbonStatusBar1) Me.Controls.Add(Me.RibbonControl1) Me.Name = "frmWorkflowOverview" @@ -356,12 +297,8 @@ Partial Class frmWorkflowOverview Me.StatusBar = Me.RibbonStatusBar1 Me.Text = "Workflow Übersicht" CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.NavBarControl1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).EndInit() Me.SplitContainerControl1.ResumeLayout(False) - CType(Me.GridWorkflowOverview, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.gvOverview, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.GridView1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.GridWorkflowDetails, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.tvDetails, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).EndInit() @@ -379,11 +316,6 @@ Partial Class frmWorkflowOverview Friend WithEvents RibbonControl1 As DevExpress.XtraBars.Ribbon.RibbonControl Friend WithEvents RibbonStatusBar1 As DevExpress.XtraBars.Ribbon.RibbonStatusBar Friend WithEvents RibbonPage2 As DevExpress.XtraBars.Ribbon.RibbonPage - Friend WithEvents NavBarControl1 As DevExpress.XtraNavBar.NavBarControl - Friend WithEvents NavBarGroup1 As DevExpress.XtraNavBar.NavBarGroup - Friend WithEvents NavBarItem1 As DevExpress.XtraNavBar.NavBarItem - Friend WithEvents NavBarItem2 As DevExpress.XtraNavBar.NavBarItem - Friend WithEvents NavBarItem3 As DevExpress.XtraNavBar.NavBarItem Friend WithEvents RibbonPageCategory1 As DevExpress.XtraBars.Ribbon.RibbonPageCategory Friend WithEvents RibbonPage3 As DevExpress.XtraBars.Ribbon.RibbonPage Friend WithEvents RibbonPageGroup3 As DevExpress.XtraBars.Ribbon.RibbonPageGroup @@ -400,7 +332,6 @@ Partial Class frmWorkflowOverview Friend WithEvents SimpleLabelItem2 As DevExpress.XtraLayout.SimpleLabelItem Friend WithEvents SimpleLabelItem3 As DevExpress.XtraLayout.SimpleLabelItem Friend WithEvents tvDetails As DevExpress.XtraGrid.Views.Tile.TileView - Friend WithEvents GridWorkflowOverview As DevExpress.XtraGrid.GridControl - Friend WithEvents gvOverview As DevExpress.XtraGrid.Views.Grid.GridView - Friend WithEvents GridView1 As DevExpress.XtraGrid.Views.Grid.GridView + Friend WithEvents NavControlOverview As NavControlOverview + Friend WithEvents GridOverview As GridOverview End Class diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.resx b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.resx index 0913fcab..8a96f180 100644 --- a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.resx +++ b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.resx @@ -202,45 +202,7 @@ W58VxiTarZhsp2KynYrJ9ml1/AZUr3hglRjmdgAAAABJRU5ErkJggg== - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m - dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAsdEVYdFRpdGxlAERvY3VtZW50O01hcDtTY2hlbWU7 - RGlhZ3JhbTtIaWVyYXI7TmV0Tg8qRAAAAHVJREFUOE/NzMENgDAMQ9EuyDoMwBKMwLXHbhf0JUBtYqCo - Fw5PCNdOMrMhMpyWYorvIQRQY/geQgA1hu8hBFBj+B5CADWG7yEEUGP4HkJQyznbQb6j+akGbx4P8D1d - A5e1B+ZttRqFnuz2wJfsJwdGyLCfpR37LNV02NfAHQAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m - dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAWdEVYdFRpdGxlAFByb2R1Y3Q7Qm94O0l0ZW0O9Rpk - AAAAR0lEQVQ4T2P4//8/RRhMvDtS9J8cPIgMoASDCaiJ39DwSyB+DsVvoWLIGKgVjxdA4sgYlxraGUAM - HjWAmgZQgrEKEo//MwAAv2IUTk4dsmsAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m - dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAsdEVYdFRpdGxlAEFkZDtJdGVtO0FkZEl0ZW07QmFy - cztSaWJib247SXRlbTtQbHVzTjLvgQAAAG5JREFUOE/VjNEJgDAMBbOTc7iU5LvzuIyL+GFMpJXX0laD - iHhwNLTNkYg88hyYWTpu8Rxw2cwCPew9hLCUEVdAWcuIK4AqvgDy08A4zYeG/dX5w4BxK5CWWiovBxBY - pKRe54GWxmWgJn5WKwGhHZsDINkhyk7EAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m - dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAPdEVYdFRpdGxlAFNob3c7RXllO0njByUAAAE3SURB - VDhPpZKxSsRQEEXzG5ba+QHCYuMX+Df6AxIIWKQMiGBSprEQLBYbixSRFNkopNDeRgxaCAsmYZzzyJO3 - MeKqAwfe3Ll3svsST0T+xaT4G74Ivu/vKqdRFEkQBAbtH9CYjf1ucFO5SpJEFouFNE0jXdcZOKMxw4N3 - ZYEKe8pLnufairwtW7m+e5TDsxvTu4UHLxltPcLbymtd18ZA+Pj8VvaP5oapwkuGLAvmRVEMIzFPtuHv - FlBkyLJg2bbtIIv52essIEP2xwUu7p24Cy7s5VHjv+DCzJbmDsiyYEt5rqrKDMaXaEFjRuElQ9a+xp0w - DCXLMmNwXyNwtmE86n8io+3Kh7SRpqnEcSxlWZqPp+97A2c09eTKJV6b+1xg0eFMOVHulfcBzmizsX+l - +QuT4vqI9wEq0AjdmqGMVgAAAABJRU5ErkJggg== - - - + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAARdEVYdFRpdGxlAFJlc2V0O1VuZG87E4EW/wAAAYJJ @@ -253,7 +215,7 @@ K9kcZZfSFoz19a7lS5A6K0mdlaTOOsbVD4kgpriFBNvrAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAApdEVYdFRpdGxlAFJlbW92ZTtEZWxldGU7QmFycztS diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb index 5eca8adf..5f05e7ba 100644 --- a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb +++ b/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb @@ -5,45 +5,42 @@ Public Class frmWorkflowOverview Private WorkflowItems As BindingList(Of WorkflowItem) Private WorkflowDetails As BindingList(Of WorkflowDetail) - Private Sub frmWorkflowOverview_Load(sender As Object, e As EventArgs) Handles MyBase.Load - WorkflowItems = New BindingList(Of WorkflowItem) From { - New WorkflowItem() With { - .Title = "Eingangsrechnung XYZ", - .State = WorkflowItem.ItemState.Danger, - .WorkflowName = "Rechnungseingang", - .CreatedAt = DateTime.Now.AddDays(-3) - }, - New WorkflowItem() With { - .Title = "Eingangsrechnung ABC", - .State = WorkflowItem.ItemState.Normal, - .WorkflowName = "Rechnungseingang", - .CreatedAt = DateTime.Now - }, - New WorkflowItem() With { - .Title = "Mietvertrag XYZ läuft aus", - .State = WorkflowItem.ItemState.Warning, - .WorkflowName = "Vertragsprüfung", - .CreatedAt = DateTime.Now.AddDays(-1) - } - } - - WorkflowDetails = New BindingList(Of WorkflowDetail) From { - New WorkflowDetail() With { - .Title = "foooo!" - } - } - - GridWorkflowOverview.DataSource = WorkflowItems - GridWorkflowDetails.DataSource = WorkflowDetails - - gvOverview.GroupFormat = "[#image]{1} {2}" - - With gvOverview.Columns.Item("CreatedAt") - .OptionsFilter.FilterPopupMode = DevExpress.XtraGrid.Columns.FilterPopupMode.DateAlt - .GroupInterval = DevExpress.XtraGrid.ColumnGroupInterval.DateRange - .SortOrder = DevExpress.Data.ColumnSortOrder.Descending - .Group() - End With + Private Async Sub frmWorkflowOverview_Load(sender As Object, e As EventArgs) Handles MyBase.Load + Dim oDatatable As DataTable + Dim oWorkflows As New List(Of WorkflowItem) + Try + oDatatable = Await My.Common.Views.VWIDB_GUI_WF_OVERVIEW(70, 104) + + For Each oRow As DataRow In oDatatable.Rows + oWorkflows.Add(New WorkflowItem() With { + .Title = oRow.Item("REQUEST_TITLE"), + .State = oRow.Item("STATETITLE"), + .Process = oRow.Item("PROCESS_NAME") + }) + Next + Catch ex As Exception + ShowErrorMessage(ex) + End Try + + GridOverview.DataSource = oWorkflows + NavControlOverview.DataSource = oWorkflows + + + + + + 'gvOverview.GroupFormat = "[#image]{1} {2}" + 'With gvOverview.Columns.Item("CreatedAt") + ' .OptionsFilter.FilterPopupMode = DevExpress.XtraGrid.Columns.FilterPopupMode.DateAlt + ' .GroupInterval = DevExpress.XtraGrid.ColumnGroupInterval.DateRange + ' .SortOrder = DevExpress.Data.ColumnSortOrder.Descending + ' .Group() + 'End With + + End Sub + + Private Sub frmWorkflowOverview_Shown(sender As Object, e As EventArgs) Handles Me.Shown + RibbonControl1.SelectPage(RibbonPage3) End Sub End Class \ No newline at end of file diff --git a/Modules.Config/ConfigManager.vb b/Modules.Config/ConfigManager.vb index 27033859..96daa001 100644 --- a/Modules.Config/ConfigManager.vb +++ b/Modules.Config/ConfigManager.vb @@ -124,7 +124,9 @@ Public Class ConfigManager(Of T) Dim oType As Type = GetType(T) Dim oExcludedAttributeTypes = IIf(IsNothing(ExcludedAttributeTypes), New List(Of Type), ExcludedAttributeTypes) Dim oProperties = oType.GetProperties(). - Where(Function(p) p.CanRead And p.CanWrite). + Where(Function(p) + Return p.CanRead And p.CanWrite + End Function). Where(Function(p) For Each oAttributeType As Type In oExcludedAttributeTypes If Attribute.IsDefined(p, oAttributeType) Then From 90cd63c484271c063c221ec22ed04764ef658bc1 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Wed, 3 Jul 2019 12:24:55 +0200 Subject: [PATCH 16/20] Add method to clear internal logs --- Modules.Logging/LogConfig.vb | 16 +++++++++++++--- Modules.Logging/My Project/AssemblyInfo.vb | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Modules.Logging/LogConfig.vb b/Modules.Logging/LogConfig.vb index 13dc0281..c76847f3 100644 --- a/Modules.Logging/LogConfig.vb +++ b/Modules.Logging/LogConfig.vb @@ -111,7 +111,7 @@ Public Class LogConfig Private Const LOG_FORMAT_DEFAULT As String = LOG_FORMAT_BASE & " >> ${message}" Private Const LOG_FORMAT_EXCEPTION As String = LOG_FORMAT_BASE & " >> ${exception:format=Message}${newline}${exception:format=StackTrace}" Private Const LOG_FORMAT_DEBUG As String = LOG_FORMAT_BASE_LONG_DATE & " >> ${message}" - Private Const LOG_FORMAT_MEMORY As String = "${message}${newline}${exception:format=Message}${newline}${exception:format=StackTrace}" + Private Const LOG_FORMAT_MEMORY As String = LOG_FORMAT_BASE_LONG_DATE & " >> ${message}${newline}${exception:format=Message}${newline}${exception:format=StackTrace}" Private Const FOLDER_NAME_LOG = "Log" Private Const FILE_NAME_ACCESS_TEST = "accessTest.txt" @@ -162,13 +162,13 @@ Public Class LogConfig ''' ''' Returns Logs in Memory as List(Of String) if Debug is enabled - ''' Returns nothing if debug is disabled + ''' Returns an empty list if debug is disabled ''' ''' A list of log messages Public ReadOnly Property Logs As List(Of String) Get If Debug = False Then - Return Nothing + Return New List(Of String) End If Dim oTarget = config.FindTargetByName(Of MemoryTarget)(TARGET_MEMORY) @@ -257,6 +257,14 @@ Public Class LogConfig Return LogFactory.GetLogger(Of Logger)(ClassName) End Function + ''' + ''' Clears the internal log + ''' + Public Sub ClearLogs() + Dim oTarget = config.FindTargetByName(Of MemoryTarget)(TARGET_MEMORY) + oTarget?.Logs.Clear() + End Sub + ''' ''' Gets the fully qualified name of the class invoking the calling method, ''' including the namespace but Not the assembly. @@ -432,5 +440,7 @@ Public Class LogConfig Return memoryLog End Function + + #End Region End Class diff --git a/Modules.Logging/My Project/AssemblyInfo.vb b/Modules.Logging/My Project/AssemblyInfo.vb index 89147117..3f292b18 100644 --- a/Modules.Logging/My Project/AssemblyInfo.vb +++ b/Modules.Logging/My Project/AssemblyInfo.vb @@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices ' übernehmen, indem Sie "*" eingeben: ' - + From eacf8e2743ffbaaac4acf1477c015feec4fc41e5 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Thu, 4 Jul 2019 16:09:14 +0200 Subject: [PATCH 17/20] better handling of invalid zugferd files --- Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb | 38 +++++++++++++++++++++---- Jobs/Exceptions.vb | 8 ++++++ Modules.Interfaces/ZUGFeRDInterface.vb | 9 +++--- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb index 1d3250ad..07a9af46 100644 --- a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb +++ b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb @@ -8,6 +8,7 @@ Imports System.Text.RegularExpressions Imports System.Xml Imports DigitalData.Modules.Database Imports DigitalData.Modules.Interfaces +Imports DigitalData.Modules.Interfaces.Exceptions Imports DigitalData.Modules.Jobs.Exceptions Imports DigitalData.Modules.Logging Imports FirebirdSql.Data.FirebirdClient @@ -260,10 +261,23 @@ Public Class ImportZUGFeRDFiles Try oDocument = _zugferd.ExtractZUGFeRDFile(oFile.FullName) - Catch ex As Exception - _logger.Warn("File is not a valid ZUGFeRD document! Skipping.") - oFileAttachmentFiles.Add(oFile) - Continue For + Catch ex As ZUGFeRDExecption + Select Case ex.ErrorType + Case ZUGFeRDInterface.ErrorType.NoZugferd + _logger.Warn("File is not a valid ZUGFeRD document! Skipping.") + oFileAttachmentFiles.Add(oFile) + Continue For + + Case ZUGFeRDInterface.ErrorType.NoValidZugferd + _logger.Warn("File is an Incorrectly formatted ZUGFeRD document!") + Throw New InvalidFerdException() + + Case Else + _logger.Warn("Unexpected Error occurred while extracting ZUGFeRD Information from file {0}", oFile.FullName) + Throw ex + End Select + + End Try oMD5CheckSum = CreateMD5(oFile.FullName) @@ -482,6 +496,20 @@ Public Class ImportZUGFeRDFiles Dim oBody = "

The invoice attached to your email has already been processed in our system.

" Dim oEmailData = MoveAndRenameEmailToRejected(args, oFileGroupId) AddToEmailQueue(oFileGroupId, oBody, oEmailData) + + Catch ex As InvalidFerdException + _logger.Error(ex) + + oMoveDirectory = args.ErrorDirectory + + Dim oBody = """ +

Your email contained a ZUGFeRD document but it was incorrectly formatted.

+

Possible reasons include:

    +
  • Amount value has incorrect format (25,01 instead of 25.01)
  • +

+ """ + Dim oEmailData = MoveAndRenameEmailToRejected(args, oFileGroupId) + AddToEmailQueue(oFileGroupId, oBody, oEmailData) Catch ex As TooMuchFerdsException _logger.Error(ex) @@ -549,7 +577,7 @@ Public Class ImportZUGFeRDFiles End If End If - _filesystem.MoveTo(oFile.FullName, oFinalMoveDirectory) + _filesystem.MoveTo(oFile.FullName, oFinalMoveDirectory) _logger.Info("Finished processing file {0}", oFile.Name) _logger.Info("File moved to {0}", oFinalMoveDirectory) Next diff --git a/Jobs/Exceptions.vb b/Jobs/Exceptions.vb index f73d2d47..d8be37c0 100644 --- a/Jobs/Exceptions.vb +++ b/Jobs/Exceptions.vb @@ -21,6 +21,14 @@ Public Class Exceptions End Sub End Class + Public Class InvalidFerdException + Inherits ApplicationException + + Public Sub New() + MyBase.New("ZUGFeRD document found but was not formatted correctly") + End Sub + End Class + Public Class NoFerdsException Inherits ApplicationException diff --git a/Modules.Interfaces/ZUGFeRDInterface.vb b/Modules.Interfaces/ZUGFeRDInterface.vb index 3f2cf8e0..e8b43eff 100644 --- a/Modules.Interfaces/ZUGFeRDInterface.vb +++ b/Modules.Interfaces/ZUGFeRDInterface.vb @@ -14,7 +14,8 @@ Public Class ZUGFeRDInterface Public Enum ErrorType NoValidFile - ExtractionFailed + NoZugferd + NoValidZugferd End Enum Public Sub New(LogConfig As LogConfig) @@ -33,7 +34,7 @@ Public Class ZUGFeRDInterface Dim oXmlDocument = ValidateZUGFeRDFile(Path) If IsNothing(oXmlDocument) Then - Throw New ZUGFeRDExecption(ErrorType.ExtractionFailed, "Datei ist kein gültiges ZUGFeRD Format.") + Throw New ZUGFeRDExecption(ErrorType.NoZugferd, "Datei ist keine ZUGFeRD Datei.") End If Return SerializeZUGFeRDDocument(oXmlDocument) @@ -70,7 +71,7 @@ Public Class ZUGFeRDInterface If Not oProcessOutput.ToLower.Contains(ZUGFERD_CONVERTER_SUCCESS_MESSAGE.ToLower) Then _logger.Warn("File {0} is not a valid ZUGFeRD File!", Path) - Throw New ZUGFeRDExecption(ErrorType.NoValidFile, "Datei ist kein gültiges ZUGFeRD Format.") + Throw New ZUGFeRDExecption(ErrorType.NoZugferd, "Datei ist keine ZUGFeRD Datei.") End If Try @@ -93,7 +94,7 @@ Public Class ZUGFeRDInterface Return oSerializer.Deserialize(oReader) Catch ex As Exception _logger.Error(ex) - Throw ex + Throw New ZUGFeRDExecption(ErrorType.NoValidZugferd, "Datei ist eine ungültige ZUGFeRD Datei.") End Try End Function End Class From 11f092e577f3b6c400c49de0f00c0bd948d7fefb Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Thu, 4 Jul 2019 16:09:34 +0200 Subject: [PATCH 18/20] rename Workflow to ModuleWorkflow --- GUIs.ClientSuite/ClientSuite.vbproj | 29 ++++++++++--------- .../GridOverview.Designer.vb | 0 .../GridOverview.resx | 0 .../GridOverview.vb | 0 .../NavControlOverview.Designer.vb | 0 .../NavControlOverview.resx | 0 .../NavControlOverview.vb | 0 .../WorkflowDetail.vb | 0 .../WorkflowItem.vb | 23 ++++++++++----- .../frmWorkflowOverview.Designer.vb | 0 .../frmWorkflowOverview.resx | 0 .../frmWorkflowOverview.vb | 7 ++++- .../frmWorkflowStep.Designer.vb | 0 .../frmWorkflowStep.resx | 0 .../frmWorkflowStep.vb | 0 15 files changed, 36 insertions(+), 23 deletions(-) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/GridOverview.Designer.vb (100%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/GridOverview.resx (100%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/GridOverview.vb (100%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/NavControlOverview.Designer.vb (100%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/NavControlOverview.resx (100%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/NavControlOverview.vb (100%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/WorkflowDetail.vb (100%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/WorkflowItem.vb (53%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/frmWorkflowOverview.Designer.vb (100%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/frmWorkflowOverview.resx (100%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/frmWorkflowOverview.vb (86%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/frmWorkflowStep.Designer.vb (100%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/frmWorkflowStep.resx (100%) rename GUIs.ClientSuite/{Workflow => ModuleWorkflow}/frmWorkflowStep.vb (100%) diff --git a/GUIs.ClientSuite/ClientSuite.vbproj b/GUIs.ClientSuite/ClientSuite.vbproj index 1f8f53dd..4232a45d 100644 --- a/GUIs.ClientSuite/ClientSuite.vbproj +++ b/GUIs.ClientSuite/ClientSuite.vbproj @@ -170,16 +170,16 @@ Form - + frmWorkflowOverview.vb - + Form - + frmWorkflowStep.vb - + Form @@ -205,20 +205,20 @@ - + GridOverview.vb - + UserControl - + NavControlOverview.vb - + UserControl - - + + DockManagerTest.vb @@ -352,10 +352,10 @@ frmFormDesigner.vb - + frmWorkflowOverview.vb - + frmWorkflowStep.vb @@ -364,10 +364,10 @@ DocumentPanel.vb - + GridOverview.vb - + NavControlOverview.vb @@ -522,6 +522,7 @@ + diff --git a/GUIs.ClientSuite/Workflow/GridOverview.Designer.vb b/GUIs.ClientSuite/ModuleWorkflow/GridOverview.Designer.vb similarity index 100% rename from GUIs.ClientSuite/Workflow/GridOverview.Designer.vb rename to GUIs.ClientSuite/ModuleWorkflow/GridOverview.Designer.vb diff --git a/GUIs.ClientSuite/Workflow/GridOverview.resx b/GUIs.ClientSuite/ModuleWorkflow/GridOverview.resx similarity index 100% rename from GUIs.ClientSuite/Workflow/GridOverview.resx rename to GUIs.ClientSuite/ModuleWorkflow/GridOverview.resx diff --git a/GUIs.ClientSuite/Workflow/GridOverview.vb b/GUIs.ClientSuite/ModuleWorkflow/GridOverview.vb similarity index 100% rename from GUIs.ClientSuite/Workflow/GridOverview.vb rename to GUIs.ClientSuite/ModuleWorkflow/GridOverview.vb diff --git a/GUIs.ClientSuite/Workflow/NavControlOverview.Designer.vb b/GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.Designer.vb similarity index 100% rename from GUIs.ClientSuite/Workflow/NavControlOverview.Designer.vb rename to GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.Designer.vb diff --git a/GUIs.ClientSuite/Workflow/NavControlOverview.resx b/GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.resx similarity index 100% rename from GUIs.ClientSuite/Workflow/NavControlOverview.resx rename to GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.resx diff --git a/GUIs.ClientSuite/Workflow/NavControlOverview.vb b/GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.vb similarity index 100% rename from GUIs.ClientSuite/Workflow/NavControlOverview.vb rename to GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.vb diff --git a/GUIs.ClientSuite/Workflow/WorkflowDetail.vb b/GUIs.ClientSuite/ModuleWorkflow/WorkflowDetail.vb similarity index 100% rename from GUIs.ClientSuite/Workflow/WorkflowDetail.vb rename to GUIs.ClientSuite/ModuleWorkflow/WorkflowDetail.vb diff --git a/GUIs.ClientSuite/Workflow/WorkflowItem.vb b/GUIs.ClientSuite/ModuleWorkflow/WorkflowItem.vb similarity index 53% rename from GUIs.ClientSuite/Workflow/WorkflowItem.vb rename to GUIs.ClientSuite/ModuleWorkflow/WorkflowItem.vb index 250e874f..5b34c9b2 100644 --- a/GUIs.ClientSuite/Workflow/WorkflowItem.vb +++ b/GUIs.ClientSuite/ModuleWorkflow/WorkflowItem.vb @@ -12,6 +12,7 @@ Public Class WorkflowItem Public Property CreatedAt As DateTime Public Property Process As String + Public Property IconMap As Dictionary(Of String, String) Public Property StateImage As Image Public Property State As String Get @@ -19,14 +20,20 @@ Public Class WorkflowItem End Get Set(value As String) _state = value - Select Case value - Case "Start" - StateImage = My.Resources. - Case "Not started" - StateImage = My.Resources.ampel_gelb - Case Else - StateImage = Nothing - End Select + StateImage = GetIcon(value, IconMap) End Set End Property + + Public Sub New(IconMap As Dictionary(Of String, String)) + Me.IconMap = IconMap + End Sub + + Private Function GetIcon(StateName As String, IconMap As Dictionary(Of String, String)) As Image + If IconMap.ContainsKey(StateName) Then + Dim IconName = IconMap.Item(StateName) + Return My.Resources.ResourceManager.GetObject(IconName) + Else + Return Nothing + End If + End Function End Class diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.Designer.vb similarity index 100% rename from GUIs.ClientSuite/Workflow/frmWorkflowOverview.Designer.vb rename to GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.Designer.vb diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.resx b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.resx similarity index 100% rename from GUIs.ClientSuite/Workflow/frmWorkflowOverview.resx rename to GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.resx diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.vb similarity index 86% rename from GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb rename to GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.vb index 5f05e7ba..e23d0981 100644 --- a/GUIs.ClientSuite/Workflow/frmWorkflowOverview.vb +++ b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.vb @@ -9,11 +9,16 @@ Public Class frmWorkflowOverview Dim oDatatable As DataTable Dim oWorkflows As New List(Of WorkflowItem) + Dim oIconMap As New Dictionary(Of String, String) From { + {"Start", "ampel_gruen"}, + {"not started", "ampel_rot"} + } + Try oDatatable = Await My.Common.Views.VWIDB_GUI_WF_OVERVIEW(70, 104) For Each oRow As DataRow In oDatatable.Rows - oWorkflows.Add(New WorkflowItem() With { + oWorkflows.Add(New WorkflowItem(oIconMap) With { .Title = oRow.Item("REQUEST_TITLE"), .State = oRow.Item("STATETITLE"), .Process = oRow.Item("PROCESS_NAME") diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowStep.Designer.vb b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.Designer.vb similarity index 100% rename from GUIs.ClientSuite/Workflow/frmWorkflowStep.Designer.vb rename to GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.Designer.vb diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowStep.resx b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.resx similarity index 100% rename from GUIs.ClientSuite/Workflow/frmWorkflowStep.resx rename to GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.resx diff --git a/GUIs.ClientSuite/Workflow/frmWorkflowStep.vb b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.vb similarity index 100% rename from GUIs.ClientSuite/Workflow/frmWorkflowStep.vb rename to GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.vb From 0148ba84c51a2d6a811070a35d8dad6c177da327 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Thu, 4 Jul 2019 16:10:08 +0200 Subject: [PATCH 19/20] fix log folder path --- GUIs.ClientSuite/ApplicationEvents.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUIs.ClientSuite/ApplicationEvents.vb b/GUIs.ClientSuite/ApplicationEvents.vb index f970a639..e3e9c513 100644 --- a/GUIs.ClientSuite/ApplicationEvents.vb +++ b/GUIs.ClientSuite/ApplicationEvents.vb @@ -17,7 +17,7 @@ Namespace My Private _BaseMachineConfigPath As String = Windows.Forms.Application.CommonAppDataPath Public Sub App_Startup() Handles Me.Startup - Dim oLogConfig As New LogConfig(PathType.CustomPath, IO.Path.Combine(_BaseLocalUserConfigPath, "Log")) + Dim oLogConfig As New LogConfig(PathType.AppData) ' System Config files like Service Url will be saved in %LocalAppdata% so they will remain on the machine Dim oSystemConfigManager As New ConfigManager(Of ClassConfig)(oLogConfig, From 0ab3acddb44ae7ad04eed29c79c601aa22403b9b Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Thu, 4 Jul 2019 16:10:22 +0200 Subject: [PATCH 20/20] add button for clearing logs --- GUIs.Test.TestGUI/Form1.Designer.vb | 12 ++++++++++++ GUIs.Test.TestGUI/Form1.vb | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/GUIs.Test.TestGUI/Form1.Designer.vb b/GUIs.Test.TestGUI/Form1.Designer.vb index 579d5dc9..6ac95de9 100644 --- a/GUIs.Test.TestGUI/Form1.Designer.vb +++ b/GUIs.Test.TestGUI/Form1.Designer.vb @@ -45,6 +45,7 @@ Partial Class Form1 Me.Button4 = New System.Windows.Forms.Button() Me.Button6 = New System.Windows.Forms.Button() Me.ListBox1 = New System.Windows.Forms.ListBox() + Me.Button7 = New System.Windows.Forms.Button() CType(Me.GridControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.GridView1, System.ComponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() @@ -247,11 +248,21 @@ Partial Class Form1 Me.ListBox1.Size = New System.Drawing.Size(355, 303) Me.ListBox1.TabIndex = 24 ' + 'Button7 + ' + Me.Button7.Location = New System.Drawing.Point(764, 143) + Me.Button7.Name = "Button7" + Me.Button7.Size = New System.Drawing.Size(75, 23) + Me.Button7.TabIndex = 25 + Me.Button7.Text = "Clear Logs" + Me.Button7.UseVisualStyleBackColor = True + ' 'Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(1050, 487) + Me.Controls.Add(Me.Button7) Me.Controls.Add(Me.ListBox1) Me.Controls.Add(Me.Button6) Me.Controls.Add(Me.Button4) @@ -307,4 +318,5 @@ Partial Class Form1 Friend WithEvents Button4 As Button Friend WithEvents Button6 As Button Friend WithEvents ListBox1 As ListBox + Friend WithEvents Button7 As Button End Class diff --git a/GUIs.Test.TestGUI/Form1.vb b/GUIs.Test.TestGUI/Form1.vb index 532f188c..dcde0760 100644 --- a/GUIs.Test.TestGUI/Form1.vb +++ b/GUIs.Test.TestGUI/Form1.vb @@ -178,4 +178,13 @@ Public Class Form1 ListBox1.Items.Add(oLog) Next End Sub + + Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click + MyLogger.ClearLogs() + + ListBox1.Items.Clear() + For Each oLog In MyLogger.Logs + ListBox1.Items.Add(oLog) + Next + End Sub End Class