@@ -26,7 +26,7 @@ import { Icon } from "./Icon";
2626const widgetName = "Search" ;
2727
2828export type SearchProps = {
29- value ?: string ;
29+ value ?: string | { [ key : string ] : unknown } ;
3030 placeholder ?: string ;
3131 searchKey ?: string ;
3232 selectedLabel ?: { [ key : string ] : unknown } ;
@@ -58,6 +58,7 @@ export const Search: React.FC<SearchProps> = ({
5858} ) => {
5959 const [ searchValue , setSearchValue ] = useState < string | null > ( null ) ;
6060 const [ value , setValue ] = useState < unknown > ( ) ;
61+ const [ selectedObject , setSelectedObject ] = useState < unknown > ( null ) ;
6162
6263 const { namedData } = useTemplateData ( {
6364 data : itemTemplate ?. data ,
@@ -143,8 +144,14 @@ export const Search: React.FC<SearchProps> = ({
143144 ( option ) => extractValue ( option ) === selectedValue ,
144145 ) ;
145146
147+ const fullSelectedObject = get ( selectedOption , [
148+ itemTemplate . name ,
149+ ] ) as unknown ;
150+ // store full object separately only for selectedLabel rendering
151+ setSelectedObject ( fullSelectedObject ) ;
152+
146153 onSelectAction ?. callback ( {
147- value : get ( selectedOption , [ itemTemplate . name ] ) as unknown ,
154+ value : fullSelectedObject ,
148155 } ) ;
149156 }
150157 } ,
@@ -153,6 +160,8 @@ export const Search: React.FC<SearchProps> = ({
153160
154161 const handleClear = useCallback ( ( ) => {
155162 setSearchValue ( null ) ;
163+ setValue ( null ) ;
164+ setSelectedObject ( null ) ;
156165 onClearAction ?. callback ( ) ;
157166 } , [ onClearAction ?. callback ] ) ;
158167
@@ -169,27 +178,72 @@ export const Search: React.FC<SearchProps> = ({
169178 : EnsembleRuntime . render ( [ unwrapWidget ( notFoundContent ) ] ) ;
170179 } , [ values ?. notFoundContent ] ) ;
171180
181+ const selectDefaultValue = useMemo ( ( ) => {
182+ if ( ! values ?. initialValue ) return undefined ;
183+
184+ if ( isObject ( values . initialValue ) ) {
185+ const extractedValue = extractValue ( {
186+ [ itemTemplate ?. name ?? "" ] : values . initialValue ,
187+ } ) ;
188+ return String ( extractedValue ) ;
189+ }
190+
191+ return String ( values . initialValue ) ;
192+ } , [ values ?. initialValue , extractValue , itemTemplate ?. name ] ) ;
193+
172194 const renderLabel = useCallback (
173195 ( label : React . ReactNode , labelValue : string | number ) : React . ReactNode => {
174- if ( isNil ( rest . selectedLabel ) || isEmpty ( namedData ) ) {
175- return label ;
196+ // if we have selectedLabel and a selected object (from selection or initial object value)
197+ if ( ! isNil ( rest . selectedLabel ) && selectedObject ) {
198+ return (
199+ < CustomScopeProvider
200+ value = { { value : { [ itemTemplate ?. name ?? "" ] : selectedObject } } }
201+ >
202+ { EnsembleRuntime . render ( [ unwrapWidget ( rest . selectedLabel ) ] ) }
203+ </ CustomScopeProvider >
204+ ) ;
176205 }
177206
178- const option = namedData . find (
179- ( item ) => extractValue ( item ) === labelValue ,
180- ) ;
181- return (
182- < CustomScopeProvider value = { { value : option } } >
183- { EnsembleRuntime . render ( [ unwrapWidget ( rest . selectedLabel ) ] ) }
184- </ CustomScopeProvider >
185- ) ;
207+ // if we have selectedLabel but no selectedObject, try to find from namedData
208+ if ( ! isNil ( rest . selectedLabel ) && ! isEmpty ( namedData ) ) {
209+ const option = namedData . find (
210+ ( item ) => extractValue ( item ) === labelValue ,
211+ ) ;
212+ if ( option ) {
213+ return (
214+ < CustomScopeProvider value = { { value : option } } >
215+ { EnsembleRuntime . render ( [ unwrapWidget ( rest . selectedLabel ) ] ) }
216+ </ CustomScopeProvider >
217+ ) ;
218+ }
219+ }
220+
221+ return label ;
186222 } ,
187- [ extractValue , namedData , rest . selectedLabel ] ,
223+ [
224+ extractValue ,
225+ itemTemplate ?. name ,
226+ namedData ,
227+ rest . selectedLabel ,
228+ selectedObject ,
229+ ] ,
188230 ) ;
189231
190232 useEffect ( ( ) => {
191- if ( ! value ) setValue ( values ?. initialValue ) ;
192- } , [ value , values ?. initialValue ] ) ;
233+ if ( ! value && values ?. initialValue ) {
234+ if ( isObject ( values . initialValue ) ) {
235+ // if initial value is an object, extract the key for widget value and store full object
236+ const extractedValue = extractValue ( {
237+ [ itemTemplate ?. name ?? "" ] : values . initialValue ,
238+ } ) ;
239+ setValue ( extractedValue ) ;
240+ setSelectedObject ( values . initialValue ) ;
241+ } else {
242+ // if initial value is primitive, use it directly
243+ setValue ( values . initialValue ) ;
244+ }
245+ }
246+ } , [ value , values ?. initialValue , extractValue , itemTemplate ?. name ] ) ;
193247
194248 return (
195249 < div
@@ -220,7 +274,7 @@ export const Search: React.FC<SearchProps> = ({
220274 < SelectComponent
221275 allowClear
222276 className = { `${ values ?. styles ?. names || "" } ${ id } _input` }
223- defaultValue = { values ?. initialValue }
277+ defaultValue = { selectDefaultValue }
224278 filterOption = { false }
225279 id = { values ?. id }
226280 labelRender = { ( { label, value : labelValue } ) : React . ReactNode =>
0 commit comments