Fix 2025.4 release bugs#4353
Conversation
1- fixed loading of runset config having new Ginger Play configs 2- fixing Ginger Play pop up which hide behind app 3- improving Ginger Play icon style 4- aligning Ginger play icon in diffrent pages
…ases/Official-Release-2025.4' into Fix-2025.4-release-bugs
WalkthroughThis PR introduces UI enhancements and GingerPlay feature enablement checks across multiple components. Changes include reordering UI elements in the POM Learn wizard, updating image asset references, redesigning the menu button with gradients and visual states, and adding conditional GingerPlay enablement validation before feature activation. Changes
Sequence Diagram(s)sequenceDiagram
participant User as User
participant UI as TwoLevelMenuPage
participant GP as GingerPlayUtils
participant Config as GingerPlayConfiguration
participant Banner as BannerWindow
User->>UI: Click Pro Feature Button
UI->>GP: IsGingerPlayEnabled()
GP->>Config: Retrieve from Repository
alt Config Exists
Config-->>GP: GingerPlayConfiguration
GP-->>UI: Return gpConfig.GingerPlayEnabled
else Config Missing/Error
GP-->>UI: Return false
end
alt GingerPlay Enabled AND Gateway URL Configured
UI->>UI: Feature activated (previous behavior)
else GingerPlay Disabled OR No Gateway URL
UI->>Banner: ShowGingerPlayBannerWindow()
Banner->>Banner: Set Owner = Main App Window
Banner-->>User: Display Modal Banner
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes The PR spans heterogeneous changes across UI markup, image asset references, business logic, and utility methods. While individual changes are straightforward, the diversity requires separate reasoning for each cohort (XAML redesign complexity, API behavior changes, and utility logic). Visual state changes in TwoLevelMenuPage.xaml are moderately detailed, and the GingerPlay enablement flow introduces new conditional logic that warrants verification. Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (2 warnings, 1 inconclusive)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 6
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Ginger/Ginger/UserControlsLib/TwoLevelMenuLib/TwoLevelMenuPage.xaml.cs (1)
248-256: Avoid duplicate config calls and normalize URLCache the URL and
TrimEnd('/')before appending path to prevent double slashes and extra repository hits.- if (GingerPlayUtils.IsGingerPlayEnabled() && !string.IsNullOrEmpty(GingerPlayUtils.GetGingerPlayGatewayURLIfConfigured())) + var gpUrl = GingerPlayUtils.GetGingerPlayGatewayURLIfConfigured(); + if (GingerPlayUtils.IsGingerPlayEnabled() && !string.IsNullOrEmpty(gpUrl)) { try { Process.Start(new ProcessStartInfo { - FileName = GingerPlayUtils.GetGingerPlayGatewayURLIfConfigured() + "gingerplay/#/playHome", + FileName = gpUrl.TrimEnd('/') + "/gingerplay/#/playHome", UseShellExecute = true }); }Also update the else-branch comment to reflect both checks (enabled + URL).
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (6)
Ginger/Ginger/ApplicationModelsLib/POMModels/POMWizardLib/LearnWizard/POMLearnConfigWizardPage.xaml(2 hunks)Ginger/Ginger/UserControlsLib/ImageMakerLib/ImageMakerControl.xaml.cs(1 hunks)Ginger/Ginger/UserControlsLib/TwoLevelMenuLib/TwoLevelMenuPage.xaml(1 hunks)Ginger/Ginger/UserControlsLib/TwoLevelMenuLib/TwoLevelMenuPage.xaml.cs(2 hunks)Ginger/GingerCoreNET/GeneralLib/GingerPlayUtils.cs(2 hunks)Ginger/GingerCoreNET/Reports/RunsetFromReportLoader.cs(2 hunks)
🧰 Additional context used
🧠 Learnings (4)
📚 Learning: 2025-06-16T10:37:13.073Z
Learnt from: prashelke
PR: Ginger-Automation/Ginger#4232
File: Ginger/GingerCoreNET/ActionsLib/UI/VisualTesting/VRTAnalyzer.cs:19-22
Timestamp: 2025-06-16T10:37:13.073Z
Learning: In Ginger codebase, both `using amdocs.ginger.GingerCoreNET;` and `using Amdocs.Ginger.CoreNET;` are valid and serve different purposes. The first (lowercase) contains the WorkSpace class and related workspace functionality, while the second (proper case) contains drivers like GenericAppiumDriver and other core functionality. Both may be required in files that use types from both namespaces.
Applied to files:
Ginger/GingerCoreNET/GeneralLib/GingerPlayUtils.cs
📚 Learning: 2025-03-20T11:10:30.816Z
Learnt from: GokulBothe99
PR: Ginger-Automation/Ginger#4137
File: Ginger/Ginger/SourceControl/SourceControlProjectsPage.xaml.cs:21-21
Timestamp: 2025-03-20T11:10:30.816Z
Learning: The `Amdocs.Ginger.Common.SourceControlLib` namespace is required in files that reference the `GingerSolution` class for source control operations in the Ginger automation framework.
Applied to files:
Ginger/GingerCoreNET/GeneralLib/GingerPlayUtils.cs
📚 Learning: 2025-07-16T14:42:32.229Z
Learnt from: prashelke
PR: Ginger-Automation/Ginger#4254
File: Ginger/Ginger/ApplicationModelsLib/POMModels/POMWizardLib/LearnWizard/POMLearnConfigWizardPage.xaml.cs:70-73
Timestamp: 2025-07-16T14:42:32.229Z
Learning: In Ginger/Ginger/ApplicationModelsLib/POMModels/POMWizardLib/LearnWizard/POMLearnConfigWizardPage.xaml.cs, prashelke prefers to keep the current `!WorkSpace.Instance.BetaFeatures.ShowPOMForAI` logic for binding and showing AI POM controls, rather than changing it to positive logic.
Applied to files:
Ginger/Ginger/ApplicationModelsLib/POMModels/POMWizardLib/LearnWizard/POMLearnConfigWizardPage.xaml
📚 Learning: 2025-08-22T14:57:03.711Z
Learnt from: prashelke
PR: Ginger-Automation/Ginger#4280
File: Ginger/Ginger/ApplicationModelsLib/POMModels/POMWizardLib/LearnWizard/POMLearnConfigWizardPage.xaml:71-103
Timestamp: 2025-08-22T14:57:03.711Z
Learning: In Ginger POM wizard, prashelke prefers to show AI-powered features as visible to users but disabled by default (Visibility="Visible", IsEnabled="False") to promote feature discoverability rather than hiding them completely. Users should be able to see what AI capabilities are available even when not yet enabled.
Applied to files:
Ginger/Ginger/ApplicationModelsLib/POMModels/POMWizardLib/LearnWizard/POMLearnConfigWizardPage.xaml
🧬 Code graph analysis (3)
Ginger/GingerCoreNET/GeneralLib/GingerPlayUtils.cs (3)
Ginger/GingerCoreCommon/External/Configurations/GingerPlayConfiguration.cs (1)
GingerPlayConfiguration(23-253)Ginger/GingerCoreNET/WorkSpaceLib/WorkSpace.cs (1)
WorkSpace(61-1006)Ginger/GingerCoreCommon/ReporterLib/Reporter.cs (1)
Reporter(28-357)
Ginger/GingerCoreNET/Reports/RunsetFromReportLoader.cs (1)
Ginger/GingerCoreNET/RunLib/DynamicExecutionLib/DynamicExecutionManager.cs (3)
GingerExecConfig(443-1048)GingerExecConfig(1050-1053)DynamicExecutionManager(54-1909)
Ginger/Ginger/UserControlsLib/TwoLevelMenuLib/TwoLevelMenuPage.xaml.cs (2)
Ginger/GingerCoreNET/GeneralLib/GingerPlayUtils.cs (3)
GingerPlayUtils(10-69)IsGingerPlayEnabled(51-68)GetGingerPlayGatewayURLIfConfigured(32-49)Ginger/Ginger/MainWindow.xaml.cs (2)
MainWindow(73-1943)MainWindow(85-105)
🔇 Additional comments (3)
Ginger/GingerCoreNET/GeneralLib/GingerPlayUtils.cs (2)
51-68: LGTM: Safe enablement check with loggingReturns false on missing config/errors and logs appropriately. No functional issues.
5-5: Remove unused using to avoid new build warnings
using OpenQA.Selenium.DevTools.V137.Audits;at line 5 is not referenced anywhere in the file and should be removed to comply with the PR's "no new build warnings" requirement.Ginger/GingerCoreNET/Reports/RunsetFromReportLoader.cs (1)
31-31: Remove unused using
using GingerCore.Drivers.Selenium.SeleniumBMP;is not referenced within the file and should be removed to prevent build warnings.
| <TextBlock | ||
| Text="AI Integration Options" | ||
| FontWeight="Bold" | ||
| FontSize="14" | ||
| VerticalAlignment="Center" /> | ||
| <Viewbox Width="16" Height="16" Margin="5,0,5,0"> |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
AI header reorder is fine; add a minor accessibility cue
The new “AI Integration Options” header before the icon improves scan order and preserves disabled discoverability (per learnings). Consider adding AutomationProperties.Name to ensure screen readers announce it consistently, or switch to a Label style used elsewhere. Based on learnings
Also applies to: 96-96
🤖 Prompt for AI Agents
In
Ginger/Ginger/ApplicationModelsLib/POMModels/POMWizardLib/LearnWizard/POMLearnConfigWizardPage.xaml
around lines 74-79 (and also apply the same change at line 96), the new "AI
Integration Options" TextBlock header needs an accessibility cue so screen
readers announce it consistently; add an AutomationProperties.Name attribute
with the same visible text (or replace the TextBlock with the project’s reusable
Label style that already sets automation properties) to ensure proper
accessibility, and apply the identical change to the other header occurrence at
line 96.
| SetAsStaticImage("GingerPlayWhiteGradiant.png", Width:20,Height:20); | ||
| break; |
There was a problem hiding this comment.
Prevent stale Width/Height from persisting across image changes
Setting 20x20 here is fine, but ImageMakerControl never clears xStaticImage dimensions. If this instance later renders another static image without explicit Width/Height, the previous 20x20 can wrongly constrain it. Fix by clearing when not provided.
Apply inside SetAsStaticImage:
private void SetAsStaticImage(string imageName = "", BitmapImage imageBitMap = null, double Width = 0, double Height = 0)
{
xStaticImage.Visibility = Visibility.Visible;
- if (Width > 0)
- {
- xStaticImage.Width = Width;
- }
+ if (Width > 0)
+ {
+ xStaticImage.Width = Width;
+ }
+ else
+ {
+ xStaticImage.ClearValue(FrameworkElement.WidthProperty);
+ }
- if (Height > 0)
- {
- xStaticImage.Height = Height;
- }
+ if (Height > 0)
+ {
+ xStaticImage.Height = Height;
+ }
+ else
+ {
+ xStaticImage.ClearValue(FrameworkElement.HeightProperty);
+ }
if (imageBitMap != null)
{
xStaticImage.Source = imageBitMap;
}
else
{
xStaticImage.Source = GetImageBitMap(imageName);
}
}Also applies to: 1308-1327
🤖 Prompt for AI Agents
In Ginger/Ginger/UserControlsLib/ImageMakerLib/ImageMakerControl.xaml.cs around
lines 218-219 (and similarly at 1308-1327), the call sets Width/Height to 20
which can persist on xStaticImage for later images; modify SetAsStaticImage so
it only sets Width/Height when explicit values are passed and otherwise clears
any previous values (e.g., use
ClearValue(WidthProperty)/ClearValue(HeightProperty) or set to Double.NaN) so a
subsequent call without dimensions does not inherit the old 20x20 constraints.
| <Button x:Name="xUpgradeButton" | ||
| Width="105" | ||
| Height="29" | ||
| Cursor="Hand" | ||
| VerticalAlignment="Top" | ||
| HorizontalAlignment="Right" | ||
| Margin="10,5,20,10" | ||
| ToolTip="Unlock Pro Features with Ginger Play" | ||
| Click="ProFeatureButtonClick" | ||
| Background="Transparent" | ||
| BorderThickness="0"> | ||
| Width="132" | ||
| Height="34" | ||
| Cursor="Hand" | ||
| VerticalAlignment="Top" | ||
| HorizontalAlignment="Right" | ||
| Margin="0,3,15,0" | ||
| ToolTip="Unlock Pro Features with Ginger Play" | ||
| Click="ProFeatureButtonClick" | ||
| Background="Transparent" | ||
| BorderThickness="0"> | ||
| <Button.Template> |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Add AutomationId and focus visuals for the top-right button
For UI automation and keyboard users, add AutomationProperties.AutomationId and an explicit focus visual in the template.
-<Button x:Name="xUpgradeButton"
+<Button x:Name="xUpgradeButton"
+ AutomationProperties.AutomationId="GingerPlayButton AID"
Width="132"
Height="34"
Cursor="Hand"Inside the ControlTemplate, consider adding a simple focus rectangle (e.g., an AdornerDecorator or a dashed Border shown when IsKeyboardFocused==True).
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <Button x:Name="xUpgradeButton" | |
| Width="105" | |
| Height="29" | |
| Cursor="Hand" | |
| VerticalAlignment="Top" | |
| HorizontalAlignment="Right" | |
| Margin="10,5,20,10" | |
| ToolTip="Unlock Pro Features with Ginger Play" | |
| Click="ProFeatureButtonClick" | |
| Background="Transparent" | |
| BorderThickness="0"> | |
| Width="132" | |
| Height="34" | |
| Cursor="Hand" | |
| VerticalAlignment="Top" | |
| HorizontalAlignment="Right" | |
| Margin="0,3,15,0" | |
| ToolTip="Unlock Pro Features with Ginger Play" | |
| Click="ProFeatureButtonClick" | |
| Background="Transparent" | |
| BorderThickness="0"> | |
| <Button.Template> | |
| <Button x:Name="xUpgradeButton" | |
| AutomationProperties.AutomationId="GingerPlayButton AID" | |
| Width="132" | |
| Height="34" | |
| Cursor="Hand" | |
| VerticalAlignment="Top" | |
| HorizontalAlignment="Right" | |
| Margin="0,3,15,0" | |
| ToolTip="Unlock Pro Features with Ginger Play" | |
| Click="ProFeatureButtonClick" | |
| Background="Transparent" | |
| BorderThickness="0"> | |
| <Button.Template> |
🤖 Prompt for AI Agents
In Ginger/Ginger/UserControlsLib/TwoLevelMenuLib/TwoLevelMenuPage.xaml around
lines 66–77, the top‑right Button lacks an AutomationId and explicit focus
visuals; add AutomationProperties.AutomationId="xUpgradeButton" (or a unique id)
on the Button and ensure Focusable="True", then update its ControlTemplate to
include a visible focus indicator (for example a Border or AdornerDecorator
whose visibility/style is driven by a Trigger/VisualState when IsKeyboardFocused
or IsFocused is true — e.g., change border dash/brush or show a focus rectangle)
so keyboard users and UI automation can identify and navigate the control.
| <Border x:Name="border" | ||
| CornerRadius="17" | ||
| SnapsToDevicePixels="True" | ||
| BorderThickness="0" | ||
| Padding="2"> | ||
| <Border.Background> | ||
| <LinearGradientBrush StartPoint="0,0" EndPoint="1,0"> | ||
| <GradientStop Color="#FFD600" Offset="0.3"/> | ||
| <GradientStop Color="#FF3CAC" Offset="1"/> | ||
| <GradientStop Color="#FFD700" Offset="0"/> | ||
| <GradientStop Color="#FFA500" Offset="0.5"/> | ||
| <GradientStop Color="#FF1493" Offset="1"/> | ||
| </LinearGradientBrush> | ||
| </Border.Background> | ||
| <Grid Margin="8,0,8,0"> | ||
| <Grid.ColumnDefinitions> | ||
| <ColumnDefinition Width="22"/> | ||
| <ColumnDefinition Width="*"/> | ||
| </Grid.ColumnDefinitions> | ||
| <usercontrols:ImageMakerControl | ||
| ImageType="GingerPlayGradiantBlack" | ||
| Foreground="White" | ||
| SetAsFontImageWithSize="16" | ||
| Height="18" | ||
| VerticalAlignment="Center" | ||
| HorizontalAlignment="Left"/> | ||
| <TextBlock | ||
| Text="Ginger Play" | ||
| Foreground="White" | ||
| FontWeight="Bold" | ||
| FontSize="12" | ||
| Grid.Column="1" | ||
| VerticalAlignment="Center" | ||
| HorizontalAlignment="Left"/> | ||
| </Grid> | ||
| <Border.Effect> | ||
| <DropShadowEffect BlurRadius="12" | ||
| ShadowDepth="3" | ||
| Direction="270" | ||
| Color="#FF1493" | ||
| Opacity="0.4"/> | ||
| </Border.Effect> | ||
|
|
||
| <!-- Inner white border for professional look --> | ||
| <Border CornerRadius="16" | ||
| Background="White" | ||
| Opacity="0.95" | ||
| Padding="1"> | ||
| <Border CornerRadius="15"> | ||
| <Border.Background> | ||
| <LinearGradientBrush StartPoint="0,0" EndPoint="1,0"> | ||
| <GradientStop Color="#FFD700" Offset="0"/> | ||
| <GradientStop Color="#FFA500" Offset="0.5"/> | ||
| <GradientStop Color="#FF1493" Offset="1"/> | ||
| </LinearGradientBrush> | ||
| </Border.Background> | ||
|
|
||
| <Grid Margin="10,0,10,0"> | ||
| <Grid.ColumnDefinitions> | ||
| <ColumnDefinition Width="20"/> | ||
| <ColumnDefinition Width="*"/> | ||
| <ColumnDefinition Width="Auto"/> | ||
| </Grid.ColumnDefinitions> | ||
|
|
||
| <!-- Icon --> | ||
| <Viewbox Grid.Column="0" | ||
| Width="20" | ||
| Height="20" | ||
| VerticalAlignment="Center" | ||
| HorizontalAlignment="Left"> | ||
| <usercontrols:ImageMakerControl | ||
| ImageType="GingerPlayGradiantBlack" | ||
| Foreground="White" | ||
| SetAsFontImageWithSize="16"/> | ||
| </Viewbox> | ||
|
|
||
| <!-- Text --> | ||
| <TextBlock Text="Ginger" | ||
| Grid.Column="1" | ||
| Foreground="White" | ||
| FontWeight="Bold" | ||
| FontSize="12.5" | ||
| VerticalAlignment="Center" | ||
| HorizontalAlignment="Left" | ||
| Margin="6,1,0,0"> | ||
| <TextBlock.Effect> | ||
| <DropShadowEffect BlurRadius="2" | ||
| ShadowDepth="1" | ||
| Color="#40000000" | ||
| Opacity="0.6"/> | ||
| </TextBlock.Effect> | ||
| </TextBlock> | ||
|
|
||
| <!-- PRO Badge --> | ||
| <Border Grid.Column="2" | ||
| Background="White" | ||
| CornerRadius="9" | ||
| Padding="6,2,6,3" | ||
| Margin="4,0,0,0" | ||
| VerticalAlignment="Center"> | ||
| <TextBlock Text="PLAY" | ||
| FontWeight="Black" | ||
| FontSize="9" | ||
| Foreground="#FF1493" | ||
| VerticalAlignment="Center" | ||
| HorizontalAlignment="Center"/> | ||
| </Border> | ||
| </Grid> | ||
| </Border> | ||
| </Border> | ||
| </Border> |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Externalize hard-coded colors and simplify the icon usage
- Move gradient and shadow colors to theme resources (e.g.,
$PrimaryGradient*,$AccentPink) to support theming and dark mode. - The inner
ImageMakerControlusesImageType="GingerPlayGradiantBlack"(a static image) but also setsForegroundandSetAsFontImageWithSize, which only affect font icons. Remove those properties to avoid confusion.
-<usercontrols:ImageMakerControl
- ImageType="GingerPlayGradiantBlack"
- Foreground="White"
- SetAsFontImageWithSize="16"/>
+<usercontrols:ImageMakerControl ImageType="GingerPlayGradiantBlack"/>🤖 Prompt for AI Agents
In Ginger/Ginger/UserControlsLib/TwoLevelMenuLib/TwoLevelMenuPage.xaml around
lines 79 to 166, replace the hard-coded gradient and shadow colors with theme
resource keys (e.g., PrimaryGradientStart, PrimaryGradientMid,
PrimaryGradientEnd, AccentPink, TextOnPrimary) by changing the GradientStop
Color attributes, DropShadowEffect Color/Opacity and text/ badge Foreground
values to StaticResource references; and simplify the icon usage by removing the
Foreground and SetAsFontImageWithSize attributes from the ImageMakerControl
(leave only ImageType="GingerPlayGradiantBlack" or switch to a font-based
ImageType if you intend to use Foreground), so the control isn’t given
conflicting properties and colors are driven from theme resources for
theming/dark-mode support.
| Owner = Application.Current.MainWindow | ||
| }; |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Set banner Owner defensively
Application.Current can be null in edge contexts (design-time/tests). Use null-propagation; WPF accepts null Owner.
- Owner = Application.Current.MainWindow
+ Owner = Application.Current?.MainWindow🤖 Prompt for AI Agents
In Ginger/Ginger/UserControlsLib/TwoLevelMenuLib/TwoLevelMenuPage.xaml.cs around
lines 323 to 324, the Banner's Owner is being set to
Application.Current.MainWindow which can throw when Application.Current is null
in design-time or tests; change the assignment to use null-propagation so Owner
is set defensively (e.g., Owner = Application.Current?.MainWindow) since WPF
accepts a null Owner.
| GingerExecConfig executionConfig = DynamicExecutionManager.DeserializeDynamicExecutionFromJSON(response.RequestDetails.ExecutionConfigurations); | ||
| executionConfig.ExecutionID = response.Id; | ||
|
|
||
| return executionConfig; |
There was a problem hiding this comment.
Guard against null/empty ExecutionConfigurations before deserialization
response.RequestDetails or .ExecutionConfigurations can be null/empty; deserializing will throw. Add a null/whitespace check and fail gracefully.
- GingerExecConfig executionConfig = DynamicExecutionManager.DeserializeDynamicExecutionFromJSON(response.RequestDetails.ExecutionConfigurations);
+ var execConfigsJson = response.RequestDetails?.ExecutionConfigurations;
+ if (string.IsNullOrWhiteSpace(execConfigsJson))
+ {
+ // Nothing to materialize; return null to let caller handle absence
+ return null;
+ }
+ GingerExecConfig executionConfig = DynamicExecutionManager.DeserializeDynamicExecutionFromJSON(execConfigsJson);
executionConfig.ExecutionID = response.Id;📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| GingerExecConfig executionConfig = DynamicExecutionManager.DeserializeDynamicExecutionFromJSON(response.RequestDetails.ExecutionConfigurations); | |
| executionConfig.ExecutionID = response.Id; | |
| return executionConfig; | |
| var execConfigsJson = response.RequestDetails?.ExecutionConfigurations; | |
| if (string.IsNullOrWhiteSpace(execConfigsJson)) | |
| { | |
| // Nothing to materialize; return null to let caller handle absence | |
| return null; | |
| } | |
| GingerExecConfig executionConfig = DynamicExecutionManager.DeserializeDynamicExecutionFromJSON(execConfigsJson); | |
| executionConfig.ExecutionID = response.Id; | |
| return executionConfig; |
🤖 Prompt for AI Agents
In Ginger/GingerCoreNET/Reports/RunsetFromReportLoader.cs around lines 163-166,
the code directly deserializes response.RequestDetails.ExecutionConfigurations
which can be null or whitespace and will throw; add a guard that first checks
response.RequestDetails != null and
!string.IsNullOrWhiteSpace(response.RequestDetails.ExecutionConfigurations) and
if the check fails return null (or a suitable empty/failed result) instead of
calling Deserialize, otherwise proceed to deserialize and set
executionConfig.ExecutionID = response.Id; ensure any returned failure is
documented or logged so the caller can handle it.
1d06fbd
into
Releases/Published-Official-Releases/Official-Release-2025.4
Thank you for your contribution.
Before submitting this PR, please make sure:
Summary by CodeRabbit
Release Notes
Style & UI Updates
Enhancements