From 3ec53548a97f9d60b788eb9f910c3644625ce901 Mon Sep 17 00:00:00 2001 From: rbalsleyMSFT <53497092+rbalsleyMSFT@users.noreply.github.com> Date: Tue, 27 May 2025 19:12:48 -0700 Subject: [PATCH] Add AppsScriptVariables functionality to UI for defining key-value pairs - Introduced a new checkbox to enable defining Apps Script Variables. - Added a panel for inputting key-value pairs with validation for duplicates. - Implemented event handlers for adding, removing, and clearing Apps Script Variables. - Updated LoadConfig logic to handle loading of Apps Script Variables from configuration. --- FFUDevelopment/BuildFFUVM_UI.ps1 | 142 +++++++++++++++++++++++++++++- FFUDevelopment/BuildFFUVM_UI.xaml | 41 +++++++++ 2 files changed, 181 insertions(+), 2 deletions(-) diff --git a/FFUDevelopment/BuildFFUVM_UI.ps1 b/FFUDevelopment/BuildFFUVM_UI.ps1 index 0e9a8c6..e2051cd 100644 --- a/FFUDevelopment/BuildFFUVM_UI.ps1 +++ b/FFUDevelopment/BuildFFUVM_UI.ps1 @@ -585,7 +585,13 @@ function Get-UIConfig { AllowVHDXCaching = $window.FindName('chkAllowVHDXCaching').IsChecked AppListPath = $window.FindName('txtAppListJsonPath').Text AppsPath = $window.FindName('txtApplicationPath').Text - AppsScriptVariables = $null # Parameter from Sample_default.json, no UI control + AppsScriptVariables = if ($window.FindName('chkDefineAppsScriptVariables').IsChecked) { + $vars = @{} + foreach ($item in $window.FindName('lstAppsScriptVariables').Items) { + $vars[$item.Key] = $item.Value + } + if ($vars.Count -gt 0) { $vars } else { $null } + } else { $null } BuildUSBDrive = $window.FindName('chkBuildUSBDriveEnable').IsChecked CleanupAppsISO = $window.FindName('chkCleanupAppsISO').IsChecked CleanupCaptureISO = $window.FindName('chkCleanupCaptureISO').IsChecked @@ -1401,6 +1407,16 @@ $window.Add_Loaded({ $script:chkCopyDrivers = $window.FindName('chkCopyDrivers') $script:chkCompressDriversToWIM = $window.FindName('chkCompressDriversToWIM') + # AppsScriptVariables Controls + $script:chkDefineAppsScriptVariables = $window.FindName('chkDefineAppsScriptVariables') + $script:appsScriptVariablesPanel = $window.FindName('appsScriptVariablesPanel') + $script:txtAppsScriptKey = $window.FindName('txtAppsScriptKey') + $script:txtAppsScriptValue = $window.FindName('txtAppsScriptValue') + $script:btnAddAppsScriptVariable = $window.FindName('btnAddAppsScriptVariable') + $script:lstAppsScriptVariables = $window.FindName('lstAppsScriptVariables') + $script:btnRemoveAppsScriptVariable = $window.FindName('btnRemoveAppsScriptVariable') + $script:btnClearAppsScriptVariables = $window.FindName('btnClearAppsScriptVariables') + # Get Windows Settings defaults and lists from helper module $script:windowsSettingsDefaults = Get-WindowsSettingsDefaults # Get General defaults from helper module @@ -2016,8 +2032,10 @@ $window.Add_Loaded({ $script:applicationPathPanel.Visibility = 'Visible' $script:appListJsonPathPanel.Visibility = 'Visible' $script:chkBringYourOwnApps.Visibility = 'Visible' + # New logic for AppsScriptVariables + $script:chkDefineAppsScriptVariables.Visibility = 'Visible' }) - $script:chkInstallApps.Add_Unchecked({ +$script:chkInstallApps.Add_Unchecked({ $script:chkInstallWingetApps.IsChecked = $false # Uncheck children when parent is unchecked $script:chkBringYourOwnApps.IsChecked = $false $script:chkInstallWingetApps.Visibility = 'Collapsed' @@ -2027,6 +2045,10 @@ $window.Add_Loaded({ $script:wingetPanel.Visibility = 'Collapsed' $script:wingetSearchPanel.Visibility = 'Collapsed' $script:byoApplicationPanel.Visibility = 'Collapsed' + # New logic for AppsScriptVariables + $script:chkDefineAppsScriptVariables.IsChecked = $false # Also uncheck it + $script:chkDefineAppsScriptVariables.Visibility = 'Collapsed' + $script:appsScriptVariablesPanel.Visibility = 'Collapsed' # Ensure panel is hidden }) $script:btnBrowseApplicationPath.Add_Click({ $selectedPath = Show-ModernFolderPicker -Title "Select Application Path Folder" @@ -2408,6 +2430,66 @@ $window.Add_Loaded({ $script:chkCopyDrivers.IsEnabled = $true $script:chkCompressDriversToWIM.IsEnabled = $true + # AppsScriptVariables Event Handlers + $script:chkDefineAppsScriptVariables.Add_Checked({ + $script:appsScriptVariablesPanel.Visibility = 'Visible' + }) + $script:chkDefineAppsScriptVariables.Add_Unchecked({ + $script:appsScriptVariablesPanel.Visibility = 'Collapsed' + }) + + $script:btnAddAppsScriptVariable.Add_Click({ + $key = $script:txtAppsScriptKey.Text.Trim() + $value = $script:txtAppsScriptValue.Text.Trim() + + if ([string]::IsNullOrWhiteSpace($key)) { + [System.Windows.MessageBox]::Show("Apps Script Variable Key cannot be empty.", "Input Error", "OK", "Warning") + return + } + # Check for duplicate keys + $existingKey = $script:lstAppsScriptVariables.Items | Where-Object { $_.Key -eq $key } + if ($existingKey) { + [System.Windows.MessageBox]::Show("An Apps Script Variable with the key '$key' already exists.", "Duplicate Key", "OK", "Warning") + return + } + + $newItem = [PSCustomObject]@{ + Key = $key + Value = $value + } + $script:lstAppsScriptVariables.Items.Add($newItem) + $script:txtAppsScriptKey.Clear() + $script:txtAppsScriptValue.Clear() + }) + + $script:btnRemoveAppsScriptVariable.Add_Click({ + if ($script:lstAppsScriptVariables.SelectedItem) { + $script:lstAppsScriptVariables.Items.Remove($script:lstAppsScriptVariables.SelectedItem) + } + else { + [System.Windows.MessageBox]::Show("Please select an Apps Script Variable to remove.", "Selection Error", "OK", "Warning") + } + }) + + $script:btnClearAppsScriptVariables.Add_Click({ + $script:lstAppsScriptVariables.Items.Clear() + }) + + # Initial state for chkDefineAppsScriptVariables based on chkInstallApps + if ($script:chkInstallApps.IsChecked) { + $script:chkDefineAppsScriptVariables.Visibility = 'Visible' + } + else { + $script:chkDefineAppsScriptVariables.Visibility = 'Collapsed' + } + # Initial state for appsScriptVariablesPanel based on chkDefineAppsScriptVariables + if ($script:chkDefineAppsScriptVariables.IsChecked) { + $script:appsScriptVariablesPanel.Visibility = 'Visible' + } + else { + $script:appsScriptVariablesPanel.Visibility = 'Collapsed' + } + }) # Function to search for Winget apps @@ -2805,6 +2887,62 @@ $btnLoadConfig.Add_Click({ Set-UIValue -ControlName 'txtApplicationPath' -PropertyName 'Text' -ConfigObject $configContent -ConfigKey 'AppsPath' -WindowInstance $window Set-UIValue -ControlName 'txtAppListJsonPath' -PropertyName 'Text' -ConfigObject $configContent -ConfigKey 'AppListPath' -WindowInstance $window + # Handle AppsScriptVariables + $appsScriptVarsKeyExists = $false + if ($configContent -is [System.Management.Automation.PSCustomObject] -and $null -ne $configContent.PSObject.Properties) { + try { + if (($configContent.PSObject.Properties.Match('AppsScriptVariables')).Count -gt 0) { + $appsScriptVarsKeyExists = $true + } + } catch { WriteLog "ERROR: Exception while trying to Match key 'AppsScriptVariables'. Error: $($_.Exception.Message)" } + } + + $lstAppsScriptVars = $window.FindName('lstAppsScriptVariables') + $chkDefineAppsScriptVars = $window.FindName('chkDefineAppsScriptVariables') + $appsScriptVarsPanel = $window.FindName('appsScriptVariablesPanel') + $lstAppsScriptVars.Items.Clear() + + if ($appsScriptVarsKeyExists -and $null -ne $configContent.AppsScriptVariables -and $configContent.AppsScriptVariables -is [System.Management.Automation.PSCustomObject]) { + WriteLog "LoadConfig: Processing AppsScriptVariables from config." + $loadedVars = $configContent.AppsScriptVariables + $hasVars = $false + foreach ($prop in $loadedVars.PSObject.Properties) { + $lstAppsScriptVars.Items.Add([PSCustomObject]@{ Key = $prop.Name; Value = $prop.Value }) + $hasVars = $true + } + if ($hasVars) { + $chkDefineAppsScriptVars.IsChecked = $true + $appsScriptVarsPanel.Visibility = 'Visible' + WriteLog "LoadConfig: Loaded AppsScriptVariables and checked 'Define Apps Script Variables'." + } else { + $chkDefineAppsScriptVars.IsChecked = $false + $appsScriptVarsPanel.Visibility = 'Collapsed' + WriteLog "LoadConfig: AppsScriptVariables key was present but empty. Unchecked 'Define Apps Script Variables'." + } + } elseif ($appsScriptVarsKeyExists -and $null -ne $configContent.AppsScriptVariables -and $configContent.AppsScriptVariables -is [hashtable]) { + # Handle if it's already a hashtable (e.g., from older config or direct creation) + WriteLog "LoadConfig: Processing AppsScriptVariables (Hashtable) from config." + $loadedVars = $configContent.AppsScriptVariables + $hasVars = $false + foreach ($keyName in $loadedVars.Keys) { + $lstAppsScriptVars.Items.Add([PSCustomObject]@{ Key = $keyName; Value = $loadedVars[$keyName] }) + $hasVars = $true + } + if ($hasVars) { + $chkDefineAppsScriptVars.IsChecked = $true + $appsScriptVarsPanel.Visibility = 'Visible' + WriteLog "LoadConfig: Loaded AppsScriptVariables (Hashtable) and checked 'Define Apps Script Variables'." + } else { + $chkDefineAppsScriptVars.IsChecked = $false + $appsScriptVarsPanel.Visibility = 'Collapsed' + WriteLog "LoadConfig: AppsScriptVariables (Hashtable) key was present but empty. Unchecked 'Define Apps Script Variables'." + } + } else { + $chkDefineAppsScriptVars.IsChecked = $false + $appsScriptVarsPanel.Visibility = 'Collapsed' + WriteLog "LoadConfig Info: Key 'AppsScriptVariables' not found, is null, or not a PSCustomObject/Hashtable. Unchecked 'Define Apps Script Variables'." + } + # Update USB Drive selection if present in config $usbDriveListKeyExists = $false if ($configContent -is [System.Management.Automation.PSCustomObject] -and $null -ne $configContent.PSObject.Properties) { diff --git a/FFUDevelopment/BuildFFUVM_UI.xaml b/FFUDevelopment/BuildFFUVM_UI.xaml index 0b8873d..9a0207f 100644 --- a/FFUDevelopment/BuildFFUVM_UI.xaml +++ b/FFUDevelopment/BuildFFUVM_UI.xaml @@ -579,8 +579,49 @@