Skip to content

Commit

Permalink
Show only columns on forms #936
Browse files Browse the repository at this point in the history
  • Loading branch information
rappen committed Aug 8, 2023
1 parent 1e8b82f commit a45f1ac
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 4 deletions.
2 changes: 1 addition & 1 deletion FetchXmlBuilder/Forms/SelectAttributesDialog.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

93 changes: 90 additions & 3 deletions FetchXmlBuilder/Forms/SelectAttributesDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public partial class SelectAttributesDialog : Form
private int sortcolumn = 0;
private List<ListViewItem> allItems;
private List<string> viewcolumns;
private List<string> formcolumns;
private FetchXmlBuilder fxb;
private string entity;
private bool initiating = true;
Expand Down Expand Up @@ -59,7 +60,7 @@ private void GenerateAllItems(List<AttributeMetadata> attributes, List<string> s
}
}

private void PopulateAttributes(bool required = false, bool isonanyview = false)
private void PopulateAttributes(bool required = false, bool isonanyview = false, bool isonanyform = false)
{
initiating = true;
lvAttributes.Items.Clear();
Expand All @@ -76,6 +77,10 @@ private void PopulateAttributes(bool required = false, bool isonanyview = false)
{
continue;
}
if (isonanyform && !IsOnAnyForm(item.Tag as AttributeMetadata))
{
continue;
}
lvAttributes.Items.Add(item);
}
}
Expand Down Expand Up @@ -136,6 +141,52 @@ private bool IsOnAnyView(AttributeMetadata meta)
return viewcolumns.Contains(meta.LogicalName);
}

private bool IsOnAnyForm(AttributeMetadata meta)
{
if (formcolumns == null)
{
if (working)
{
return false;
}
working = true;
Enabled = false;
fxb.WorkAsync(new WorkAsyncInfo
{
Message = "Loading forms...",
Work = (w, a) =>
{
if (fxb.Service == null)
{
throw new Exception("Need a connection to load forms.");
}
var query = new QueryExpression("systemform");
query.ColumnSet.AddColumns("name", "type", "formxml");
query.Criteria.AddCondition("objecttypecode", ConditionOperator.Equal, entity);
query.Criteria.AddCondition("formactivationstate", ConditionOperator.Equal, 1);
query.Criteria.AddCondition("formxml", ConditionOperator.NotNull);
a.Result = fxb.RetrieveMultiple(query);
},
PostWorkCallBack = (a) =>
{
if (a.Error != null)
{
fxb.ShowErrorDialog(a.Error);
}
else if (a.Result is EntityCollection forms)
{
SetFormColumns(forms);
PopulateAttributes(isonanyform: true);
}
Enabled = true;
working = false;
}
});
return false;
}
return formcolumns.Contains(meta.LogicalName);
}

private void SetViewColumns(EntityCollection views)
{
viewcolumns = new List<string>();
Expand All @@ -156,6 +207,37 @@ private void SetViewColumns(EntityCollection views)
viewcolumns = viewcolumns.Distinct().ToList();
}

private void SetFormColumns(EntityCollection forms)
{
formcolumns = new List<string>();
foreach (var form in forms.Entities)
{
var formxml = form.GetAttributeValue<string>("formxml");
var formdoc = new XmlDocument();
formdoc.LoadXml(formxml);
var nodes = formdoc.ChildNodes;
foreach (XmlNode node in nodes)
{
formcolumns.AddRange(FindCellControlFields(node));
}
}
formcolumns = formcolumns.Distinct().ToList();
}

private IEnumerable<string> FindCellControlFields(XmlNode node)
{
var result = new List<string>();
if (node.Name == "cell" &&
node.SelectSingleNode("control") is XmlNode control &&
control.AttributeValue("datafieldname") is string field &&
!string.IsNullOrEmpty(field))
{
result.Add(field);
}
node.ChildNodes.Cast<XmlNode>().ToList().ForEach(n => result.AddRange(FindCellControlFields(n)));
return result;
}

public List<AttributeMetadata> GetSelectedAttributes()
{
var result = new List<AttributeMetadata>();
Expand Down Expand Up @@ -254,12 +336,17 @@ private void lnkShowAll_LinkClicked(object sender, LinkLabelLinkClickedEventArgs

private void lnkShowRequired_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
PopulateAttributes(true);
PopulateAttributes(required: true);
}

private void lnkShowOnViews_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
PopulateAttributes(false, true);
PopulateAttributes(isonanyview: true);
}

private void lnkShowOnForms_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
PopulateAttributes(isonanyform: true);
}

private void lnkCheckShown_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
Expand Down

0 comments on commit a45f1ac

Please sign in to comment.