This is an automated email from the ASF dual-hosted git repository. vogievetsky pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push: new 51c73b5a4e3 Web console: show formatted JSON value (#16632) 51c73b5a4e3 is described below commit 51c73b5a4e3e5743986cf3f24401e8cd14b8169a Author: Vadim Ogievetsky <va...@ogievetsky.com> AuthorDate: Fri Jun 21 18:33:15 2024 -0700 Web console: show formatted JSON value (#16632) * show formatted json value * update snapshot * window functions * count star can also have a window * better edit query context --- licenses.yaml | 2 +- web-console/lib/keywords.js | 3 + web-console/package-lock.json | 14 +-- web-console/package.json | 2 +- .../record-table-pane/record-table-pane.tsx | 4 +- .../edit-context-dialog.spec.tsx.snap | 100 ++++++++++++++++++-- .../edit-context-dialog/edit-context-dialog.scss | 21 +---- .../edit-context-dialog.spec.tsx | 6 +- .../edit-context-dialog/edit-context-dialog.tsx | 102 +++++++++------------ .../__snapshots__/show-value-dialog.spec.tsx.snap | 88 ++++++++++-------- .../show-value-dialog/show-value-dialog.scss | 23 +++-- .../show-value-dialog/show-value-dialog.tsx | 62 +++++++++++-- .../string-menu-items/string-menu-items.tsx | 2 +- .../result-table-pane/result-table-pane.tsx | 4 +- .../views/workbench-view/run-panel/run-panel.tsx | 2 +- 15 files changed, 280 insertions(+), 155 deletions(-) diff --git a/licenses.yaml b/licenses.yaml index 3c1f7b0b2d4..700dc891553 100644 --- a/licenses.yaml +++ b/licenses.yaml @@ -5094,7 +5094,7 @@ license_category: binary module: web-console license_name: Apache License version 2.0 copyright: Imply Data -version: 0.22.15 +version: 0.22.20 --- diff --git a/web-console/lib/keywords.js b/web-console/lib/keywords.js index bf7b9a03910..dbf10e12bac 100644 --- a/web-console/lib/keywords.js +++ b/web-console/lib/keywords.js @@ -47,6 +47,7 @@ exports.SQL_KEYWORDS = [ 'FULL', 'CROSS', 'USING', + 'NATURAL', 'FETCH', 'FIRST', 'NEXT', @@ -67,6 +68,8 @@ exports.SQL_KEYWORDS = [ 'RANGE', 'PRECEDING', 'FOLLOWING', + 'CURRENT', + 'UNBOUNDED', 'EXTEND', 'PIVOT', 'UNPIVOT', diff --git a/web-console/package-lock.json b/web-console/package-lock.json index 26999644f1e..2945955d9d6 100644 --- a/web-console/package-lock.json +++ b/web-console/package-lock.json @@ -15,7 +15,7 @@ "@blueprintjs/icons": "^4.16.0", "@blueprintjs/popover2": "^1.14.9", "@blueprintjs/select": "^4.9.24", - "@druid-toolkit/query": "^0.22.15", + "@druid-toolkit/query": "^0.22.20", "@druid-toolkit/visuals-core": "^0.3.3", "@druid-toolkit/visuals-react": "^0.3.3", "ace-builds": "~1.4.14", @@ -1005,9 +1005,9 @@ } }, "node_modules/@druid-toolkit/query": { - "version": "0.22.15", - "resolved": "https://registry.npmjs.org/@druid-toolkit/query/-/query-0.22.15.tgz", - "integrity": "sha512-LyQVIVkVNhduscf2wnBO/oGBvj353tS5ElIws20xQzApvEIwNNxmlkA+8npqwy77BkJj3nRQvlenbSEDHQdqow==", + "version": "0.22.20", + "resolved": "https://registry.npmjs.org/@druid-toolkit/query/-/query-0.22.20.tgz", + "integrity": "sha512-GmmSd27y7zLVTjgTBQy+XoGeSSGhSDNmwyiwWtSua7I5LX8XqHV7Chi8HIH25YQoVgTK1pLK4RS8eRXxthRAzg==", "dependencies": { "tslib": "^2.5.2" } @@ -19147,9 +19147,9 @@ "dev": true }, "@druid-toolkit/query": { - "version": "0.22.15", - "resolved": "https://registry.npmjs.org/@druid-toolkit/query/-/query-0.22.15.tgz", - "integrity": "sha512-LyQVIVkVNhduscf2wnBO/oGBvj353tS5ElIws20xQzApvEIwNNxmlkA+8npqwy77BkJj3nRQvlenbSEDHQdqow==", + "version": "0.22.20", + "resolved": "https://registry.npmjs.org/@druid-toolkit/query/-/query-0.22.20.tgz", + "integrity": "sha512-GmmSd27y7zLVTjgTBQy+XoGeSSGhSDNmwyiwWtSua7I5LX8XqHV7Chi8HIH25YQoVgTK1pLK4RS8eRXxthRAzg==", "requires": { "tslib": "^2.5.2" } diff --git a/web-console/package.json b/web-console/package.json index 44e6986c2bd..6e38ba24684 100644 --- a/web-console/package.json +++ b/web-console/package.json @@ -69,7 +69,7 @@ "@blueprintjs/icons": "^4.16.0", "@blueprintjs/popover2": "^1.14.9", "@blueprintjs/select": "^4.9.24", - "@druid-toolkit/query": "^0.22.15", + "@druid-toolkit/query": "^0.22.20", "@druid-toolkit/visuals-core": "^0.3.3", "@druid-toolkit/visuals-react": "^0.3.3", "ace-builds": "~1.4.14", diff --git a/web-console/src/components/record-table-pane/record-table-pane.tsx b/web-console/src/components/record-table-pane/record-table-pane.tsx index 29433b25ddc..6007559fb0d 100644 --- a/web-console/src/components/record-table-pane/record-table-pane.tsx +++ b/web-console/src/components/record-table-pane/record-table-pane.tsx @@ -174,7 +174,9 @@ export const RecordTablePane = React.memo(function RecordTablePane(props: Record })} /> )} - {showValue && <ShowValueDialog onClose={() => setShowValue(undefined)} str={showValue} />} + {showValue && ( + <ShowValueDialog onClose={() => setShowValue(undefined)} str={showValue} size="large" /> + )} </div> ); }); diff --git a/web-console/src/dialogs/edit-context-dialog/__snapshots__/edit-context-dialog.spec.tsx.snap b/web-console/src/dialogs/edit-context-dialog/__snapshots__/edit-context-dialog.spec.tsx.snap index b9e2d072ea9..7a2ed054f3a 100644 --- a/web-console/src/dialogs/edit-context-dialog/__snapshots__/edit-context-dialog.spec.tsx.snap +++ b/web-console/src/dialogs/edit-context-dialog/__snapshots__/edit-context-dialog.spec.tsx.snap @@ -57,18 +57,102 @@ exports[`EditContextDialog matches snapshot 1`] = ` </span> </button> </div> - <textarea - class="bp4-input" + <div + class=" ace_editor ace_hidpi ace-solarized-dark ace_dark query-string" + id="ace-editor" + style="width: 100%; height: 100%; font-size: 12px;" > - { - -} - </textarea> + <textarea + autocapitalize="off" + autocorrect="off" + class="ace_text-input" + spellcheck="false" + style="opacity: 0; font-size: 1px;" + wrap="off" + /> + <div + aria-hidden="true" + class="ace_gutter" + > + <div + class="ace_layer ace_gutter-layer ace_folding-enabled" + style="height: 1000000px;" + /> + </div> + <div + class="ace_scroller" + style="line-height: 0px;" + > + <div + class="ace_content" + > + <div + class="ace_layer ace_print-margin-layer" + > + <div + class="ace_print-margin" + style="left: 4px; visibility: hidden;" + /> + </div> + <div + class="ace_layer ace_marker-layer" + /> + <div + class="ace_layer ace_text-layer" + style="height: 1000000px; margin: 0px 4px;" + /> + <div + class="ace_layer ace_marker-layer" + /> + <div + class="ace_layer ace_cursor-layer ace_hidden-cursors" + > + <div + class="ace_cursor" + /> + </div> + </div> + </div> + <div + class="ace_scrollbar ace_scrollbar-v" + style="display: none; width: 20px;" + > + <div + class="ace_scrollbar-inner" + style="width: 20px;" + > + + </div> + </div> + <div + class="ace_scrollbar ace_scrollbar-h" + style="display: none; height: 20px;" + > + <div + class="ace_scrollbar-inner" + style="height: 20px;" + > + + </div> + </div> + <div + style="height: auto; width: auto; top: 0px; left: 0px; visibility: hidden; position: absolute; white-space: pre; overflow: hidden;" + > + <div + style="height: auto; width: auto; top: 0px; left: 0px; visibility: hidden; position: absolute; white-space: pre; overflow: visible;" + /> + <div + style="height: auto; width: auto; top: 0px; left: 0px; visibility: hidden; position: absolute; white-space: pre; overflow: visible;" + > + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + </div> + </div> + </div> <div - class="bp4-dialog-footer-actions" + class="bp4-dialog-footer" > <div - class="edit-context-dialog-buttons" + class="bp4-dialog-footer-actions" > <button class="bp4-button" diff --git a/web-console/src/dialogs/edit-context-dialog/edit-context-dialog.scss b/web-console/src/dialogs/edit-context-dialog/edit-context-dialog.scss index 4cc5ab33b7f..5e3a47a9593 100644 --- a/web-console/src/dialogs/edit-context-dialog/edit-context-dialog.scss +++ b/web-console/src/dialogs/edit-context-dialog/edit-context-dialog.scss @@ -20,25 +20,6 @@ .edit-context-dialog { &.#{$bp-ns}-dialog { - padding-bottom: 10px; - } - - .#{$bp-ns}-input { - margin: 10px; - height: 400px; - } - - .#{$bp-ns}-dialog-footer-actions { - padding: 0px 10px 0px 10px; - display: grid; - grid-template-columns: 340px 1fr; - grid-template-areas: 'error buttons'; - } - - .edit-context-dialog-error { - grid-area: error; - } - .edit-context-dialog-buttons { - grid-area: buttons; + height: 60vh; } } diff --git a/web-console/src/dialogs/edit-context-dialog/edit-context-dialog.spec.tsx b/web-console/src/dialogs/edit-context-dialog/edit-context-dialog.spec.tsx index 7052dfa5422..272596ae0df 100644 --- a/web-console/src/dialogs/edit-context-dialog/edit-context-dialog.spec.tsx +++ b/web-console/src/dialogs/edit-context-dialog/edit-context-dialog.spec.tsx @@ -24,7 +24,11 @@ import { EditContextDialog } from './edit-context-dialog'; describe('EditContextDialog', () => { it('matches snapshot', () => { const compactionDialog = ( - <EditContextDialog queryContext={{}} onQueryContextChange={() => null} onClose={() => {}} /> + <EditContextDialog + initQueryContext={{}} + onQueryContextChange={() => null} + onClose={() => {}} + /> ); render(compactionDialog); expect(document.body.lastChild).toMatchSnapshot(); diff --git a/web-console/src/dialogs/edit-context-dialog/edit-context-dialog.tsx b/web-console/src/dialogs/edit-context-dialog/edit-context-dialog.tsx index 3632606508e..4ba85b000ee 100644 --- a/web-console/src/dialogs/edit-context-dialog/edit-context-dialog.tsx +++ b/web-console/src/dialogs/edit-context-dialog/edit-context-dialog.tsx @@ -16,86 +16,72 @@ * limitations under the License. */ -import { Button, Callout, Classes, Dialog, Intent, TextArea } from '@blueprintjs/core'; +import { Button, Classes, Dialog, Intent } from '@blueprintjs/core'; import Hjson from 'hjson'; import * as JSONBig from 'json-bigint-native'; import React, { useState } from 'react'; +import AceEditor from 'react-ace'; import type { QueryContext } from '../../druid-models'; +import { AppToaster } from '../../singletons'; import './edit-context-dialog.scss'; -export interface EditContextDialogProps { - queryContext: QueryContext; - onQueryContextChange: (queryContext: QueryContext) => void; - onClose: () => void; +function formatContext(context: QueryContext | undefined): string { + const str = JSONBig.stringify(context || {}, undefined, 2); + return str === '{}' ? '{\n\n}' : str; } -export interface EditContextDialogState { - queryContextString: string; - queryContext?: QueryContext; - error?: string; +export interface EditContextDialogProps { + initQueryContext: QueryContext | undefined; + onQueryContextChange(queryContext: QueryContext): void; + onClose(): void; } export const EditContextDialog = React.memo(function EditContextDialog( props: EditContextDialogProps, ) { - const { onQueryContextChange, onClose } = props; - const [state, setState] = useState<EditContextDialogState>(() => ({ - queryContext: props.queryContext, - queryContextString: Object.keys(props.queryContext).length - ? JSONBig.stringify(props.queryContext, undefined, 2) - : '{\n\n}', - })); - - const { queryContext, queryContextString, error } = state; - - function handleTextChange(e: any) { - const queryContextString = (e.target as HTMLInputElement).value; - - let error: string | undefined; - let queryContext: QueryContext | undefined; - try { - queryContext = Hjson.parse(queryContextString); - } catch (e) { - error = e.message; - } - - if (!error && (!queryContext || typeof queryContext !== 'object')) { - error = 'Input is not a valid object'; - queryContext = undefined; - } - - setState({ - queryContextString, - queryContext, - error, - }); - } + const { initQueryContext, onQueryContextChange, onClose } = props; + const [queryContextString, setQueryContextString] = useState<string>( + formatContext(initQueryContext), + ); return ( <Dialog className="edit-context-dialog" isOpen onClose={onClose} title="Edit query context"> - <TextArea value={queryContextString} onChange={handleTextChange} autoFocus /> - <div className={Classes.DIALOG_FOOTER_ACTIONS}> - {error && ( - <Callout intent={Intent.DANGER} className="edit-context-dialog-error"> - {error} - </Callout> - )} - <div className="edit-context-dialog-buttons"> + <AceEditor + mode="hjson" + theme="solarized_dark" + className="query-string" + name="ace-editor" + fontSize={12} + width="100%" + height="100%" + showGutter + showPrintMargin={false} + value={queryContextString} + onChange={v => setQueryContextString(v)} + /> + <div className={Classes.DIALOG_FOOTER}> + <div className={Classes.DIALOG_FOOTER_ACTIONS}> <Button text="Close" onClick={onClose} /> <Button text="Save" intent={Intent.PRIMARY} - disabled={Boolean(error)} - onClick={ - queryContext - ? () => { - onQueryContextChange(queryContext); - onClose(); - } - : undefined - } + onClick={() => { + let queryContext: QueryContext; + try { + queryContext = Hjson.parse(queryContextString); + } catch (e) { + AppToaster.show({ + message: e.message, + intent: Intent.DANGER, + }); + return; + } + + onQueryContextChange(queryContext); + onClose(); + }} /> </div> </div> diff --git a/web-console/src/dialogs/show-value-dialog/__snapshots__/show-value-dialog.spec.tsx.snap b/web-console/src/dialogs/show-value-dialog/__snapshots__/show-value-dialog.spec.tsx.snap index 001312a0b8f..391fe3e018e 100644 --- a/web-console/src/dialogs/show-value-dialog/__snapshots__/show-value-dialog.spec.tsx.snap +++ b/web-console/src/dialogs/show-value-dialog/__snapshots__/show-value-dialog.spec.tsx.snap @@ -57,53 +57,61 @@ exports[`ShowValueDialog matches snapshot 1`] = ` </span> </button> </div> - <textarea - class="bp4-input" - spellcheck="false" + <div + class="bp4-dialog-body" > - Bot: Automatska zamjena teksta (-[[Administrativna podjela Meksika|Admin]] +[[Administrativna podjela Meksika|Admi]]) - </textarea> + <textarea + class="bp4-input" + spellcheck="false" + > + Bot: Automatska zamjena teksta (-[[Administrativna podjela Meksika|Admin]] +[[Administrativna podjela Meksika|Admi]]) + </textarea> + </div> <div - class="bp4-dialog-footer-actions" + class="bp4-dialog-footer" > - <button - class="bp4-button" - type="button" + <div + class="bp4-dialog-footer-actions" > - <span - aria-hidden="true" - class="bp4-icon bp4-icon-duplicate" - icon="duplicate" + <button + class="bp4-button" + type="button" > - <svg - data-icon="duplicate" - height="16" - role="img" - viewBox="0 0 16 16" - width="16" + <span + aria-hidden="true" + class="bp4-icon bp4-icon-duplicate" + icon="duplicate" > - <path - d="M15 0H5c-.55 0-1 .45-1 1v2h2V2h8v7h-1v2h2c.55 0 1-.45 1-1V1c0-.55-.45-1-1-1zm-4 4H1c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h10c.55 0 1-.45 1-1V5c0-.55-.45-1-1-1zm-1 10H2V6h8v8z" - fill-rule="evenodd" - /> - </svg> - </span> - <span - class="bp4-button-text" - > - Copy - </span> - </button> - <button - class="bp4-button bp4-intent-primary" - type="button" - > - <span - class="bp4-button-text" + <svg + data-icon="duplicate" + height="16" + role="img" + viewBox="0 0 16 16" + width="16" + > + <path + d="M15 0H5c-.55 0-1 .45-1 1v2h2V2h8v7h-1v2h2c.55 0 1-.45 1-1V1c0-.55-.45-1-1-1zm-4 4H1c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h10c.55 0 1-.45 1-1V5c0-.55-.45-1-1-1zm-1 10H2V6h8v8z" + fill-rule="evenodd" + /> + </svg> + </span> + <span + class="bp4-button-text" + > + Copy + </span> + </button> + <button + class="bp4-button bp4-intent-primary" + type="button" > - Close - </span> - </button> + <span + class="bp4-button-text" + > + Close + </span> + </button> + </div> </div> </div> </div> diff --git a/web-console/src/dialogs/show-value-dialog/show-value-dialog.scss b/web-console/src/dialogs/show-value-dialog/show-value-dialog.scss index a1da01e5931..f561f1bf99f 100644 --- a/web-console/src/dialogs/show-value-dialog/show-value-dialog.scss +++ b/web-console/src/dialogs/show-value-dialog/show-value-dialog.scss @@ -19,10 +19,6 @@ @import '../../variables'; .show-value-dialog { - &.#{$bp-ns}-dialog { - padding-bottom: 10px; - } - &.normal.#{$bp-ns}-dialog { height: 600px; } @@ -32,12 +28,21 @@ height: 90vh; } - .#{$bp-ns}-input { - margin: 10px; - flex: 1; + .#{$bp-ns}-dialog-body { + display: flex; + flex-direction: column; + + .ace-editor { + flex: 1; + } + + .#{$bp-ns}-input { + flex: 1; + resize: none; + } } - .#{$bp-ns}-dialog-footer-actions { - padding-right: 10px; + .#{$bp-ns}-dialog-footer { + margin-top: 0; } } diff --git a/web-console/src/dialogs/show-value-dialog/show-value-dialog.tsx b/web-console/src/dialogs/show-value-dialog/show-value-dialog.tsx index 8e1b0290865..4369a43bb76 100644 --- a/web-console/src/dialogs/show-value-dialog/show-value-dialog.tsx +++ b/web-console/src/dialogs/show-value-dialog/show-value-dialog.tsx @@ -16,11 +16,21 @@ * limitations under the License. */ -import { Button, Classes, Dialog, Intent, TextArea } from '@blueprintjs/core'; +import { + Button, + ButtonGroup, + Classes, + Dialog, + FormGroup, + Intent, + TextArea, +} from '@blueprintjs/core'; import { IconNames } from '@blueprintjs/icons'; import classNames from 'classnames'; import copy from 'copy-to-clipboard'; -import React from 'react'; +import * as JSONBig from 'json-bigint-native'; +import React, { useMemo, useState } from 'react'; +import AceEditor from 'react-ace'; import { AppToaster } from '../../singletons'; @@ -35,6 +45,15 @@ export interface ShowValueDialogProps { export const ShowValueDialog = React.memo(function ShowValueDialog(props: ShowValueDialogProps) { const { title, onClose, str, size } = props; + const [tab, setTab] = useState<'formatted' | 'raw'>('formatted'); + + const parsed = useMemo(() => { + try { + return JSONBig.parse(str); + } catch {} + }, [str]); + + const hasParsed = typeof parsed !== 'undefined'; function handleCopy() { copy(str, { format: 'text/plain' }); @@ -51,10 +70,41 @@ export const ShowValueDialog = React.memo(function ShowValueDialog(props: ShowVa onClose={onClose} title={title || 'Full value'} > - <TextArea value={str} spellCheck={false} /> - <div className={Classes.DIALOG_FOOTER_ACTIONS}> - <Button icon={IconNames.DUPLICATE} text="Copy" onClick={handleCopy} /> - <Button text="Close" intent={Intent.PRIMARY} onClick={onClose} /> + <div className={Classes.DIALOG_BODY}> + {hasParsed && ( + <FormGroup> + <ButtonGroup fill> + <Button + text="Formatted" + active={tab === 'formatted'} + onClick={() => setTab('formatted')} + /> + <Button text="Raw" active={tab === 'raw'} onClick={() => setTab('raw')} /> + </ButtonGroup> + </FormGroup> + )} + {hasParsed && tab === 'formatted' && ( + <AceEditor + mode="hjson" + theme="solarized_dark" + className="query-string" + name="ace-editor" + fontSize={12} + width="100%" + height="100%" + showGutter + showPrintMargin={false} + value={JSONBig.stringify(parsed, undefined, 2)} + readOnly + /> + )} + {(!hasParsed || tab === 'raw') && <TextArea value={str} spellCheck={false} />} + </div> + <div className={Classes.DIALOG_FOOTER}> + <div className={Classes.DIALOG_FOOTER_ACTIONS}> + <Button icon={IconNames.DUPLICATE} text="Copy" onClick={handleCopy} /> + <Button text="Close" intent={Intent.PRIMARY} onClick={onClose} /> + </div> </div> </Dialog> ); diff --git a/web-console/src/views/workbench-view/column-tree/column-tree-menu/string-menu-items/string-menu-items.tsx b/web-console/src/views/workbench-view/column-tree/column-tree-menu/string-menu-items/string-menu-items.tsx index 8c95ffd15ce..0dc0c684e45 100644 --- a/web-console/src/views/workbench-view/column-tree/column-tree-menu/string-menu-items/string-menu-items.tsx +++ b/web-console/src/views/workbench-view/column-tree/column-tree-menu/string-menu-items/string-menu-items.tsx @@ -136,7 +136,7 @@ export const StringMenuItems = React.memo(function StringMenuItems(props: String <MenuItem icon={IconNames.FUNCTION} text="Aggregate"> {aggregateMenuItem(F.countDistinct(column), `dist_${columnName}`)} {aggregateMenuItem( - F.count().addWhereExpression(column.equal(SqlPlaceholder.PLACEHOLDER)), + F.count().addWhere(column.equal(SqlPlaceholder.PLACEHOLDER)), `filtered_dist_${columnName}`, false, )} diff --git a/web-console/src/views/workbench-view/result-table-pane/result-table-pane.tsx b/web-console/src/views/workbench-view/result-table-pane/result-table-pane.tsx index cf8fc753ecc..6f2bff79873 100644 --- a/web-console/src/views/workbench-view/result-table-pane/result-table-pane.tsx +++ b/web-console/src/views/workbench-view/result-table-pane/result-table-pane.tsx @@ -657,7 +657,9 @@ export const ResultTablePane = React.memo(function ResultTablePane(props: Result })} /> )} - {showValue && <ShowValueDialog onClose={() => setShowValue(undefined)} str={showValue} />} + {showValue && ( + <ShowValueDialog onClose={() => setShowValue(undefined)} str={showValue} size="large" /> + )} {editingExpression && ( <ExpressionEditorDialog includeOutputName diff --git a/web-console/src/views/workbench-view/run-panel/run-panel.tsx b/web-console/src/views/workbench-view/run-panel/run-panel.tsx index 5d9c9852791..3c9b68ddb7c 100644 --- a/web-console/src/views/workbench-view/run-panel/run-panel.tsx +++ b/web-console/src/views/workbench-view/run-panel/run-panel.tsx @@ -535,7 +535,7 @@ export const RunPanel = React.memo(function RunPanel(props: RunPanelProps) { )} {editContextDialogOpen && ( <EditContextDialog - queryContext={queryContext} + initQueryContext={queryContext} onQueryContextChange={changeQueryContext} onClose={() => { setEditContextDialogOpen(false); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@druid.apache.org For additional commands, e-mail: commits-h...@druid.apache.org