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

Reply via email to