diff --git a/app/client/src/components/formControls/HybridSearch.tsx b/app/client/src/components/formControls/HybridSearch.tsx new file mode 100644 index 0000000000..a6351dfa8d --- /dev/null +++ b/app/client/src/components/formControls/HybridSearch.tsx @@ -0,0 +1,78 @@ +import React from "react"; +import { Field, type WrappedFieldInputProps } from "redux-form"; +import BaseControl from "./BaseControl"; +import type { ControlProps } from "./BaseControl"; +import { Slider, type SliderProps, Flex, Switch, Text } from "@appsmith/ads"; + +export interface HybridSearchControlProps + extends ControlProps, + Omit {} + +export class HybridSearchControl extends BaseControl { + render() { + const { configProperty, ...rest } = this.props; + + return ( + + ); + } + + getControlType(): string { + return "HYBRID_SEARCH"; + } +} + +const renderHybridSearchControl = ( + props: { + input?: WrappedFieldInputProps; + } & HybridSearchControlProps, +) => { + const { input } = props; + + const onSliderChange = (value: number) => { + input?.onChange({ + ...input?.value, + keywordWeight: value, + semanticWeight: (10 - value * 10) / 10, // Scale by 10 to avoid floating-point issues + }); + }; + const onSwitchChange = (value: boolean) => { + input?.onChange({ + ...input?.value, + isEnabled: value, + }); + }; + + return ( + + + + Hybrid search + + + + "Semantic weight"} + isDisabled={!input?.value.isEnabled} + label="Keyword weight" + maxValue={1} + minValue={0} + onChange={onSliderChange} + step={0.1} + value={input?.value.keywordWeight} + /> + + {input?.value.keywordWeight} + {input?.value.semanticWeight} + + + + ); +}; diff --git a/app/client/src/utils/formControl/FormControlRegistry.tsx b/app/client/src/utils/formControl/FormControlRegistry.tsx index de04598286..28d9e78260 100644 --- a/app/client/src/utils/formControl/FormControlRegistry.tsx +++ b/app/client/src/utils/formControl/FormControlRegistry.tsx @@ -45,6 +45,7 @@ import { SliderControl, type SliderControlProps, } from "components/formControls/SliderControl"; +import { HybridSearchControl } from "components/formControls/HybridSearch"; /** * NOTE: If you are adding a component that uses FormControl @@ -225,6 +226,11 @@ class FormControlRegistry { }, }, ); + FormControlFactory.registerControlBuilder(formControlTypes.HYBRID_SEARCH, { + buildPropertyControl(controlProps: SliderControlProps): JSX.Element { + return ; + }, + }); } } diff --git a/app/client/src/utils/formControl/formControlTypes.ts b/app/client/src/utils/formControl/formControlTypes.ts index 830495d431..6760ce112b 100644 --- a/app/client/src/utils/formControl/formControlTypes.ts +++ b/app/client/src/utils/formControl/formControlTypes.ts @@ -22,4 +22,5 @@ export default { RAG_INTEGRATIONS: "RAG_INTEGRATIONS", SLIDER: "SLIDER", RAG_DOCUMENTS_SELECTOR: "RAG_DOCUMENTS_SELECTOR", + HYBRID_SEARCH: "HYBRID_SEARCH", };