- update multiple LIAM projects and solution/config files - add LiamWorkflowDiagnostics app sources and generated outputs - include current workspace state (dependencies and build outputs)
458 lines
15 KiB
C#
458 lines
15 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using System.IO;
|
|
using System.Diagnostics;
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
using C4IT.Logging;
|
|
using C4IT.LIAM;
|
|
using System.Reflection;
|
|
using static C4IT.Logging.cLogManager;
|
|
|
|
namespace LiamTestTeams
|
|
{
|
|
public partial class ctrlTabLiam : UserControl
|
|
{
|
|
|
|
public ctrlTabLiam()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
public void SetTitle(string Title)
|
|
{
|
|
labelTitel.Text = Title;
|
|
}
|
|
|
|
public async Task Refresh(TreeNodeRoot RootNode)
|
|
{
|
|
treeViewTeams.Nodes.Clear();
|
|
|
|
|
|
var listGroups = await RootNode.ResolveAsync();
|
|
ShowErrorMessage(RootNode.getLastError());
|
|
|
|
if (listGroups == null)
|
|
return;
|
|
|
|
foreach (var Entry in listGroups)
|
|
{
|
|
var tr = new TreeNode(Entry.ToString())
|
|
{
|
|
ImageIndex = Entry.ImageIndex(),
|
|
SelectedImageIndex = Entry.ImageIndex(),
|
|
Tag = Entry,
|
|
ForeColor = Color.Gray,
|
|
};
|
|
treeViewTeams.Nodes.Add(tr);
|
|
}
|
|
}
|
|
|
|
private async void treeViewTeams_AfterSelect(object sender, TreeViewEventArgs e)
|
|
{
|
|
if (treeViewTeams.SelectedNode == null && treeViewTeams.SelectedNode.Tag == null)
|
|
{
|
|
textBoxDetails.Text = "";
|
|
return;
|
|
}
|
|
|
|
var tag = treeViewTeams.SelectedNode.Tag;
|
|
|
|
if (tag is TreeNodeBase NodeInfo)
|
|
{
|
|
if (NodeInfo.SupportPermissionAdd())
|
|
toolStripMenuItemAddPermission.Enabled = true;
|
|
else
|
|
toolStripMenuItemAddPermission.Enabled = false;
|
|
if (NodeInfo.SupportPermissionRemoveDirect() || NodeInfo.SupportPermissionRemoveByValue())
|
|
toolStripMenuItemRemovePermission.Enabled = true;
|
|
else
|
|
toolStripMenuItemRemovePermission.Enabled = false;
|
|
if (NodeInfo.GetUID() != null)
|
|
toolStripMenuItemLoadFromUID.Enabled = true;
|
|
else
|
|
toolStripMenuItemLoadFromUID.Enabled = false;
|
|
|
|
if (NodeInfo.IsResolved())
|
|
{
|
|
textBoxDetails.Text = NodeInfo.GetInfoText();
|
|
return;
|
|
}
|
|
|
|
Cursor = Cursors.WaitCursor;
|
|
treeViewTeams.Enabled = false;
|
|
try
|
|
{
|
|
await UpdateNode(treeViewTeams.SelectedNode, false);
|
|
}
|
|
catch { };
|
|
|
|
treeViewTeams.Enabled = true;
|
|
Cursor = Cursors.Default;
|
|
}
|
|
|
|
}
|
|
|
|
private async Task UpdateNode(TreeNode Node, bool ResolveAlways)
|
|
{
|
|
try
|
|
{
|
|
Node.Nodes.Clear();
|
|
|
|
if (!(Node.Tag is TreeNodeBase NodeInfo))
|
|
{
|
|
Node.Text = "- Error -";
|
|
Node.ImageIndex = 7;
|
|
Node.SelectedImageIndex = 7;
|
|
return;
|
|
}
|
|
|
|
var SubItems = await NodeInfo.ResolveAsync(ResolveAlways);
|
|
ShowErrorMessage(NodeInfo.getLastError());
|
|
|
|
textBoxDetails.Text = NodeInfo.GetInfoText();
|
|
|
|
if (SubItems != null)
|
|
{
|
|
Node.ImageIndex = NodeInfo.ImageIndex();
|
|
Node.SelectedImageIndex = Node.ImageIndex;
|
|
treeViewTeams.BeginUpdate();
|
|
try
|
|
{
|
|
foreach (var Entry in SubItems)
|
|
{
|
|
var tr = new TreeNode(Entry.ToString())
|
|
{
|
|
Tag = Entry,
|
|
ImageIndex = Entry.ImageIndex(),
|
|
SelectedImageIndex = Entry.ImageIndex()
|
|
};
|
|
|
|
if (Entry.AutoResolved())
|
|
tr.ForeColor = Color.Black;
|
|
else
|
|
tr.ForeColor = Color.Gray;
|
|
|
|
treeViewTeams.SelectedNode.Nodes.Add(tr);
|
|
}
|
|
treeViewTeams.SelectedNode.Expand();
|
|
treeViewTeams.SelectedNode.ForeColor = Color.Black;
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
cLogManager.LogException(E);
|
|
}
|
|
finally
|
|
{
|
|
treeViewTeams.EndUpdate();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Node.ImageIndex = 7;
|
|
Node.SelectedImageIndex = 7;
|
|
}
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
cLogManager.LogException(E);
|
|
Node.ImageIndex = 7;
|
|
Node.SelectedImageIndex = 7;
|
|
}
|
|
}
|
|
|
|
private void toolStripMenuItemGetJson_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
try
|
|
{
|
|
if (treeViewTeams.SelectedNode == null)
|
|
return;
|
|
|
|
if (!(treeViewTeams.SelectedNode.Tag is TreeNodeBase tn))
|
|
return;
|
|
|
|
var strJson = tn.GetJson();
|
|
|
|
if (string.IsNullOrWhiteSpace(strJson))
|
|
return;
|
|
|
|
var FN = Path.GetTempPath();
|
|
FN = Path.Combine(FN, "LiamTestTeams");
|
|
Directory.CreateDirectory(FN);
|
|
var FN2 = cLogManagerFile.BuildFileName(treeViewTeams.SelectedNode.Text) + ".json";
|
|
FN = Path.Combine(FN, FN2);
|
|
|
|
File.WriteAllText(FN, strJson);
|
|
|
|
var strEditor = Environment.ExpandEnvironmentVariables(@"%ProgramFiles%\Notepad++\notepad++.exe");
|
|
if (!File.Exists(strEditor))
|
|
strEditor = Environment.ExpandEnvironmentVariables(@"%ProgramFiles(x86)%\Notepad++\notepad++.exe");
|
|
if (!File.Exists(strEditor))
|
|
strEditor = Environment.ExpandEnvironmentVariables(@"%windir%\notepad.exe");
|
|
|
|
var PI = new ProcessStartInfo()
|
|
{
|
|
FileName = strEditor,
|
|
Arguments = "\"" + FN + "\"",
|
|
UseShellExecute = false
|
|
};
|
|
|
|
Process.Start(PI);
|
|
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
cLogManager.LogException(E);
|
|
}
|
|
|
|
}
|
|
|
|
private async void ToolStripMenuItemRefresh_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (treeViewTeams.SelectedNode == null)
|
|
return;
|
|
|
|
if (!(treeViewTeams.SelectedNode.Tag is TreeNodeBase tn))
|
|
return;
|
|
|
|
Cursor = Cursors.WaitCursor;
|
|
treeViewTeams.Enabled = false;
|
|
|
|
await UpdateNode(treeViewTeams.SelectedNode, true);
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
cLogManager.LogException(E);
|
|
}
|
|
finally
|
|
{
|
|
treeViewTeams.Enabled = true;
|
|
Cursor = Cursors.Default;
|
|
}
|
|
}
|
|
|
|
private async void toolStripMenuItemAddPermission_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (treeViewTeams.SelectedNode == null)
|
|
return;
|
|
|
|
if (!(treeViewTeams.SelectedNode.Tag is TreeNodeBase tn))
|
|
return;
|
|
|
|
if (!tn.SupportPermissionAdd())
|
|
return;
|
|
|
|
var ValidRoles = tn.ValidPermissionRoles();
|
|
if (ValidRoles == null || ValidRoles.Count == 0)
|
|
return;
|
|
|
|
var dlgInput = new frmPermissionInput();
|
|
|
|
dlgInput.comboBoxRole.Items.Clear();
|
|
foreach (var Entry in ValidRoles)
|
|
dlgInput.comboBoxRole.Items.Add(Entry);
|
|
|
|
var Retval = dlgInput.ShowDialog();
|
|
if (Retval != DialogResult.OK)
|
|
return;
|
|
|
|
var User = dlgInput.textBoxEmail.Text.Trim();
|
|
|
|
eLiamAccessRoles Role;
|
|
switch (dlgInput.comboBoxRole.SelectedIndex)
|
|
{
|
|
case 0:
|
|
Role = eLiamAccessRoles.Read;
|
|
break;
|
|
case 1:
|
|
Role = eLiamAccessRoles.Write;
|
|
break;
|
|
case 2:
|
|
Role = eLiamAccessRoles.Owner;
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
|
|
Cursor = Cursors.WaitCursor;
|
|
treeViewTeams.Enabled = false;
|
|
|
|
await tn.AddPermission(Role, User);
|
|
var LastMessage = tn.getLastError();
|
|
await Task.Delay(100);
|
|
await UpdateNode(treeViewTeams.SelectedNode, true);
|
|
if (!string.IsNullOrEmpty(LastMessage))
|
|
ShowErrorMessage(LastMessage);
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
cLogManager.LogException(E);
|
|
}
|
|
finally
|
|
{
|
|
treeViewTeams.Enabled = true;
|
|
Cursor = Cursors.Default;
|
|
}
|
|
|
|
}
|
|
|
|
private async void toolStripMenuItemRemovePermission_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (treeViewTeams.SelectedNode == null)
|
|
return;
|
|
|
|
if (!(treeViewTeams.SelectedNode.Tag is TreeNodeBase tn))
|
|
return;
|
|
|
|
if (tn.SupportPermissionRemoveDirect())
|
|
{
|
|
Cursor = Cursors.WaitCursor;
|
|
treeViewTeams.Enabled = false;
|
|
|
|
await tn.RemovePermissionDirect();
|
|
var LastMessage2 = tn.getLastError();
|
|
await Task.Delay(100);
|
|
await UpdateNode(treeViewTeams.SelectedNode.Parent, true);
|
|
if (!string.IsNullOrEmpty(LastMessage2))
|
|
ShowErrorMessage(LastMessage2);
|
|
return;
|
|
}
|
|
|
|
if (!tn.SupportPermissionRemoveByValue())
|
|
return;
|
|
|
|
var ValidRoles = tn.ValidPermissionRoles();
|
|
if (ValidRoles == null || ValidRoles.Count == 0)
|
|
return;
|
|
|
|
var dlgInput = new frmPermissionInput();
|
|
|
|
dlgInput.comboBoxRole.Items.Clear();
|
|
foreach (var Entry in ValidRoles)
|
|
dlgInput.comboBoxRole.Items.Add(Entry);
|
|
|
|
var Retval = dlgInput.ShowDialog();
|
|
if (Retval != DialogResult.OK)
|
|
return;
|
|
|
|
var User = dlgInput.textBoxEmail.Text.Trim();
|
|
|
|
eLiamAccessRoles Role;
|
|
switch (dlgInput.comboBoxRole.SelectedIndex)
|
|
{
|
|
case 0:
|
|
Role = eLiamAccessRoles.Read;
|
|
break;
|
|
case 1:
|
|
Role = eLiamAccessRoles.Write;
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
|
|
|
|
Cursor = Cursors.WaitCursor;
|
|
treeViewTeams.Enabled = false;
|
|
|
|
await tn.RemovePermissionByValue(Role, User);
|
|
var LastMessage = tn.getLastError();
|
|
await Task.Delay(100);
|
|
await UpdateNode(treeViewTeams.SelectedNode, true);
|
|
if (!string.IsNullOrEmpty(LastMessage))
|
|
ShowErrorMessage(LastMessage);
|
|
return;
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
cLogManager.LogException(E);
|
|
}
|
|
finally
|
|
{
|
|
treeViewTeams.Enabled = true;
|
|
Cursor = Cursors.Default;
|
|
}
|
|
|
|
}
|
|
|
|
public void ShowErrorMessage(string Message)
|
|
{
|
|
Invoke(new MethodInvoker(() => {
|
|
if (string.IsNullOrWhiteSpace(Message))
|
|
{
|
|
textBoxErrorMessage.Text = "";
|
|
textBoxErrorMessage.Visible = false;
|
|
textBoxDetails.Height = textBoxErrorMessage.Bottom - textBoxDetails.Top;
|
|
}
|
|
else
|
|
{
|
|
textBoxErrorMessage.Text = Message;
|
|
textBoxErrorMessage.Visible = true;
|
|
textBoxDetails.Height = textBoxErrorMessage.Top - textBoxDetails.Top - 1;
|
|
}
|
|
}));
|
|
}
|
|
|
|
private async void toolStripMenuItemLoadFromUID_Click(object sender, EventArgs e)
|
|
{
|
|
var CM = MethodBase.GetCurrentMethod();
|
|
LogMethodBegin(CM);
|
|
try
|
|
{
|
|
if (treeViewTeams.SelectedNode == null)
|
|
return;
|
|
|
|
if (!(treeViewTeams.SelectedNode.Tag is TreeNodeBase tn))
|
|
return;
|
|
|
|
var myUID = tn.GetUID();
|
|
if (myUID != null)
|
|
{
|
|
var N = await tn.LoadFromUID();
|
|
if (N != null && N.GetUID() == myUID)
|
|
{
|
|
var IT = N.GetInfoText();
|
|
|
|
var childs = await N.ResolveAsync(true);
|
|
if (childs != null)
|
|
IT += $"\r\n\r\nchild count: {childs.Count}";
|
|
else
|
|
IT += $"\r\n\r\n*** Error resolving child nodes ***";
|
|
|
|
MessageBox.Show(this, IT, $"Result for '{N.ToString()}'", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
return;
|
|
}
|
|
}
|
|
|
|
MessageBox.Show(this, "Error loading node from UID", $"UID = {myUID}", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
finally
|
|
{
|
|
LogMethodEnd(CM);
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
}
|