Skip to content

Fix 2025.4 release bugs#4353

Merged
MeniKadosh1 merged 2 commits into
Releases/Published-Official-Releases/Official-Release-2025.4from
Fix-2025.4-release-bugs
Oct 22, 2025
Merged

Fix 2025.4 release bugs#4353
MeniKadosh1 merged 2 commits into
Releases/Published-Official-Releases/Official-Release-2025.4from
Fix-2025.4-release-bugs

Conversation

@MeniKadosh1

@MeniKadosh1 MeniKadosh1 commented Oct 22, 2025

Copy link
Copy Markdown
Contributor

Thank you for your contribution.
Before submitting this PR, please make sure:

  • PR description and commit message should describe the changes done in this PR
  • Verify the PR is pointing to correct branch i.e. Release or Beta branch if the code fix is for specific release , else point it to master
  • Latest Code from master or specific release branch is merged to your branch
  • No unwanted\commented\junk code is included
  • No new warning upon build solution
  • Code Summary\Comments are added to my code which explains what my code is doing
  • Existing unit test cases are passed
  • New Unit tests are added for your development
  • Sanity Tests are successfully executed for New and Existing Functionality
  • Verify that changes are compatible with all relevant browsers and platforms.
  • After creating pull request there should not be any conflicts
  • Resolve all Codacy comments
  • Builds and checks are passed before PR is sent for review
  • Resolve code review comments
  • Update the Help Library document to match any feature changes

Summary by CodeRabbit

Release Notes

  • Style & UI Updates

    • Redesigned Ginger Play button with enhanced gradient styling and interactive visual states (hover/pressed effects)
    • Reorganized AI Integration section layout for improved clarity
    • Updated visual assets throughout the interface
  • Enhancements

    • Ginger Play features now require explicit enablement to function

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
@coderabbitai

coderabbitai Bot commented Oct 22, 2025

Copy link
Copy Markdown
Contributor

Walkthrough

This 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

Cohort / File(s) Summary
POM Learn Wizard UI Redesign
Ginger/Ginger/ApplicationModelsLib/POMModels/POMWizardLib/LearnWizard/POMLearnConfigWizardPage.xaml
Reordered AI integration section: label moved before image; replaced single viewbox with TextBlock and Viewbox-wrapped ImageMakerControl; adjusted "Activate Smart Fine-Tuning Elements" checkbox margin from 7,10,0,10 to 0,10,0,10
Image Asset & Rendering
Ginger/Ginger/UserControlsLib/ImageMakerLib/ImageMakerControl.xaml.cs
Changed eImageType.GingerPlayLogo rendering from GingerPlayLogo.png to GingerPlayWhiteGradiant.png with fixed dimensions Width=20 and Height=20
Menu Button Redesign
Ginger/Ginger/UserControlsLib/TwoLevelMenuLib/TwoLevelMenuPage.xaml
Replaced compact grey "Upgrade" button with elaborate "Ginger Play" button featuring multi-layer gradient, chrome-like border, icon, bold label, PRO badge, and hover/pressed visual states with drop shadow effects and transform animations
GingerPlay Feature Gating
Ginger/Ginger/UserControlsLib/TwoLevelMenuLib/TwoLevelMenuPage.xaml.cs
Added IsGingerPlayEnabled() check in ProFeatureButtonClick (requires both enablement flag and gateway URL); set Owner property of banner window to main application window for proper modal anchoring
GingerPlay Utilities
Ginger/GingerCoreNET/GeneralLib/GingerPlayUtils.cs
Added public static IsGingerPlayEnabled() method that retrieves GingerPlayConfiguration from solution repository, returns gpConfig.GingerPlayEnabled if exists (false if missing or on exception)
Report Execution Deserialization
Ginger/GingerCoreNET/Reports/RunsetFromReportLoader.cs
Replaced direct JsonSerializer deserialization of GingerExecConfig with DynamicExecutionManager.DeserializeDynamicExecutionFromJSON(...); added SeleniumBMP proxy using directive

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
Loading

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

  • Maheshkale447

Poem

🐰✨ A button blooms with gradient grace,
With PRO badge shining in its place!
GingerPlay now gates what's true,
Images switch to white and new,
The wizard dances—bold, refined, & bright! 🎭

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings, 1 inconclusive)
Check name Status Explanation Resolution
Description Check ⚠️ Warning The pull request description consists entirely of a checklist template without any actual description of the changes made. The description does not explain what bugs were fixed, what modifications were implemented, or why these changes were necessary for the 2025.4 release. The checklist itself includes an item stating that "PR description and commit message should describe the changes done in this PR," which is precisely what is missing from this submission. Add a substantive PR description before the checklist that explains the specific bugs being fixed and the changes made. Describe what was changed in each modified file (POM page layout, image rendering, Ginger Play button redesign, feature enablement logic, and deserialization updates) and why these changes resolve the identified issues for the 2025.4 release. The checklist should remain as verification items, but the actual description must precede it.
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title Check ❓ Inconclusive The title "Fix 2025.4 release bugs" is vague and generic without describing the specific nature of the changes. While it correctly references the release version and indicates bug fixes, it fails to convey what the actual bugs or changes are. The changeset includes several distinct modifications across different areas: UI layout adjustments, image asset changes, Ginger Play feature integration enhancements, and deserialization logic updates. A more specific title would help reviewers and future developers understand the scope of these changes at a glance.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch Fix-2025.4-release-bugs

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 URL

Cache 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

📥 Commits

Reviewing files that changed from the base of the PR and between 6d56eb0 and 6b8048c.

📒 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 logging

Returns 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.

Comment on lines +74 to +79
<TextBlock
Text="AI Integration Options"
FontWeight="Bold"
FontSize="14"
VerticalAlignment="Center" />
<Viewbox Width="16" Height="16" Margin="5,0,5,0">

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Comment on lines +218 to 219
SetAsStaticImage("GingerPlayWhiteGradiant.png", Width:20,Height:20);
break;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

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.

Comment on lines 66 to 77
<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>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Suggested change
<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.

Comment on lines +79 to 166
<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>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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 ImageMakerControl uses ImageType="GingerPlayGradiantBlack" (a static image) but also sets Foreground and SetAsFontImageWithSize, 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.

Comment on lines +323 to 324
Owner = Application.Current.MainWindow
};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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.

Comment on lines +163 to 166
GingerExecConfig executionConfig = DynamicExecutionManager.DeserializeDynamicExecutionFromJSON(response.RequestDetails.ExecutionConfigurations);
executionConfig.ExecutionID = response.Id;

return executionConfig;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

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.

Suggested change
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.

@MeniKadosh1
MeniKadosh1 merged commit 1d06fbd into Releases/Published-Official-Releases/Official-Release-2025.4 Oct 22, 2025
11 checks passed
@MeniKadosh1
MeniKadosh1 deleted the Fix-2025.4-release-bugs branch October 22, 2025 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant