diff --git a/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.test.tsx b/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.test.tsx
index 051853d4f66..7cd9ac0336e 100644
--- a/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.test.tsx
@@ -31,7 +31,24 @@ describe('ConfigEditor', () => {
delete options.jsonData.timeField;
delete options.jsonData.maxConcurrentShardRequests;
- render();
+ const { rerender } = render();
+
+ expect(mockOnOptionsChange).toHaveBeenCalledWith(
+ expect.objectContaining({
+ jsonData: expect.objectContaining({
+ timeField: '@timestamp',
+ maxConcurrentShardRequests: 5,
+ }),
+ })
+ );
+
+ // Setting options to default should happen on every render, not once.
+ mockOnOptionsChange.mockClear();
+ const updatedOptions = { ...options };
+ updatedOptions.jsonData.timeField = '';
+ // @ts-expect-error
+ updatedOptions.jsonData.maxConcurrentShardRequests = '';
+ rerender();
expect(mockOnOptionsChange).toHaveBeenCalledWith(
expect.objectContaining({
diff --git a/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.tsx b/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.tsx
index 08132c38abc..49d87f2db1b 100644
--- a/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.tsx
@@ -21,17 +21,13 @@ export const ConfigEditor = (props: Props) => {
// the access-mode-select-box vanishes)
const showAccessOptions = useRef(props.options.access === 'direct');
- const { options: originalOptions, onOptionsChange } = props;
- const options = coerceOptions(originalOptions);
+ const { options, onOptionsChange } = props;
useEffect(() => {
- if (!isValidOptions(originalOptions)) {
- onOptionsChange(coerceOptions(originalOptions));
+ if (!isValidOptions(options)) {
+ onOptionsChange(coerceOptions(options));
}
-
- // We can't enforce the eslint rule here because we only want to run this once.
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
+ }, [onOptionsChange, options]);
return (
<>
diff --git a/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.tsx b/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.tsx
index 687891ed154..e745fcc118a 100644
--- a/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.tsx
+++ b/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.tsx
@@ -22,7 +22,7 @@ export const ElasticDetails = ({ value, onChange }: Props) => {
return (
<>