ZooFlow: Administration

This commit is contained in:
Jonathan Jenne
2021-04-29 16:09:49 +02:00
parent cbd861fc89
commit 47893a44c6
16 changed files with 3940 additions and 338 deletions

View File

@@ -1,15 +1,37 @@
Imports System.ComponentModel
Imports DevExpress.XtraEditors
Imports DevExpress.XtraEditors.Controls
Imports DevExpress.XtraLayout
Imports DevExpress.XtraTab
Imports DigitalData.Modules.Language.Utils
Imports DigitalData.Modules.Logging
''' <summary>
'''
''' </summary>
Public Class ClassDetailPages
Private ReadOnly LogConfig As LogConfig
Private ReadOnly Logger As Logger
Private ReadOnly HostForm As IAdminForm
Public Items As New Dictionary(Of String, DetailPage)
Public CurrentPage As DetailPage
Public Event AnyControl_Focus As EventHandler(Of DetailPageEventArgs)
Public Event AnyControl_Changed As EventHandler(Of DetailPageEventArgs)
Public Event CurrentPage_Changed As EventHandler(Of DetailPageEventArgs)
Private CurrentPage As DetailPage
Public Property Current As DetailPage
Get
Return CurrentPage
End Get
Set(value As DetailPage)
CurrentPage = value
RaiseEvent CurrentPage_Changed(Me, New DetailPageEventArgs With {.Page = CurrentPage})
End Set
End Property
Public Class DetailPageEventArgs
Public Property Page As DetailPage
@@ -17,6 +39,7 @@ Public Class ClassDetailPages
Public Class DetailPage
Public IsPrimary As Boolean = False
Public IsInsert As Boolean = False
Public TabPage As XtraTabPage
Public Name As String
Public BindingSource As BindingSource
@@ -25,7 +48,32 @@ Public Class ClassDetailPages
Public ChangedWhoEdit As TextEdit
End Class
Public Sub New(LayoutControls As List(Of LayoutControl))
''' <summary>
''' Detail page which represents the primary page of a form
''' </summary>
Public Class PrimaryPage
Inherits DetailPage
Public Sub New(Insert As Boolean)
IsInsert = Insert
IsPrimary = True
End Sub
End Class
Public Class ComboBoxItem
Public Property Text
Public Property Value
Public Overrides Function ToString() As String
Return Text
End Function
End Class
Public Sub New(LogConfig As LogConfig, Form As IAdminForm, LayoutControls As List(Of LayoutControl))
Me.LogConfig = LogConfig
Logger = LogConfig.GetLogger()
HostForm = Form
For Each oLayoutControl In LayoutControls
AddHandler oLayoutControl.Click, AddressOf Handle_Focus
AddHandler oLayoutControl.GotFocus, AddressOf Handle_Focus
@@ -39,21 +87,110 @@ Public Class ClassDetailPages
Next
End Sub
''' <summary>
''' Add a new DetailPage or a new PrimaryPage
''' </summary>
Public Sub Add(Page As DetailPage)
Items.Add(Page.TabPage.Name, Page)
AddHandler Page.BindingSource.AddingNew, Sub(sender As Object, e As EventArgs)
Page.AddedWhoEdit.EditValue = Environment.UserName
End Sub
End Sub
''' <summary>
''' Add a list of new DetailPages or new PrimaryPages
''' </summary>
Public Sub AddRange(ParamArray Pages As DetailPage())
For Each oPage In Pages
Add(oPage)
Next
End Sub
Private Sub Handle_Validating(sender As Object, e As CancelEventArgs)
Dim oControl As BaseEdit = sender
Dim oBinding As Binding = oControl.DataBindings.Item("EditValue")
''' <summary>
''' Get the DetailPage which uses the given `TabPage`
''' </summary>
Public Function GetDetailPage(TabPage As XtraTabPage) As DetailPage
Try
Dim oItem = Items.
Where(Function(Item) TabPage.Equals(Item.Value.TabPage)).
FirstOrDefault()
If TypeOf oBinding.DataSource Is BindingSource Then
Return oItem.Value
Catch ex As Exception
Return Nothing
End Try
End Function
''' <summary>
''' Saves the pending changes to the binding source
''' </summary>
''' <returns>True, if changes were made, otherwise False</returns>
Public Function PrepareSave() As Boolean
Dim oPage = CurrentPage
If oPage Is Nothing Then
Return False
End If
Try
oPage.BindingSource.EndEdit()
If oPage.DataTable.GetChanges() IsNot Nothing Then
If oPage.IsInsert Then
oPage.AddedWhoEdit.EditValue = My.Application.User.UserName
Else
oPage.ChangedWhoEdit.EditValue = My.Application.User.UserName
End If
oPage.BindingSource.EndEdit()
Return True
Else
Return False
End If
Catch ex As Exception
Logger.Error(ex)
Return False
End Try
End Function
Private Sub Handle_Validating(sender As Object, e As BaseEditValidatingEventArgs)
Dim oControl As BaseEdit = sender
Dim oColumn As DataColumn = Get_DataColumnFromBaseEdit(oControl)
If oColumn IsNot Nothing Then
Dim oNullable As Boolean = oColumn.AllowDBNull
If oNullable = False Then
If TypeOf oControl Is ComboBoxEdit AndAlso DirectCast(oControl, ComboBoxEdit).SelectedIndex = -1 Then
e.ErrorText = "Please select a value from the list."
e.Cancel = True
ElseIf NotNull(oControl.EditValue.ToString, String.Empty) = String.Empty Then
e.ErrorText = "Please input a value"
e.Cancel = True
End If
End If
End If
End Sub
Private Function Get_DataColumnFromBaseEdit(Control As BaseEdit) As DataColumn
Dim oBinding As Binding = Control.DataBindings.Item("EditValue")
If Control.DataBindings.Count = 0 OrElse oBinding Is Nothing Then
Return Nothing
End If
If oBinding.DataSource Is Nothing Then
Return Nothing
End If
If TypeOf oBinding.DataSource IsNot BindingSource Then
Return Nothing
End If
Try
Dim oSource As BindingSource = oBinding.DataSource
Dim oTableName As String = oSource.DataMember
Dim oDataSet As DataSet = oSource.DataSource
@@ -61,15 +198,12 @@ Public Class ClassDetailPages
Dim oColumnName As String = oBinding.BindingMemberInfo.BindingField
Dim oColumn As DataColumn = oTable.Columns.Item(oColumnName)
Dim oNullable As Boolean = oColumn.AllowDBNull
If oNullable = False And NotNull(oControl.EditValue.ToString, String.Empty) = String.Empty Then
Throw New NoNullAllowedException()
End If
End If
Console.WriteLine()
End Sub
Return oColumn
Catch ex As Exception
Logger.Error(ex)
Return Nothing
End Try
End Function
Private Sub Handle_Focus(sender As Control, e As EventArgs)
Dim oControl As Control = sender
@@ -86,22 +220,20 @@ Public Class ClassDetailPages
Exit Sub
End If
' Get the TabPage containing the Layout Control
Do_Handle_Focus(oLayoutControl, oControl)
End Sub
Private Sub Do_Handle_Focus(LayoutControl As LayoutControl, Control As Control)
If TypeOf LayoutControl.Parent Is XtraTabPage Then
Dim oTabPage As XtraTabPage = LayoutControl.Parent
If TypeOf oLayoutControl.Parent Is XtraTabPage Then
Dim oTabPage As XtraTabPage = oLayoutControl.Parent
If Items.ContainsKey(oTabPage.Name) Then
CurrentPage = Items.Item(oTabPage.Name)
Dim oData As New DetailPageEventArgs With {.Page = Items.Item(oTabPage.Name)}
RaiseEvent AnyControl_Focus(Control, oData)
RaiseEvent CurrentPage_Changed(Me, oData)
RaiseEvent AnyControl_Focus(oControl, oData)
Else
CurrentPage = Nothing
RaiseEvent AnyControl_Focus(Control, Nothing)
RaiseEvent CurrentPage_Changed(Me, Nothing)
RaiseEvent AnyControl_Focus(oControl, Nothing)
End If
End If
End Sub