Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
1d5bfd0
chore: tooltips on header buttons
Lucki2g Nov 18, 2025
7772903
chore: adjustments to search box on metadata
Lucki2g Nov 18, 2025
698f250
chore: refactored dataverseservice into smaller services
Lucki2g Nov 18, 2025
9492036
feat: new generator logic to show inclusion type and visually the sam…
Lucki2g Nov 21, 2025
8207554
chore: TS type changes
Lucki2g Nov 23, 2025
f8d6b8a
feat: workflow dependencies from microsoft retrieved in generator. Fl…
Lucki2g Nov 23, 2025
ae61b86
fix: workflow dependencies incorrectly found
Lucki2g Nov 23, 2025
77ea09f
chore: minor graph adjustments
Lucki2g Nov 23, 2025
4f5c326
feat: info texts on graphs in insights
Lucki2g Nov 23, 2025
b951ea4
fix: solutiontype in generated data is not the same data in grouptype…
Lucki2g Nov 23, 2025
d87a276
feat: Added solution information to components and swapped chord char…
Lucki2g Nov 23, 2025
45d2e83
feat: refactored the MUI matrix into Nivo heatmap
Lucki2g Nov 23, 2025
4142117
fix: Argument exception when no plural name exists for entity
Lucki2g Nov 24, 2025
c7a38e9
fix: unnessecary attribute filters, extension method to fet userlocal…
Lucki2g Nov 24, 2025
76b35f0
feat: more relationship logic showing N:1, 1:N correctly. And also us…
Lucki2g Nov 25, 2025
e3d231a
feat: added workflows and business rules to the process view. And fix…
Lucki2g Nov 25, 2025
42a1c5f
chore: homepage update and navigation "new" markers
Lucki2g Nov 25, 2025
b969d09
fix: build errors
Lucki2g Nov 25, 2025
0d957ff
chore: missing nivo/heatmap from dependencies
Lucki2g Nov 26, 2025
a1d7de2
fix: global search disabled pointer events on the table search
Lucki2g Nov 27, 2025
a2b59da
Merge branch 'patches/121287-more-patches' of https://github.com/dele…
Lucki2g Nov 27, 2025
48e0d48
feat: additional activity standard attribute metadata filters
Lucki2g Nov 27, 2025
a81323e
chore: cleanup in tool scripts and fixed WR description script issue …
Lucki2g Nov 27, 2025
02bc756
fix: heatmap missing from lock
Lucki2g Nov 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 6 additions & 21 deletions DataModelViewer.sln
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36429.23 d17.14
# Visual Studio Version 18
VisualStudioVersion = 18.3.11222.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Generator", "Generator\Generator.csproj", "{164968FD-4D5C-4C5F-BAE2-EBC071F2AB7D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generator.Tests", "Generator.Tests\Generator.Tests.csproj", "{DD894991-9A5E-4201-9651-C7367BE8FA34}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Scripts", "Scripts", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{E2A0671D-5354-45C7-8D86-287DBCA099EC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddWebResourceDescription", "Tools\Scripts\AddWebResourceDescription.csproj", "{379C35FE-EAD1-E476-6E2C-58C14BFEF2B2}"
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SharedTools", "SharedTools\SharedTools.shproj", "{668737CF-1205-43E7-9CE2-1E451FD8C8A7}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9EFE4F19-B072-4920-985D-1489373F5E1B}"
ProjectSection(SolutionItems) = preProject
Tools\Scripts\addWebResourceDescription.cs = Tools\Scripts\addWebResourceDescription.cs
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand All @@ -29,23 +26,11 @@ Global
{DD894991-9A5E-4201-9651-C7367BE8FA34}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DD894991-9A5E-4201-9651-C7367BE8FA34}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DD894991-9A5E-4201-9651-C7367BE8FA34}.Release|Any CPU.Build.0 = Release|Any CPU
{379C35FE-EAD1-E476-6E2C-58C14BFEF2B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{379C35FE-EAD1-E476-6E2C-58C14BFEF2B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{379C35FE-EAD1-E476-6E2C-58C14BFEF2B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{379C35FE-EAD1-E476-6E2C-58C14BFEF2B2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {E2A0671D-5354-45C7-8D86-287DBCA099EC}
{379C35FE-EAD1-E476-6E2C-58C14BFEF2B2} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
{668737CF-1205-43E7-9CE2-1E451FD8C8A7} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {53B88BBA-AEED-4925-9F3A-E96F7B0E00C5}
EndGlobalSection
GlobalSection(SharedMSBuildProjectFiles) = preSolution
SharedTools\SharedTools.projitems*{668737cf-1205-43e7-9ce2-1e451fd8c8a7}*SharedItemsImports = 13
EndGlobalSection
EndGlobal
7 changes: 5 additions & 2 deletions Generator/DTO/AttributeUsage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ public enum ComponentType
Plugin,
WebResource,
WorkflowActivity,
CustomApi
CustomApi,
BusinessRule,
ClassicWorkflow
}

public enum OperationType
Expand All @@ -23,5 +25,6 @@ public record AttributeUsage(
string Name,
string Usage,
OperationType OperationType,
ComponentType ComponentType
ComponentType ComponentType,
bool IsFromDependencyAnalysis
);
11 changes: 8 additions & 3 deletions Generator/DTO/Attributes/Attribute.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Microsoft.Xrm.Sdk.Metadata;
using Generator.Extensions;
using Microsoft.Xrm.Sdk.Metadata;

namespace Generator.DTO.Attributes;

Expand All @@ -9,6 +10,10 @@
public bool IsPrimaryId { get; set; }
public bool IsPrimaryName { get; set; }
public List<AttributeUsage> AttributeUsages { get; set; } = new List<AttributeUsage>();
public bool IsExplicit { get; set; }
public string PublisherName { get; set; }
public string PublisherPrefix { get; set; }
public List<SolutionInfo> Solutions { get; set; } = new List<SolutionInfo>();
public string DisplayName { get; }
public string SchemaName { get; }
public string Description { get; }
Expand All @@ -18,14 +23,14 @@
public bool IsColumnSecured { get; }
public CalculationMethods? CalculationMethod { get; }

protected Attribute(AttributeMetadata metadata)

Check warning on line 26 in Generator/DTO/Attributes/Attribute.cs

View workflow job for this annotation

GitHub Actions / generator

Non-nullable property 'PublisherPrefix' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

Check warning on line 26 in Generator/DTO/Attributes/Attribute.cs

View workflow job for this annotation

GitHub Actions / generator

Non-nullable property 'PublisherName' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.
{
IsPrimaryId = metadata.IsPrimaryId ?? false;
IsPrimaryName = metadata.IsPrimaryName ?? false;
IsCustomAttribute = metadata.IsCustomAttribute ?? false;
DisplayName = metadata.DisplayName.UserLocalizedLabel?.Label ?? string.Empty;
DisplayName = metadata.DisplayName.ToLabelString();
SchemaName = metadata.SchemaName;
Description = metadata.Description.UserLocalizedLabel?.Label.PrettyDescription() ?? string.Empty;
Description = metadata.Description.ToLabelString().PrettyDescription() ?? string.Empty;
RequiredLevel = metadata.RequiredLevel.Value;
IsAuditEnabled = metadata.IsAuditEnabled.Value;
IsColumnSecured = metadata.IsSecured ?? false;
Expand Down
7 changes: 4 additions & 3 deletions Generator/DTO/Attributes/BooleanAttribute.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Microsoft.Xrm.Sdk.Metadata;
using Generator.Extensions;
using Microsoft.Xrm.Sdk.Metadata;

namespace Generator.DTO.Attributes;

Expand All @@ -11,8 +12,8 @@ internal class BooleanAttribute : Attribute
public BooleanAttribute(BooleanAttributeMetadata metadata)
: base(metadata)
{
TrueLabel = metadata.OptionSet.TrueOption.Label.UserLocalizedLabel?.Label ?? string.Empty;
FalseLabel = metadata.OptionSet.FalseOption.Label.UserLocalizedLabel?.Label ?? string.Empty;
TrueLabel = metadata.OptionSet.TrueOption.Label.ToLabelString();
FalseLabel = metadata.OptionSet.FalseOption.Label.ToLabelString();
DefaultValue = metadata.DefaultValue;
}
}
15 changes: 8 additions & 7 deletions Generator/DTO/Attributes/ChoiceAttribute.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Microsoft.Xrm.Sdk.Metadata;
using Generator.Extensions;
using Microsoft.Xrm.Sdk.Metadata;

namespace Generator.DTO.Attributes;

Expand All @@ -13,32 +14,32 @@ public class ChoiceAttribute : Attribute
public ChoiceAttribute(PicklistAttributeMetadata metadata) : base(metadata)
{
Options = metadata.OptionSet.Options.Select(x => new Option(
x.Label.UserLocalizedLabel?.Label ?? string.Empty,
x.Label.ToLabelString(),
x.Value,
x.Color,
x.Description.UserLocalizedLabel?.Label.PrettyDescription() ?? string.Empty));
x.Description.ToLabelString().PrettyDescription()));
Type = "Single";
DefaultValue = metadata.DefaultFormValue;
}

public ChoiceAttribute(StateAttributeMetadata metadata) : base(metadata)
{
Options = metadata.OptionSet.Options.Select(x => new Option(
x.Label.UserLocalizedLabel?.Label ?? string.Empty,
x.Label.ToLabelString(),
x.Value,
x.Color,
x.Description.UserLocalizedLabel?.Label.PrettyDescription() ?? string.Empty));
x.Description.ToLabelString().PrettyDescription()));
Type = "Single";
DefaultValue = metadata.DefaultFormValue;
}

public ChoiceAttribute(MultiSelectPicklistAttributeMetadata metadata) : base(metadata)
{
Options = metadata.OptionSet.Options.Select(x => new Option(
x.Label.UserLocalizedLabel?.Label ?? string.Empty,
x.Label.ToLabelString(),
x.Value,
x.Color,
x.Description.UserLocalizedLabel?.Label.PrettyDescription() ?? string.Empty));
x.Description.ToLabelString().PrettyDescription()));
Type = "Multi";
DefaultValue = metadata.DefaultFormValue;
}
Expand Down
11 changes: 9 additions & 2 deletions Generator/DTO/Attributes/LookupAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,17 @@ internal class LookupAttribute : Attribute
{
public IEnumerable<ExtendedEntityInformation> Targets { get; }

public LookupAttribute(LookupAttributeMetadata metadata, Dictionary<string, ExtendedEntityInformation> logicalToSchema, ILogger<DataverseService> logger)
public LookupAttribute(LookupAttributeMetadata metadata, Dictionary<string, ExtendedEntityInformation> logicalToSchema, ILogger? logger = null)
: base(metadata)
{
foreach (var target in metadata.Targets) { if (!logicalToSchema.ContainsKey(target)) logger.LogError($"Missing logicalname in logicalToSchema {target}, on entity {metadata.EntityLogicalName}."); }
if (logger != null)
{
foreach (var target in metadata.Targets)
{
if (!logicalToSchema.ContainsKey(target))
logger.LogError($"Missing logicalname in logicalToSchema {target}, on entity {metadata.EntityLogicalName}.");
}
}

Targets =
metadata.Targets
Expand Down
8 changes: 4 additions & 4 deletions Generator/DTO/Attributes/StatusAttribute.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Microsoft.Xrm.Sdk.Metadata;
using Newtonsoft.Json;
using Generator.Extensions;
using Microsoft.Xrm.Sdk.Metadata;

namespace Generator.DTO.Attributes;

Expand All @@ -13,12 +13,12 @@ public StatusAttribute(StatusAttributeMetadata metadata, StateAttributeMetadata
var stateToName =
stateAttribute.OptionSet.Options
.Where(x => x.Value != null)
.ToDictionary(x => x.Value!.Value, x => x.Label.UserLocalizedLabel?.Label ?? string.Empty);
.ToDictionary(x => x.Value!.Value, x => x.Label.ToLabelString());

Options = metadata.OptionSet.Options
.Select(x => (StatusOptionMetadata)x)
.Select(x => new StatusOption(
x.Label.UserLocalizedLabel?.Label ?? string.Empty,
x.Label.ToLabelString(),
x.Value,
x.State == null ? "Unknown State" : stateToName[x.State.Value]));
}
Expand Down
5 changes: 4 additions & 1 deletion Generator/DTO/Record.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,14 @@ internal record Record(
bool IsAuditEnabled,
bool IsActivity,
bool IsCustom,
string PublisherName,
string PublisherPrefix,
OwnershipTypes Ownership,
bool IsNotesEnabled,
List<Attribute> Attributes,
List<Relationship> Relationships,
List<SecurityRole> SecurityRoles,
List<Key> Keys,
string? IconBase64);
string? IconBase64,
List<SolutionInfo> Solutions);

8 changes: 6 additions & 2 deletions Generator/DTO/Relationship.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,9 @@ public record Relationship(
string TableSchema,
string LookupDisplayName,
string RelationshipSchema,
bool IsManyToMany,
CascadeConfiguration? CascadeConfiguration);
string RelationshipType,
bool IsExplicit,
string PublisherName,
string PublisherPrefix,
CascadeConfiguration? CascadeConfiguration,
List<SolutionInfo> Solutions);
8 changes: 8 additions & 0 deletions Generator/DTO/SolutionInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Generator.DTO;

/// <summary>
/// Represents solution membership information for a component (entity, attribute, or relationship)
/// </summary>
public record SolutionInfo(
Guid Id,
string Name);
Loading
Loading