triggerCustomQuery method Null safety
- {Option? options}
can be used to execute queries for the dependent/watcher components.
Implementation
Future triggerCustomQuery({Option? options}) async {
// Generate query again after resetting changes
final generatedQuery = this._generateQuery();
if (generatedQuery.requestBody.length != 0) {
if (isEqual(this._query, generatedQuery.requestBody)) {
return Future.value(true);
}
// set the request loading to true for all the requests
generatedQuery.orderOfQueries.forEach((id) {
final componentInstance = this._parent!.getSearchWidget(id);
if (componentInstance != null) {
// Reset `from` and `after` values
componentInstance.setFrom(0,
options: new Options(
triggerDefaultQuery: false,
triggerCustomQuery: false,
stateChanges: true));
componentInstance.setAfter(null,
options: new Options(
triggerDefaultQuery: false,
triggerCustomQuery: false,
stateChanges: true));
componentInstance._setRequestStatus(RequestStatus.PENDING,
options: options);
// Update the query
componentInstance._updateQuery();
}
});
try {
// Re-generate query after changes
final finalGeneratedQuery = this._generateQuery();
final results = await this._fetchRequest({
'query': finalGeneratedQuery.requestBody,
'settings': this.appbaseSettings?.toJSON()
}, false);
// Update the state for components
finalGeneratedQuery.orderOfQueries.forEach((id) {
final componentInstance = this._parent!.getSearchWidget(id);
if (componentInstance != null) {
componentInstance._setRequestStatus(RequestStatus.INACTIVE,
options: options);
// Reset value for dependent components after fist query is made
// We wait for first query to not clear filters applied by URL params
if (this.clearOnQueryChange && this._query != null) {
componentInstance.setValue(null,
options: new Options(
triggerDefaultQuery: false,
triggerCustomQuery: false,
stateChanges: true));
}
// Update the results
final prev = componentInstance.results;
// Collect results from the response for a particular component
Map rawResults = results[id] != null ? results[id] : {};
// Set results
if (rawResults['hits'] != null) {
componentInstance.results!.setRaw(rawResults);
componentInstance._applyOptions(
Options(stateChanges: options?.stateChanges),
'results',
prev,
componentInstance.results);
}
if (rawResults['aggregations'] != null) {
componentInstance._handleAggregationResponse(
rawResults['aggregations'],
options: new Options(stateChanges: options?.stateChanges),
append: false);
}
}
});
return Future.value(results);
} catch (e) {
return _handleError(e);
}
}
return Future.value(true);
}