Skip to content

Commit

Permalink
Adding filtering by Publisher #721
Browse files Browse the repository at this point in the history
  • Loading branch information
rappen committed May 27, 2022
1 parent f45a183 commit 30d3bf7
Show file tree
Hide file tree
Showing 5 changed files with 177 additions and 26 deletions.
11 changes: 10 additions & 1 deletion FetchXmlBuilder/AppCode/FXBConnectionSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,19 @@ public class FilterSetting
{
public bool ShowAllSolutions { get; set; } = true;
public bool ShowUnmanagedSolutions { get; set; } = false;
public Guid ShowSolution { get; set; } = Guid.Empty;
public bool ShowSolution { get; set; } = false;
public bool ShowPublisher { get; set; } = false;
public Guid SolutionId { get; set; } = Guid.Empty;
public Guid PublisherId { get; set; } = Guid.Empty;
public bool FilterByMetadata { get; set; } = true;
public bool AlwaysPrimary { get; set; } = true;
public bool AlwaysAddresses { get; set; } = true;

public bool NoneEntitiesSelected =>
!ShowAllSolutions &&
!ShowUnmanagedSolutions &&
(!ShowSolution || SolutionId.Equals(Guid.Empty)) &&
(!ShowPublisher || PublisherId.Equals(Guid.Empty));
}

public abstract class ShowMetaTypes
Expand Down
33 changes: 20 additions & 13 deletions FetchXmlBuilder/FXBMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ internal IEnumerable<AttributeMetadata> GetDisplayAttributes(string entityName,
{
return result;
}
if (solutionentities == null)
if (solutionentities == null || solutionentities.Count == 0)
{
LoadSolutionsComponents(selectedfilter);
}
Expand Down Expand Up @@ -163,11 +163,11 @@ internal string GetPrimaryIdAttribute(string entityName)
internal List<EntityMetadata> GetDisplayEntities(FilterSetting selectedfilter, ShowMetaTypesEntity selectentities)
{
var result = new List<EntityMetadata>();
if (entities == null)
if (entities == null || selectedfilter.NoneEntitiesSelected)
{
return result;
}
if (solutionentities == null)
if (solutionentities == null || solutionentities.Count == 0)
{
LoadSolutionsComponents(selectedfilter);
}
Expand Down Expand Up @@ -344,7 +344,10 @@ private void SetAfterEntitiesLoaded(IEnumerable<EntityMetadata> newEntityMetadat
if (newEntityMetadata != null)
{
entities = newEntityMetadata.ToList();
SendMessageToStatusBar(this, new XrmToolBox.Extensibility.Args.StatusBarMessageEventArgs($"All entities are now loaded."));
if (SendMessageToStatusBar != null)
{
SendMessageToStatusBar(this, new XrmToolBox.Extensibility.Args.StatusBarMessageEventArgs($"All entities are now loaded."));
}
}
UpdateLiveXML();
working = false;
Expand Down Expand Up @@ -416,24 +419,24 @@ srcexc.Detail is OrganizationServiceFault orgerr &&

private void LoadSolutionsComponents(FilterSetting selectedfilter)
{
if (Service == null)
if (Service == null || selectedfilter.NoneEntitiesSelected || selectedfilter.ShowAllSolutions)
{
solutionentities = new List<Entity>();
solutionattributes = new List<Guid>();
return;
}
solutionentities = null;
solutionattributes = null;
if (selectedfilter.ShowAllSolutions)
{
solutionentities = new List<Entity>();
return;
}
var query = new QueryExpression("solutioncomponent");
query.ColumnSet.AddColumns("objectid", "solutioncomponentid", "rootcomponentbehavior", "rootsolutioncomponentid", "ismetadata", "componenttype");
if (!selectedfilter.ShowSolution.Equals(Guid.Empty))
if (selectedfilter.ShowSolution)
{
query.Criteria.AddCondition("solutionid", ConditionOperator.Equal, selectedfilter.ShowSolution);
query.Criteria.AddCondition("solutionid", ConditionOperator.Equal, selectedfilter.SolutionId);
}
else if (selectedfilter.ShowPublisher)
{
var query_solution = query.AddLink("solution", "solutionid", "solutionid");
query_solution.LinkCriteria.AddCondition("publisherid", ConditionOperator.Equal, selectedfilter.PublisherId);
}
else if (selectedfilter.ShowUnmanagedSolutions)
{
Expand All @@ -442,14 +445,18 @@ private void LoadSolutionsComponents(FilterSetting selectedfilter)
query_solution.LinkCriteria.AddCondition("uniquename", ConditionOperator.NotEqual, "Default");
query_solution.LinkCriteria.AddCondition("isvisible", ConditionOperator.Equal, true);
}
else
{
query.Criteria.AddCondition("solutionid", ConditionOperator.Null);
}
var filtertype = new FilterExpression();
query.Criteria.AddFilter(filtertype);
filtertype.FilterOperator = LogicalOperator.Or;
filtertype.AddCondition("componenttype", ConditionOperator.Equal, 1);
filtertype.AddCondition("componenttype", ConditionOperator.Equal, 2);
try
{
var result = Service.RetrieveMultiple(query);
var result = RetrieveMultiple(query);
solutionentities = result.Entities
.Where(c => c.GetAttributeValue<OptionSetValue>("componenttype").Value == 1).ToList();
solutionattributes = result.Entities
Expand Down
2 changes: 1 addition & 1 deletion FetchXmlBuilder/Forms/SelectMLDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ private void UpdateMLs()

try
{
var lists = Caller.Service.RetrieveMultiple(QElist);
var lists = Caller.RetrieveMultiple(QElist);
foreach (var list in lists.Entities)
{
cmbML.Items.Add(new ViewItem(list));
Expand Down
22 changes: 18 additions & 4 deletions FetchXmlBuilder/Forms/ShowMetadataOptions.Designer.cs

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

135 changes: 128 additions & 7 deletions FetchXmlBuilder/Forms/ShowMetadataOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ public partial class ShowMetadataOptions : Form
{
private FetchXmlBuilder fxb;
private Guid selectedsolution;
private Guid selectedpublisher;
private List<Entity> solutions;
private List<Entity> publishers;

public static bool Show(FetchXmlBuilder fxb, Action<bool> applysetting)
{
Expand All @@ -27,7 +29,8 @@ public static bool Show(FetchXmlBuilder fxb, Action<bool> applysetting)
form.PopulateSolutionsSettings(fxb.connectionsettings.FilterSetting);
form.PopulateEntitiesSettings(fxb.connectionsettings.ShowEntities);
form.PopulateAttributesSettings(fxb.connectionsettings.ShowAttributes);
form.LoadSolutions();
//form.LoadSolutions();
//form.LoadPublishers();
args.Result = form;
},
PostWorkCallBack = (args) =>
Expand Down Expand Up @@ -62,8 +65,10 @@ private void PopulateSolutionsSettings(FilterSetting setting)
{
rbAllSolutions.Checked = setting.ShowAllSolutions;
rbUnmanagedSolution.Checked = setting.ShowUnmanagedSolutions;
rbSpecificSolution.Checked = !setting.ShowSolution.Equals(Guid.Empty);
selectedsolution = setting.ShowSolution;
rbSpecificSolution.Checked = setting.ShowSolution;
rbSpecificPublisher.Checked = setting.ShowPublisher;
selectedsolution = setting.SolutionId;
selectedpublisher = setting.PublisherId;
chkFilterMetadata.Checked = setting.FilterByMetadata;
chkAShowPrimary.Checked = setting.AlwaysPrimary;
chkAShowAddress.Checked = setting.AlwaysAddresses;
Expand Down Expand Up @@ -106,7 +111,10 @@ private FilterSetting GetFilterSetting()
{
ShowAllSolutions = rbAllSolutions.Checked,
ShowUnmanagedSolutions = rbUnmanagedSolution.Checked,
ShowSolution = rbSpecificSolution.Checked && xrmSolution.SelectedRecord != null ? xrmSolution.SelectedRecord.Id : Guid.Empty,
ShowSolution = rbSpecificSolution.Checked && xrmSolution.SelectedRecord != null,
ShowPublisher = rbSpecificPublisher.Checked && xrmSolution.SelectedRecord != null,
SolutionId = selectedsolution,
PublisherId = selectedpublisher,
FilterByMetadata = chkFilterMetadata.Checked,
AlwaysPrimary = chkAShowPrimary.Checked,
AlwaysAddresses = chkAShowAddress.Checked
Expand Down Expand Up @@ -150,6 +158,31 @@ private ShowMetaTypesAttribute GetAttributesSettings()
};
}

private Guid GetPublisherId(Entity entity)
{
return
entity != null &&
entity.Contains("Id") &&
entity["Id"] is AliasedValue value &&
value != null &&
value.Value is Guid id ? id : Guid.Empty;
}

private void SetPublisherId(Guid id)
{
foreach (var item in xrmSolution.Items)
{
if (item is Rappen.XTB.Helpers.ControlItems.EntityItem entityitem)
{
if (GetPublisherId(entityitem.Entity).Equals(id))
{
xrmSolution.SelectedItem = item;
break;
}
}
}
}

private void checkBox_CheckStateChanged(object sender, EventArgs e)
{
if (sender is CheckBox chk && chk.Tag is string tag)
Expand All @@ -161,6 +194,10 @@ private void checkBox_CheckStateChanged(object sender, EventArgs e)

private void UpdateSelections(object sender = null, EventArgs e = null)
{
if (!Visible)
{
return;
}
var settingsentities = GetEntitiesSettings();
var selentities = gbEntities.Controls
.OfType<CheckBox>()
Expand Down Expand Up @@ -253,6 +290,11 @@ private void rbAllSolutions_CheckedChanged(object sender, EventArgs e)
panSelectSolution.Enabled = true;
PopulateSolutions();
}
else if (rbSpecificPublisher.Checked)
{
panSelectSolution.Enabled = true;
PopulatePublishers();
}
else
{
panSelectSolution.Enabled = false;
Expand All @@ -267,26 +309,70 @@ private void PopulateSolutions()
{
return;
}
if (solutions == null || solutions.Count == 0)
{
LoadSolutions();
}
xrmSolution.DisplayFormat = "{friendlyname} ({P.friendlyname})";
xrmSolution.Service = fxb.Service;
xrmSolution.DataSource = solutions.Where(s => chkShowAllSolutions.Checked || s.GetAttributeValue<bool>("isvisible") == true);
xrmSolution.SetSelected(selectedsolution);
Enabled = true;
}

private void PopulatePublishers()
{
if (!Visible)
{
return;
}
LoadPublishers();
xrmSolution.DisplayFormat = "{Name} ({Solutions} solutions)";
xrmSolution.Service = fxb.Service;
xrmSolution.DataSource = publishers;
SetPublisherId(selectedpublisher);
Enabled = true;
}

private void chkShowAllSolutions_CheckedChanged(object sender, EventArgs e)
{
PopulateSolutions();
if (rbSpecificSolution.Checked)
{
PopulateSolutions();
}
else if (rbSpecificPublisher.Checked)
{
PopulatePublishers();
}
UpdateSelections();
}

private void ShowMetadataOptions_Load(object sender, EventArgs e)
{
PopulateSolutions();
if (rbSpecificSolution.Checked)
{
PopulateSolutions();
}
else if (rbSpecificPublisher.Checked)
{
PopulatePublishers();
}
UpdateSelections();
}

private void xrmSolution_SelectedIndexChanged(object sender, EventArgs e)
{
if (xrmSolution.Focused && xrmSolution.SelectedRecord is Entity selected)
{
if (rbSpecificSolution.Checked)
{
selectedsolution = selected.Id;
}
else if (rbSpecificPublisher.Checked)
{
selectedpublisher = GetPublisherId(selected);
}
}
fxb.solutionentities = null;
fxb.solutionattributes = null;
UpdateSelections();
Expand Down Expand Up @@ -315,12 +401,47 @@ internal void LoadSolutions()
publisher.Columns.AddColumns("customizationprefix", "uniquename", "friendlyname");
try
{
solutions = fxb.Service.RetrieveMultiple(query).Entities.ToList();
solutions = fxb.RetrieveMultiple(query).Entities.ToList();
}
catch (Exception ex)
{
fxb.ShowErrorDialog(ex, "Loading Solutions");
}
}

private void LoadPublishers()
{
if (fxb.Service == null)
{
publishers = new List<Entity>();
return;
}
var fetch = @"<fetch aggregate='true'>
<entity name='publisher'>
<attribute name='friendlyname' alias='Name' groupby='true' />
<attribute name='publisherid' alias='Id' groupby='true' />
<order alias='Name' />
<link-entity name='solution' from='publisherid' to='publisherid' link-type='inner' alias='S'>
<attribute name='solutionid' alias='Solutions' aggregate='countcolumn' />
{0}
</link-entity>
</entity>
</fetch>";
fetch = string.Format(fetch, chkShowAllSolutions.Checked ? "" : "<filter><condition attribute='isvisible' operator='eq' value='1'/></filter>");
try
{
Cursor = Cursors.WaitCursor;
publishers = fxb.RetrieveMultiple(new FetchExpression(fetch)).Entities.ToList();
}
catch (Exception ex)
{
Cursor = Cursors.Default;
fxb.ShowErrorDialog(ex, "Loading Publishers");
}
finally
{
Cursor = Cursors.Default;
}
}
}
}

0 comments on commit 30d3bf7

Please sign in to comment.