hunk.code_window:                     final ActionDTO actionDTO = actionCollectionDTO1.getActions().get(0);
                       Assert.assertEquals("testAction", actionDTO.getName());
                       Assert.assertEquals("testActionId", actionDTO.getId());
                       Assert.assertEquals("testCollection.testAction", actionDTO.getFullyQualifiedName());
                   })
                   .verifyComplete();
       }
       @Test
  
hunk.labels: keep keep keep add keep keep keep keep keep
hunk.after_edit:                     Assert.assertTrue(actionDTO.getClientSideExecution());
  
hunk.file_path: app/server/appsmith-server/src/test/java/com/appsmith/server/services/ActionCollectionServiceImplTest.java
hunk.type: add
file: import React from "react";
  import BaseWidget, { WidgetProps, WidgetState } from "../../BaseWidget";
  import { WidgetType } from "constants/WidgetConstants";
  import RadioGroupComponent from "../component";
  import { EventType } from "constants/AppsmithActionConstants/ActionConstants";
  import { RadioOption } from "../constants";
  import { ValidationTypes } from "constants/WidgetValidation";
  import { EvaluationSubstitutionType } from "entities/DataTree/dataTreeFactory";
  import { compact, isArray } from "lodash";
  
  class RadioGroupWidget extends BaseWidget<RadioGroupWidgetProps, WidgetState> {
    static getPropertyPaneConfig() {
      return [
        {
          sectionName: "General",
          children: [
            {
              helpText: "Displays a list of unique options",
              propertyName: "options",
              label: "Options",
              controlType: "OPTION_INPUT",
              isJSConvertible: true,
              isBindProperty: true,
              isTriggerProperty: false,
              validation: {
                type: ValidationTypes.ARRAY,
                unique: ["value"],
                params: {
                  default: [],
                  children: {
                    type: ValidationTypes.OBJECT,
                    params: {
                      required: true,
                      allowedKeys: [
                        {
                          name: "label",
                          type: ValidationTypes.TEXT,
                          params: {
                            default: "",
                            required: true,
                          },
                        },
                        {
                          name: "value",
                          type: ValidationTypes.TEXT,
                          params: {
                            default: "",
                            required: true,
                          },
                        },
                      ],
                    },
                  },
                },
              },
              evaluationSubstitutionType:
                EvaluationSubstitutionType.SMART_SUBSTITUTE,
            },
            {
              helpText: "Sets a default selected option",
              propertyName: "defaultOptionValue",
              label: "Default Selected Value",
              placeholderText: "Y",
              controlType: "INPUT_TEXT",
              isBindProperty: true,
              isTriggerProperty: false,
              validation: { type: ValidationTypes.TEXT },
            },
            {
              propertyName: "isRequired",
              label: "Required",
              helpText: "Makes input to the widget mandatory",
              controlType: "SWITCH",
              isJSConvertible: true,
              isBindProperty: true,
              isTriggerProperty: false,
              validation: { type: ValidationTypes.BOOLEAN },
            },
            {
              helpText: "Controls the visibility of the widget",
              propertyName: "isVisible",
              label: "Visible",
              controlType: "SWITCH",
              isJSConvertible: true,
              isBindProperty: true,
              isTriggerProperty: false,
              validation: { type: ValidationTypes.BOOLEAN },
            },
            {
              propertyName: "isDisabled",
              label: "Disabled",
              helpText: "Disables input to this widget",
              controlType: "SWITCH",
              isJSConvertible: true,
              isBindProperty: true,
              isTriggerProperty: false,
              validation: { type: ValidationTypes.BOOLEAN },
            },
            {
              propertyName: "animateLoading",
              label: "Animate Loading",
              controlType: "SWITCH",
              helpText: "Controls the loading of the widget",
              defaultValue: true,
              isJSConvertible: true,
              isBindProperty: true,
              isTriggerProperty: false,
              validation: { type: ValidationTypes.BOOLEAN },
            },
          ],
        },
        {
          sectionName: "Events",
          children: [
            {
              helpText:
                "Triggers an action when a user changes the selected option",
              propertyName: "onSelectionChange",
              label: "onSelectionChange",
              controlType: "ACTION_SELECTOR",
              isJSConvertible: true,
              isBindProperty: true,
              isTriggerProperty: true,
            },
          ],
        },
      ];
    }
    static getDerivedPropertiesMap() {
      return {
        selectedOption:
          "{{_.find(this.options, { value: this.selectedOptionValue })}}",
        isValid: `{{ this.isRequired ? !!this.selectedOptionValue : true }}`,
        value: `{{this.selectedOptionValue}}`,
      };
    }
  
    static getDefaultPropertiesMap(): Record<string, string> {
      return {
        selectedOptionValue: "defaultOptionValue",
      };
    }
  
    static getMetaPropertiesMap(): Record<string, any> {
      return {
        selectedOptionValue: undefined,
      };
    }
  
    getPageView() {
      return (
        <RadioGroupComponent
          isDisabled={this.props.isDisabled}
          isLoading={this.props.isLoading}
          key={this.props.widgetId}
          label={`${this.props.label}`}
          onRadioSelectionChange={this.onRadioSelectionChange}
          options={isArray(this.props.options) ? compact(this.props.options) : []}
          selectedOptionValue={this.props.selectedOptionValue}
          widgetId={this.props.widgetId}
        />
      );
    }
  
    onRadioSelectionChange = (updatedValue: string) => {
      this.props.updateWidgetMetaProperty("selectedOptionValue", updatedValue, {
        triggerPropertyName: "onSelectionChange",
        dynamicString: this.props.onSelectionChange,
        event: {
          type: EventType.ON_OPTION_CHANGE,
        },
      });
    };
  
    static getWidgetType(): WidgetType {
      return "RADIO_GROUP_WIDGET";
    }
  }
  
  export interface RadioGroupWidgetProps extends WidgetProps {
    label: string;
    options: RadioOption[];
    selectedOptionValue: string;
    onSelectionChange: string;
    defaultOptionValue: string;
    isRequired?: boolean;
  }
  
  export default RadioGroupWidget;
  