@@ -15,16 +15,19 @@ import {
15
15
EuiCompressedSuperSelect ,
16
16
EuiSuperSelectOption ,
17
17
EuiText ,
18
- EuiSmallButton ,
18
+ EuiSmallButtonIcon ,
19
+ EuiFlexGroup ,
20
+ EuiFlexItem ,
19
21
} from '@elastic/eui' ;
20
22
import {
21
23
MODEL_STATE ,
22
24
WorkflowFormValues ,
23
25
ModelFormValue ,
24
26
ML_CHOOSE_MODEL_LINK ,
25
- ML_REMOTE_MODEL_LINK ,
27
+ FETCH_ALL_QUERY_LARGE ,
26
28
} from '../../../../../common' ;
27
- import { AppState } from '../../../../store' ;
29
+ import { AppState , searchModels , useAppDispatch } from '../../../../store' ;
30
+ import { getDataSourceId } from '../../../../utils' ;
28
31
29
32
interface ModelFieldProps {
30
33
fieldPath : string ; // the full path in string-form to the field (e.g., 'ingest.enrich.processors.text_embedding_processor.inputField')
@@ -47,6 +50,8 @@ type ModelItem = ModelFormValue & {
47
50
* A specific field for selecting existing deployed models
48
51
*/
49
52
export function ModelField ( props : ModelFieldProps ) {
53
+ const dispatch = useAppDispatch ( ) ;
54
+ const dataSourceId = getDataSourceId ( ) ;
50
55
// Initial store is fetched when loading base <DetectorDetail /> page. We don't
51
56
// re-fetch here as it could overload client-side if user clicks back and forth /
52
57
// keeps re-rendering this component (and subsequently re-fetching data) as they're building flows
@@ -94,31 +99,6 @@ export function ModelField(props: ModelFieldProps) {
94
99
< EuiSpacer size = "s" />
95
100
</ >
96
101
) }
97
- { isEmpty ( deployedModels ) && (
98
- < >
99
- < EuiCallOut
100
- size = "s"
101
- title = "No deployed models found"
102
- iconType = { 'alert' }
103
- color = "warning"
104
- >
105
- < EuiText size = "s" >
106
- To create and deploy models and make them accessible in
107
- OpenSearch, see documentation.
108
- </ EuiText >
109
- < EuiSpacer size = "s" />
110
- < EuiSmallButton
111
- target = "_blank"
112
- href = { ML_REMOTE_MODEL_LINK }
113
- iconSide = "right"
114
- iconType = { 'popout' }
115
- >
116
- Documentation
117
- </ EuiSmallButton >
118
- </ EuiCallOut >
119
- < EuiSpacer size = "s" />
120
- </ >
121
- ) }
122
102
< Field name = { props . fieldPath } >
123
103
{ ( { field, form } : FieldProps ) => {
124
104
const isInvalid =
@@ -140,45 +120,64 @@ export function ModelField(props: ModelFieldProps) {
140
120
isInvalid = { isInvalid }
141
121
error = { props . showError && getIn ( errors , `${ field . name } .id` ) }
142
122
>
143
- < EuiCompressedSuperSelect
144
- data-testid = "selectDeployedModel"
145
- fullWidth = { props . fullWidth }
146
- disabled = { isEmpty ( deployedModels ) }
147
- options = { deployedModels . map (
148
- ( option ) =>
149
- ( {
150
- value : option . id ,
151
- inputDisplay : (
152
- < >
153
- < EuiText size = "s" > { option . name } </ EuiText >
154
- </ >
155
- ) ,
156
- dropdownDisplay : (
157
- < >
158
- < EuiText size = "s" > { option . name } </ EuiText >
159
- < EuiText size = "xs" color = "subdued" >
160
- Deployed
161
- </ EuiText >
162
- < EuiText size = "xs" color = "subdued" >
163
- { option . algorithm }
164
- </ EuiText >
165
- </ >
166
- ) ,
167
- disabled : false ,
168
- } as EuiSuperSelectOption < string > )
169
- ) }
170
- valueOfSelected = { field . value ?. id || '' }
171
- onChange = { ( option : string ) => {
172
- form . setFieldTouched ( props . fieldPath , true ) ;
173
- form . setFieldValue ( props . fieldPath , {
174
- id : option ,
175
- } as ModelFormValue ) ;
176
- if ( props . onModelChange ) {
177
- props . onModelChange ( option ) ;
178
- }
179
- } }
180
- isInvalid = { isInvalid }
181
- />
123
+ < EuiFlexGroup direction = "row" gutterSize = "xs" >
124
+ < EuiFlexItem grow = { true } >
125
+ < EuiCompressedSuperSelect
126
+ data-testid = "selectDeployedModel"
127
+ fullWidth = { props . fullWidth }
128
+ disabled = { isEmpty ( deployedModels ) }
129
+ options = { deployedModels . map (
130
+ ( option ) =>
131
+ ( {
132
+ value : option . id ,
133
+ inputDisplay : (
134
+ < >
135
+ < EuiText size = "s" > { option . name } </ EuiText >
136
+ </ >
137
+ ) ,
138
+ dropdownDisplay : (
139
+ < >
140
+ < EuiText size = "s" > { option . name } </ EuiText >
141
+ < EuiText size = "xs" color = "subdued" >
142
+ Deployed
143
+ </ EuiText >
144
+ < EuiText size = "xs" color = "subdued" >
145
+ { option . algorithm }
146
+ </ EuiText >
147
+ </ >
148
+ ) ,
149
+ disabled : false ,
150
+ } as EuiSuperSelectOption < string > )
151
+ ) }
152
+ valueOfSelected = { field . value ?. id || '' }
153
+ onChange = { ( option : string ) => {
154
+ form . setFieldTouched ( props . fieldPath , true ) ;
155
+ form . setFieldValue ( props . fieldPath , {
156
+ id : option ,
157
+ } as ModelFormValue ) ;
158
+ if ( props . onModelChange ) {
159
+ props . onModelChange ( option ) ;
160
+ }
161
+ } }
162
+ isInvalid = { isInvalid }
163
+ />
164
+ </ EuiFlexItem >
165
+ < EuiFlexItem grow = { false } >
166
+ < EuiSmallButtonIcon
167
+ iconType = { 'refresh' }
168
+ aria-label = "refresh"
169
+ display = "base"
170
+ onClick = { ( ) => {
171
+ dispatch (
172
+ searchModels ( {
173
+ apiBody : FETCH_ALL_QUERY_LARGE ,
174
+ dataSourceId,
175
+ } )
176
+ ) ;
177
+ } }
178
+ />
179
+ </ EuiFlexItem >
180
+ </ EuiFlexGroup >
182
181
</ EuiCompressedFormRow >
183
182
) ;
184
183
} }
0 commit comments