From 97a7fef40224b6482cd97bd1a72bc690bb192115 Mon Sep 17 00:00:00 2001 From: Marcel Ferreira <49608668+marcelbf@users.noreply.github.com> Date: Fri, 14 Jun 2024 05:01:30 -0700 Subject: [PATCH] PASopa for modern controls (#670) --- src/PAModel/CanvasDocument.cs | 4 +-- .../ControlTemplates/ControlTemplateParser.cs | 7 +++-- src/PAModel/Serializers/SourceSerializer.cs | 5 ++-- src/PAModelTests/Apps/ComboboxDropdown.msapp | Bin 0 -> 25800 bytes src/PAModelTests/TemplateStoreTests.cs | 27 ++++++++++++++++++ 5 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 src/PAModelTests/Apps/ComboboxDropdown.msapp diff --git a/src/PAModel/CanvasDocument.cs b/src/PAModel/CanvasDocument.cs index d2d4fcd5..5b196cd9 100644 --- a/src/PAModel/CanvasDocument.cs +++ b/src/PAModel/CanvasDocument.cs @@ -350,7 +350,7 @@ internal void ApplyAfterMsAppLoadTransforms(ErrorContainer errors) var templateDefaults = new Dictionary(); foreach (var template in _templates.UsedTemplates) { - if (!ControlTemplateParser.TryParseTemplate(_templateStore, template.Template, _properties.DocumentAppType, templateDefaults, out _, out _)) + if (!ControlTemplateParser.TryParseTemplate(_templateStore, template.Template, _properties.DocumentAppType, templateDefaults, out _, out _, template.Name)) { errors.GenericError($"Unable to parse template file {template.Name}"); throw new DocumentException(); @@ -405,7 +405,7 @@ internal void ApplyBeforeMsAppWriteTransforms(ErrorContainer errors) var templateDefaults = new Dictionary(); foreach (var template in _templates.UsedTemplates) { - if (!ControlTemplateParser.TryParseTemplate(_templateStore, template.Template, _properties.DocumentAppType, templateDefaults, out _, out _)) + if (!ControlTemplateParser.TryParseTemplate(_templateStore, template.Template, _properties.DocumentAppType, templateDefaults, out _, out _, template.Name)) { errors.GenericError($"Unable to parse template file {template.Name}"); throw new DocumentException(); diff --git a/src/PAModel/ControlTemplates/ControlTemplateParser.cs b/src/PAModel/ControlTemplates/ControlTemplateParser.cs index bc3d4ffa..207067fe 100644 --- a/src/PAModel/ControlTemplates/ControlTemplateParser.cs +++ b/src/PAModel/ControlTemplates/ControlTemplateParser.cs @@ -13,10 +13,10 @@ internal class ControlTemplateParser internal static Regex _reservedIdentifierRegex = new(@"%([a-zA-Z]*)\.RESERVED%"); [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "")] - internal static bool TryParseTemplate(TemplateStore templateStore, string templateString, AppType type, Dictionary loadedTemplates, out ControlTemplate template, out string name) + internal static bool TryParseTemplate(TemplateStore templateStore, string templateString, AppType type, Dictionary loadedTemplates, out ControlTemplate template, out string name, string templateName = null) { template = null; - name = string.Empty; + name = templateName; try { var manifest = XDocument.Parse(templateString); @@ -26,7 +26,8 @@ internal static bool TryParseTemplate(TemplateStore templateStore, string templa if (widget.Name != ControlMetadataXNames.WidgetTag) return false; - name = widget.Attribute(ControlMetadataXNames.NameAttribute).Value; + name ??= widget.Attribute(ControlMetadataXNames.NameAttribute).Value; + var id = widget.Attribute(ControlMetadataXNames.IdAttribute).Value; var version = widget.Attribute(ControlMetadataXNames.VersionAttribute).Value; diff --git a/src/PAModel/Serializers/SourceSerializer.cs b/src/PAModel/Serializers/SourceSerializer.cs index a92bf0de..bb92eddc 100644 --- a/src/PAModel/Serializers/SourceSerializer.cs +++ b/src/PAModel/Serializers/SourceSerializer.cs @@ -310,7 +310,8 @@ private static void LoadTemplateFiles(ErrorContainer errors, CanvasDocument app, foreach (var file in new DirectoryReader(packagesPath).EnumerateFiles(string.Empty, "*.xml", searchSubdirectories: false)) { var xmlContents = file.GetContents(); - if (!ControlTemplateParser.TryParseTemplate(new TemplateStore(), xmlContents, app._properties.DocumentAppType, loadedTemplates, out var parsedTemplate, out var templateName)) + var templateNameFromFile = file._relativeName.Substring(0, file._relativeName.LastIndexOf('_')); + if (!ControlTemplateParser.TryParseTemplate(new TemplateStore(), xmlContents, app._properties.DocumentAppType, loadedTemplates, out var parsedTemplate, out var templateName, templateNameFromFile)) { errors.GenericError($"Unable to parse template file {file._relativeName}"); throw new DocumentException(); @@ -523,7 +524,7 @@ public static void SaveAsSource(CanvasDocument app, string directory2, ErrorCont { var filename = $"{template.Name}_{template.Version}.xml"; dir.WriteAllXML(PackagesDir, new FilePath(filename), template.Template); - if (!ControlTemplateParser.TryParseTemplate(app._templateStore, template.Template, app._properties.DocumentAppType, templateDefaults, out _, out _)) + if (!ControlTemplateParser.TryParseTemplate(app._templateStore, template.Template, app._properties.DocumentAppType, templateDefaults, out _, out _, template.Name)) throw new NotSupportedException($"Unable to parse template file {template.Name}"); } diff --git a/src/PAModelTests/Apps/ComboboxDropdown.msapp b/src/PAModelTests/Apps/ComboboxDropdown.msapp new file mode 100644 index 0000000000000000000000000000000000000000..e04c31a6fd46fe44b4aa1a3fcb3d499214ba5037 GIT binary patch literal 25800 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