200321PX Moved MV member list outside the tab area, removed second invitation tab, some small optimizations

This commit is contained in:
phantomix 2021-03-22 01:35:49 +01:00
parent bcfcfa5750
commit 72f4b879e1
6 changed files with 114 additions and 183 deletions

View File

@ -10,14 +10,6 @@ namespace dezentrale.core
//! \short Data provider for the MV invitation process
public interface IMvInvitationData
{
string InviteHeadline { get; }
string InviteBody { get; }
DateTime EventDate { get; }
/*List<Member> MemberList { get; set; }
string DataTemplate { get; set; }
IntermediateFormat DataFormat { get; set; }
@ -62,6 +54,15 @@ namespace dezentrale.core
protected override bool Run()
{
uint step = 0;
FormMail fm = new FormMail()
{
To = "{EMailName} <{EMail}>",
Subject = mv.InviteHeadline,
Body = mv.InviteBody,
};
fm = fm.ReplaceReflect(mv);
foreach (MvInvitedMember m in memberList)
{
step++;
@ -70,28 +71,29 @@ namespace dezentrale.core
LogTarget.LogLine($"Processing member {m.Member.NumberString} - {m.Member.Nickname}...", LogEvent.ELogLevel.Info, "MvInvitationProcess");
LogTarget.StepStarted(step, $"Sending mail for member {m.Member.Nickname}");
m.StartLogEvent("MvInvitationProcess", LogEvent.eEventType.EMail, Program.config.LocalUser);
m.MvAuthenticationCode = RandomString(10);
m.Member.StartLogEvent("MvInvitationProcess", LogEvent.eEventType.EMail, Program.config.LocalUser);
m.AuthCode = RandomString(10);
m.MvEventDate = data.EventDate;
FormMail fm = new FormMail()
{
To = $"{m.EMailName} <{m.EMail}>",
Subject = data.InviteHeadline,
Body = data.InviteBody,
};
m.CurrentLog.SubEvents.Add(fm.Send(m));
m.MvDateInvited = DateTime.Now;
m.SaveToFile();
LogTarget.StepCompleted(step, $"Done with member {m.Nickname}", true);
m.Member.CurrentLog.SubEvents.Add(fm.Send(m.Member));
m.Member.SaveToFile();
m.InvitationDate = DateTime.Now;
m.Invited = true;
LogTarget.StepCompleted(step, $"Done with member {m.Member.Nickname}", true);
if (mv.Status == Mv.MvStatus.InPreparation)
mv.Status = Mv.MvStatus.InvitationSent;
}
catch (Exception ex)
{
LogTarget.LogLine($"Error while processing member {m.Nickname}: {ex.Message}", LogEvent.ELogLevel.Error, "MvInvitationProcess");
LogTarget.StepCompleted(step, $"Error while processing member {m.Nickname}", false);
LogTarget.LogLine($"Error while processing member {m.Member.Nickname}: {ex.Message}", LogEvent.ELogLevel.Error, "MvInvitationProcess");
LogTarget.StepCompleted(step, $"Error while processing member {m.Member.Nickname}", false);
break;
}
}
LogTarget.LogLine($"Done.", LogEvent.ELogLevel.Info, "MvInvitationProcess");
return true;
}
}

View File

@ -13,8 +13,9 @@ namespace dezentrale.model
[XmlAttribute] public string AuthCode { get; set; } = "";
[XmlAttribute] public bool AttendedMv { get; set; } = false;
[XmlIgnore] public string NumberString { get { return $"{MemberNumber:D3}"; } }
[XmlIgnore] public string InvitedString { get { return Invited ? "Yes" : "No"; } }
[XmlIgnore] public string NumberString { get { return $"{MemberNumber:D3}"; } }
[XmlIgnore] public string InvitedString { get { return Invited ? "Yes" : "No"; } }
[XmlIgnore] public string AttendedString { get { return AttendedMv ? "Yes" : "No"; } }
private Member member = null;
[XmlIgnore] public Member Member

View File

@ -28,19 +28,21 @@ namespace dezentrale.model
protected void LogPropertyChange(string propertyName, object oldValue, object newValue)
{
if (XmlLog.SuppressAllLogging || SuppressLogging) return;
if (CurrentLog == null)
{
CurrentLog = StartLogEvent($"DataChange, starting with {propertyName}", LogEvent.eEventType.DataChange);
}
string ov = oldValue.ToString();
string nv = newValue.ToString();
if (!ov.Equals(nv))
{
if (CurrentLog == null)
{
CurrentLog = StartLogEvent($"DataChange, starting with {propertyName}", LogEvent.eEventType.DataChange);
}
CurrentLog.SubEvents.Add(new LogSubEvent()
{
Topic = $"{propertyName} changes from \"{oldValue.ToString()}\" to \"{newValue.ToString()}\"",
Type = LogEvent.eEventType.DataChange,
});
}
}
public void FinishLogEvent()
{

View File

@ -23,7 +23,7 @@ namespace dezentrale.view
new ConfigLVDataHandler()
{
Name = "date",
Display = "Date",
Display = "EventDate",
Width = 160,
CustomToString = ( x => (((Mv)x).EventDate.ToString()) ),
},

View File

@ -31,12 +31,19 @@ namespace dezentrale.view
},
new ConfigLVDataHandler()
{
Name = "invited",
Name = "inv",
Display = "Invited",
Width = 48, TextAlign = HorizontalAlignment.Right,
Width = 32, TextAlign = HorizontalAlignment.Right,
CustomToString = ( x => ((MvInvitedMember)x).InvitedString),
},
new ConfigLVDataHandler()
{
Name = "att",
Display = "Invited",
Width = 32, TextAlign = HorizontalAlignment.Right,
CustomToString = ( x => ((MvInvitedMember)x).AttendedString),
},
new ConfigLVDataHandler()
{
Name = "date",
Display = "Date",

View File

@ -31,9 +31,8 @@ namespace dezentrale.view
//Subject
private TextBox tbInviteHeadline;
private TextBox tbInviteBody;
private TabPage tabMemberInvitation;
//List with all members and invited yes|no
private LvMvInvitations lvMvInvitations;
private LvMvInvitations lvMvInvitations;
//Option to invite selected|all members
private TabPage tabRunningMv;
//List with invited members with authenticated status
@ -41,9 +40,6 @@ namespace dezentrale.view
//textbox to hold an external MV protocol URL and/or
//[rich] textbox for MV protocol
//Button to finish MV
private TextBox tbPreviewHeadline;
private TextBox tbPreviewBody;
private TabPage tabLog;
@ -60,13 +56,10 @@ namespace dezentrale.view
TabPage selectedTab = tabControl.SelectedTab;
if(selectedTab == tabInvitationSettings)
{
} else if(selectedTab == tabMemberInvitation)
{
Button
btn = AddButton("Invite selected", btnInviteSelected_Click);
btn = AddButton("Invite all", btnInviteAll_Click);
btn.Enabled = (this.mv.Status == Mv.MvStatus.InPreparation || this.mv.Status == Mv.MvStatus.InvitationSent);
bool enabled = (mv.Status == Mv.MvStatus.InPreparation || mv.Status == Mv.MvStatus.InvitationSent);
Button btn;
btn = AddButton("Invite selected", btnInviteSelected_Click); btn.Enabled = enabled;
btn = AddButton("Invite all", btnInviteAll_Click); btn.Enabled = enabled;
} else if(selectedTab == tabRunningMv)
{
@ -98,7 +91,9 @@ namespace dezentrale.view
private void DoInvitation(List<MvInvitedMember> mvMembers)
{
if(mvMembers == null || mvMembers.Count < 1)
UpdateMvData();
if (mvMembers == null || mvMembers.Count < 1)
{
MessageBox.Show("No members to invite!");
return;
@ -144,10 +139,16 @@ namespace dezentrale.view
foreach (MvInvitedMember mvi in subList) inv.Remove(mvi);
}
if(inv.Count < 1)
{
MessageBox.Show("There are no members to invite.");
return;
}
//Spawn invitation process window and run process
MvInvitationProcess invProcess = new MvInvitationProcess(this.mv, inv);
MvInvitationProcess invProcess = new MvInvitationProcess(mv, inv);
frmProcessWithLog frmInvProcess = new frmProcessWithLog(invProcess, true);
frmInvProcess.ShowDialog();
UpdateGui();
}
private void btnInviteSelected_Click(object sender, EventArgs e)
{
@ -155,34 +156,21 @@ namespace dezentrale.view
}
private void btnInviteAll_Click(object sender, EventArgs e)
{
DoInvitation(this.mv.Members);
DoInvitation(mv.Members);
}
private void RefreshPreview()
private void UpdateMvData()
{
Console.WriteLine("frmMv.RefreshPreview()");
FormMail fm = mv.GetInvitationMail();
tbPreviewHeadline.Text = fm.Subject;
tbPreviewBody.Text = fm.Body;
//Console.WriteLine(mv.InviteHeadline);
//Console.WriteLine(mv.InviteBody);
}
private bool programmaticChange = true;
private void InvitationDataChanged(object sender, EventArgs e)
{
Console.WriteLine($"frmMv.InvitationDataChanged(): programmatic = {programmaticChange}");
if (programmaticChange) return;
DateTime dt = new DateTime( mvDate.Value.Year, mvDate.Value.Month, mvDate.Value.Day,
mvTime.Value.Hour, mvTime.Value.Minute, mvTime.Value.Second);
if (sender == mvDate || sender == mvTime)
mv.EventDate = new DateTime( mvDate.Value.Year, mvDate.Value.Month, mvDate.Value.Day,
mvTime.Value.Hour, mvTime.Value.Minute, mvTime.Value.Second);
else if (sender == tbPlace) mv.Place = tbPlace.Text;
else if (sender == tbMvAgenda) mv.Agenda = tbMvAgenda.Text;
else if (sender == tbInviteHeadline) mv.InviteHeadline = tbInviteHeadline.Text;
else if (sender == tbInviteBody) mv.InviteBody = tbInviteBody.Text;
RefreshPreview();
mv.EventDate = dt;
mv.Place = tbPlace.Text;
mv.Agenda = tbMvAgenda.Text;
mv.InviteHeadline = tbInviteHeadline.Text;
mv.InviteBody = tbInviteBody.Text;
}
private void BuildPageInvitationSettings(Control parent)
@ -209,9 +197,6 @@ namespace dezentrale.view
Format = DateTimePickerFormat.Time,
});
mvDate.ValueChanged += InvitationDataChanged;
mvTime.ValueChanged += InvitationDataChanged;
parent.Controls.Add(new Label()
{
Text = "Place:",
@ -225,7 +210,6 @@ namespace dezentrale.view
Width = 580,
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right
});
tbPlace.TextChanged += InvitationDataChanged;
parent.Controls.Add(new Label()
{
@ -243,7 +227,6 @@ namespace dezentrale.view
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right
});
tbMvAgenda.TextChanged += InvitationDataChanged;
parent.Controls.Add(new Label()
{
@ -258,7 +241,6 @@ namespace dezentrale.view
Width = 580,
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right
});
tbInviteHeadline.TextChanged += InvitationDataChanged;
parent.Controls.Add(new Label()
{
@ -276,82 +258,12 @@ namespace dezentrale.view
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right
});
tbInviteBody.TextChanged += InvitationDataChanged;
}
private void BuildPageMemberInvitation(Control parent)
{
SplitContainer split = new SplitContainer()
{
Dock = DockStyle.Fill,
};
parent.Controls.Add(split);
GroupBox grpInvitations = new GroupBox()
{
Dock = DockStyle.Fill,
Text = "Invitations",
Width = 500,
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
};
split.Panel1.Controls.Add(grpInvitations);
grpInvitations.Controls.Add(lvMvInvitations = new LvMvInvitations()
{
Dock = DockStyle.Fill,
});
GroupBox grpPreview = new GroupBox()
{
Dock = DockStyle.Fill,
Text = "Invitation mail preview",
Width = 500,
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
};
split.Panel2.Controls.Add(grpPreview);
grpInvitations.Controls.Add(null);
grpPreview.Controls.Add(new Label()
{
Text = "Subject:",
Location = new Point(lm, 1 * line + tm + labelOffs),
Size = new Size(110, labelHeight),
TextAlign = ContentAlignment.BottomRight,
});
grpPreview.Controls.Add(tbPreviewHeadline = new TextBox()
{
Location = new Point(lm + 113, 1 * line + tm),
Width = 340,
ReadOnly = true,
BackColor = Color.LightGray,
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right
});
/*grpPreview.Controls.Add(new Label()
{
Text = "Body:",
Location = new Point(lm, 2 * line + tm + labelOffs),
Size = new Size(110, labelHeight),
TextAlign = ContentAlignment.BottomRight,
});*/
grpPreview.Controls.Add(tbPreviewBody = new TextBox()
{
Location = new Point(8, 2 * line + tm),
Size = new Size(452, 440),
Multiline = true,
ScrollBars = ScrollBars.Both,
ReadOnly = true,
BackColor = Color.LightGray,
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right
});
}
private void BuildPageRunningMv(Control parent)
{
//input field to add auth codes
}
private void BuildLog(Control parent)
@ -369,10 +281,30 @@ namespace dezentrale.view
int h = parent.ClientSize.Height - 35;
int tabw = w - 5, tabh = h - 25;
tabControl = new TabControl()
SplitContainer split = new SplitContainer()
{
Size = new Size(w, h),
Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
};
parent.Controls.Add(split);
GroupBox grpInvitations = new GroupBox()
{
Dock = DockStyle.Fill,
Text = "Invitations",
Width = 500,
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
};
grpInvitations.Controls.Add(lvMvInvitations = new LvMvInvitations()
{
Dock = DockStyle.Fill,
});
split.Panel1.Controls.Add(grpInvitations);
tabControl = new TabControl()
{
Dock = DockStyle.Fill,
//Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
TabPages =
{
@ -381,11 +313,6 @@ namespace dezentrale.view
Text = "Invitation settings",
ClientSize = new Size(tabw, tabh),
}),
(tabMemberInvitation = new TabPage()
{
Text = "Member invitation",
ClientSize = new Size(tabw, tabh),
}),
(tabRunningMv = new TabPage()
{
Text = "Running MV",
@ -398,11 +325,11 @@ namespace dezentrale.view
}),
}
};
parent.Controls.Add(tabControl);
split.Panel2.Controls.Add(tabControl);
BuildPageInvitationSettings(tabControl.TabPages[0]);
BuildPageMemberInvitation(tabControl.TabPages[1]);
BuildPageRunningMv(tabControl.TabPages[2]);
BuildLog(tabControl.TabPages[3]);
BuildPageRunningMv(tabControl.TabPages[1]);
BuildLog(tabControl.TabPages[2]);
}
private void Init()
@ -413,22 +340,21 @@ namespace dezentrale.view
this.StartPosition = FormStartPosition.CenterParent;
this.Size = new System.Drawing.Size(742, 600);
this.Text = "dezentrale-members :: MV administration";
this.FormClosing += frmMv_Closing;
BuildGui(this);
//In order to update the tool buttons etc, we need to call UpdateGui() here
tabControl.SelectedIndexChanged += (sender, e) => { UpdateGui(); };
//Setup all controls values
mvDate.Value = this.mv.EventDate;
mvTime.Value = this.mv.EventDate;
tbPlace.Text = this.mv.Place;
tbMvAgenda.Text = this.mv.Agenda;
tbInviteHeadline.Text = this.mv.InviteHeadline;
tbInviteBody.Text = this.mv.InviteBody;
mvDate.Value = mv.EventDate;
mvTime.Value = mv.EventDate;
tbPlace.Text = mv.Place;
tbMvAgenda.Text = mv.Agenda;
tbInviteHeadline.Text = mv.InviteHeadline;
tbInviteBody.Text = mv.InviteBody;
UpdateGui();
programmaticChange = false;
RefreshPreview();
//for new MV, we want to keep the member list up-to-date in order
@ -436,17 +362,17 @@ namespace dezentrale.view
//becomes active after MV entry was generated. The other way round,
//entries with no (or inactive) member reference will not be
//removed (documentation purposes)
if (this.mv.Status < Mv.MvStatus.Started)
if (mv.Status < Mv.MvStatus.Started)
{
foreach (Member m in Program.members.Entries)
{
if (m.Status == Member.eStatus.Active)
{
//find invitation entry
if(this.mv.Members.Find((x) => x.MemberNumber == m.Number) == null)
if(mv.Members.Find((x) => x.MemberNumber == m.Number) == null)
//if there is none, create one
{
this.mv.Members.Add(new MvInvitedMember()
mv.Members.Add(new MvInvitedMember()
{
MemberNumber = m.Number,
});
@ -455,7 +381,7 @@ namespace dezentrale.view
}
}
foreach(MvInvitedMember mvi in this.mv.Members)
foreach(MvInvitedMember mvi in mv.Members)
lvMvInvitations.AddEntry(mvi);
}
@ -471,22 +397,15 @@ namespace dezentrale.view
Init();
}
private void btnClose_Click(object sender, EventArgs e)
private void frmMv_Closing(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
/*
GenerateAuthCode = chkGenerateAuthCode.Checked;
Headline = tbPreviewHeadline.Text;
Body = tbPreviewBody.Text;
InvitationGroup = (MvInvitationGroup)cbInviteSelection.SelectedItem;
MvEventDate = new DateTime(mvDate.Value.Year, mvDate.Value.Month, mvDate.Value.Day,
mvTime.Value.Hour, mvTime.Value.Minute, mvTime.Value.Second);
*/
UpdateMvData();
}
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
// private void btnCancel_Click(object sender, EventArgs e)
// {
// this.Close();
// }
}
}