@@ -110,7 +110,13 @@ export default class Autocomplete {
110110 labelField : 'entityAsString' ,
111111 searchField : [ 'entityAsString' ] ,
112112 firstUrl : ( query ) => {
113- return `${ autocompleteEndpointUrl } &query=${ encodeURIComponent ( query ) } ` ;
113+ const url = new URL ( autocompleteEndpointUrl ) ;
114+ url . searchParams . append ( `query` , query ) ;
115+ this . #resolveAutocompleteDependencyFields( element ) . forEach ( ( dependency ) => {
116+ url . searchParams . append ( `autocompleteDependsOn[${ dependency . path } ]` , dependency . element . value ) ;
117+ } ) ;
118+
119+ return url . toString ( ) ;
114120 } ,
115121 // VERY IMPORTANT: use 'function (query, callback) { ... }' instead of the
116122 // '(query, callback) => { ... }' syntax because, otherwise,
@@ -145,7 +151,11 @@ export default class Autocomplete {
145151 } ,
146152 } ) ;
147153
148- return this . #initializeTomSelect( element , config ) ;
154+ const tomSelect = this . #initializeTomSelect( element , config ) ;
155+
156+ this . #bindAutocompleteDependencyFieldListeners( tomSelect ) ;
157+
158+ return tomSelect ;
149159 }
150160
151161 #initializeTomSelect( element , config ) {
@@ -258,4 +268,41 @@ export default class Autocomplete {
258268
259269 return { options, optgroups } ;
260270 }
271+
272+ #bindAutocompleteDependencyFieldListeners( tomSelect ) {
273+ this . #resolveAutocompleteDependencyFields( tomSelect . input ) . forEach ( ( dependency ) => {
274+ dependency . element . addEventListener ( 'change' , ( ) => {
275+ tomSelect . clear ( ) ;
276+ tomSelect . clearOptions ( ) ;
277+ tomSelect . clearOptionGroups ( ) ;
278+ tomSelect . clearPagination ( ) ;
279+ tomSelect . wrapper . classList . remove ( 'preloaded' ) ;
280+ } ) ;
281+ } ) ;
282+ }
283+
284+ #resolveAutocompleteDependencyFields( element ) {
285+ const dependsOn = JSON . parse ( element . getAttribute ( 'data-ea-autocomplete-depends-on' ) || '[]' ) ;
286+ const form = element . closest ( 'form' ) ;
287+
288+ if ( null === form ) {
289+ return [ ] ;
290+ }
291+
292+ return dependsOn . map ( ( field ) => {
293+ const fieldId = `${ form . name } _${ field . replaceAll ( '.' , '_' ) } ` ;
294+ const fieldElement = document . getElementById ( fieldId ) ?? document . getElementById ( `${ fieldId } _autocomplete` ) ;
295+
296+ if ( null === fieldElement ) {
297+ console . error ( `No field found for autocomplete dependency "${ field } ".` ) ;
298+ return null ;
299+ }
300+
301+ return {
302+ path : field ,
303+ element : fieldElement ,
304+ } ;
305+ } )
306+ . filter ( ( dependencyField ) => null !== dependencyField ) ;
307+ }
261308}
0 commit comments