From 118542aa39aeadf0b2b987914f16210f4c38b9a0 Mon Sep 17 00:00:00 2001 From: Matej Samler Date: Mon, 26 May 2025 16:58:58 +0200 Subject: [PATCH] Added pp-form-event-handler --- .../.template.config/template.json | 158 ++++++++++++++++++ .../.template.scripts/AddEvent.ps1 | 58 +++++++ .../.template.scripts/AddLibrary.ps1 | 29 ++++ .../.template.scripts/Cleanup.ps1 | 1 + 4 files changed, 246 insertions(+) create mode 100644 src/Dataverse/templates/pp-form-event-handler/.template.config/template.json create mode 100644 src/Dataverse/templates/pp-form-event-handler/.template.scripts/AddEvent.ps1 create mode 100644 src/Dataverse/templates/pp-form-event-handler/.template.scripts/AddLibrary.ps1 create mode 100644 src/Dataverse/templates/pp-form-event-handler/.template.scripts/Cleanup.ps1 diff --git a/src/Dataverse/templates/pp-form-event-handler/.template.config/template.json b/src/Dataverse/templates/pp-form-event-handler/.template.config/template.json new file mode 100644 index 0000000..313fcea --- /dev/null +++ b/src/Dataverse/templates/pp-form-event-handler/.template.config/template.json @@ -0,0 +1,158 @@ +{ + "$schema": "http://json.schemastore.org/template", + "author": "NETWORG", + "identity": "TALXIS.DevKit.Templates.Dataverse.UI.FormEventHandler", + "name": "Power Platform: Form Event Handler", + "shortName": "pp-form-event-handler", + "tags": { + "language": "XML", + "type": "item" + }, + "sourceName": "formeventexample", + "sources": [ + { + "exclude": [ + "**/[Bb]in/**", + "**/[Oo]bj/**", + "*/**/[Bb]in/**", + "*/**/[Oo]bj/**", + "**/**/[Bb]in/**", + "**/**/[Oo]bj/**", + ".template.config/**/*" + ] + } + ], + "preferNameDirectory": true, + "symbols": { + "EntityName": { + "type": "parameter", + "datatype": "text", + "replaces": "exampleentityname", + "isRequired": true + }, + "SolutionRootPath": { + "type": "parameter", + "datatype": "text", + "replaces": "SolutionDeclarationsRoot", + "isRequired": true + }, + "FormType": { + "type": "parameter", + "datatype": "text", + "replaces": "exampleformtype", + "isRequired": true + }, + "FormGUIDId": { + "type": "parameter", + "datatype": "string", + "isRequired": true, + "defaultValue": "", + "replaces": "formguididexample", + "description": "Enter form Id" + }, + "LibraryName": { + "type": "parameter", + "datatype": "text", + "replaces": "examplelibraryname", + "isRequired": true, + "description": "Enter library name (without .js extension)" + }, + "LibraryUniqueId": { + "type": "parameter", + "generator": "guid", + "replaces": "examplelibraryuniqueid", + "parameters": { + "defaultFormat": "d" + } + }, + "HandlerUniqueId": { + "type": "parameter", + "generator": "guid", + "replaces": "examplehandleruniqueid", + "parameters": { + "defaultFormat": "d" + } + }, + "EventType": { + "type": "parameter", + "datatype": "choice", + "isRequired": true, + "replaces": "exampleeventname", + "description": "Select event type", + "choices": [ + { "choice": "onload" }, + { "choice": "onsave" }, + { "choice": "onchange" } + ] + }, + "FunctionName": { + "type": "parameter", + "datatype": "text", + "replaces": "examplefunctionname", + "isRequired": true, + "description": "Enter function name" + }, + "PassExecutionContext": { + "type": "parameter", + "datatype": "bool", + "defaultValue": "true", + "replaces": "examplepassexecutioncontext", + "isRequired": false, + "description": "Pass execution context to function (default: true)" + }, + "AttributeName": { + "type": "parameter", + "datatype": "text", + "replaces": "exampleattributename", + "isRequired": false, + "description": "Enter attribute name (required for AttributeOnChange event type)" + } + }, + "postActions": [ + { + "actionId": "3A7C4B45-1F5D-4A30-959A-51B88E82B5D2", + "args": { + "executable": "pwsh", + "args": "-noprofile -executionpolicy bypass -File \"./.template.scripts/AddLibrary.ps1\"", + "redirectStandardOutput": "false" + }, + "manualInstructions": [ + { + "text": "Add library to fetchxml" + } + ], + "continueOnError": false, + "description": "Add library to fetchxml" + }, + { + "actionId": "3A7C4B45-1F5D-4A30-959A-51B88E82B5D2", + "args": { + "executable": "pwsh", + "args": "-noprofile -executionpolicy bypass -File \"./.template.scripts/AddEvent.ps1\"", + "redirectStandardOutput": "false" + }, + "manualInstructions": [ + { + "text": "Add handler to fetchxml" + } + ], + "continueOnError": false, + "description": "Add handler to fetchxml" + }, + { + "actionId": "3A7C4B45-1F5D-4A30-959A-51B88E82B5D2", + "args": { + "executable": "pwsh", + "args": "-noprofile -executionpolicy bypass -File \"./.template.scripts/Cleanup.ps1\"", + "redirectStandardOutput": "false" + }, + "manualInstructions": [ + { + "text": "Removing template files" + } + ], + "continueOnError": false, + "description": "Removing template files" + } + ] +} diff --git a/src/Dataverse/templates/pp-form-event-handler/.template.scripts/AddEvent.ps1 b/src/Dataverse/templates/pp-form-event-handler/.template.scripts/AddEvent.ps1 new file mode 100644 index 0000000..11711fb --- /dev/null +++ b/src/Dataverse/templates/pp-form-event-handler/.template.scripts/AddEvent.ps1 @@ -0,0 +1,58 @@ +$entityXmlPath = (Resolve-Path 'SolutionDeclarationsRoot\Entities\exampleentityname\FormXml\exampleformtype\{formguididexample}.xml').Path + +[xml]$entityXml = Get-Content -Path $entityXmlPath -Raw + +$eventsNode = $entityXml.SelectSingleNode('//events') +if (-not $eventsNode) { + $entityXml.SelectSingleNode('//form').AppendChild($entityXml.CreateElement('events')) | Out-Null + $eventsNode = $entityXml.SelectSingleNode('//events') +} + +# If formLibraries already contains the library, skip adding it +$eventName = 'exampleeventname' +$attributeName = 'exampleattributename' +if ($eventname -eq "onchange") { + $eventNode = $eventsNode.SelectSingleNode("event[@name='$eventName']") +} +else { + $eventNode = $eventsNode.SelectSingleNode("event[@name='$eventName' and @attribute='$attributeName']") +} + +if (-not $eventNode ) { + $eventNode = $entityXml.CreateElement('event') + $eventNode.SetAttribute('name', $eventName) + $eventNode.SetAttribute('application', 'false') + $eventNode.SetAttribute('active', 'true') + if ($eventName -eq 'onchange') { + $eventNode.SetAttribute('attribute', $attributeName) + } + + $handlersNode = $entityXml.CreateElement('Handlers') + + $eventNode.AppendChild($handlersNode) | Out-Null + $eventsNode.AppendChild($eventNode) | Out-Null + +} + +# Create a new handler element +$handlerNode = $entityXml.CreateElement('Handler') +$handlerNode.SetAttribute('library', 'examplelibraryname.js') +$handlerNode.SetAttribute('functionName', 'examplefunctionname') +$handlerNode.SetAttribute('passExecutionContext', 'true') +$handlerNode.SetAttribute('enabled', 'true') +$handlerNode.SetAttribute('handlerUniqueId', '{examplehandleruniqueid}') +$handlerNode.SetAttribute('parameters', '') + + +$handlersNode = $eventNode.SelectSingleNode('Handlers') +$handlersNode.AppendChild($handlerNode) | Out-Null + + +$settings = New-Object System.Xml.XmlWriterSettings +$settings.Indent = $true +$settings.NewLineHandling = [System.Xml.NewLineHandling]::None +$settings.OmitXmlDeclaration = $false + +$writer = [System.Xml.XmlWriter]::Create($entityXmlPath, $settings) +$entityXml.Save($writer) +$writer.Close() \ No newline at end of file diff --git a/src/Dataverse/templates/pp-form-event-handler/.template.scripts/AddLibrary.ps1 b/src/Dataverse/templates/pp-form-event-handler/.template.scripts/AddLibrary.ps1 new file mode 100644 index 0000000..9063d40 --- /dev/null +++ b/src/Dataverse/templates/pp-form-event-handler/.template.scripts/AddLibrary.ps1 @@ -0,0 +1,29 @@ +$entityXmlPath = (Resolve-Path 'SolutionDeclarationsRoot\Entities\exampleentityname\FormXml\exampleformtype\{formguididexample}.xml').Path + +[xml]$entityXml = Get-Content -Path $entityXmlPath -Raw + +$formLibrariesNode = $entityXml.SelectSingleNode('//formLibraries') +if (-not $formLibrariesNode) { + $entityXml.SelectSingleNode('//form').AppendChild($entityXml.CreateElement('formLibraries')) | Out-Null + $formLibrariesNode = $entityXml.SelectSingleNode('//formLibraries') +} + +# If formLibraries already contains the library, skip adding it +$libraryName = 'examplelibraryname.js' +$existingLibrary = $formLibrariesNode.SelectSingleNode("Library[@name='$libraryName']") + +if (-not $existingLibrary) { + $libraryNode = $entityXml.CreateElement('Library') + $libraryNode.SetAttribute('name', $libraryName) + $libraryNode.SetAttribute('libraryUniqueId', '{examplelibraryuniqueid}') + $formLibrariesNode.AppendChild($libraryNode) | Out-Null +} + +$settings = New-Object System.Xml.XmlWriterSettings +$settings.Indent = $true +$settings.NewLineHandling = [System.Xml.NewLineHandling]::None +$settings.OmitXmlDeclaration = $false + +$writer = [System.Xml.XmlWriter]::Create($entityXmlPath, $settings) +$entityXml.Save($writer) +$writer.Close() \ No newline at end of file diff --git a/src/Dataverse/templates/pp-form-event-handler/.template.scripts/Cleanup.ps1 b/src/Dataverse/templates/pp-form-event-handler/.template.scripts/Cleanup.ps1 new file mode 100644 index 0000000..562fe03 --- /dev/null +++ b/src/Dataverse/templates/pp-form-event-handler/.template.scripts/Cleanup.ps1 @@ -0,0 +1 @@ +Remove-Item .template.scripts -Recurse -Force \ No newline at end of file