diff --git a/openmetadata-ui/src/main/resources/ui/playwright/utils/metric.ts b/openmetadata-ui/src/main/resources/ui/playwright/utils/metric.ts index 3b2e3ee562e..e3ca0a875e6 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/utils/metric.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/utils/metric.ts @@ -110,6 +110,7 @@ export const updateExpression = async ( language: string, code: string ) => { + await page.getByRole('tab', { name: 'Expression', exact: true }).click(); await page.click(`[data-testid="edit-expression-button"]`); // Select the language @@ -128,8 +129,10 @@ export const updateExpression = async ( await patchPromise; await expect( - page.getByLabel('Overview').locator('.CodeMirror-scroll') + page.getByLabel('Expression').locator('.CodeMirror-scroll') ).toContainText(code); + + await page.getByRole('tab', { name: 'Overview', exact: true }).click(); }; export const updateRelatedMetric = async ( diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Database/SchemaEditor/SchemaEditor.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Database/SchemaEditor/SchemaEditor.tsx index 919733268b5..c6ea1504ee8 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Database/SchemaEditor/SchemaEditor.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Database/SchemaEditor/SchemaEditor.tsx @@ -21,7 +21,9 @@ import 'codemirror/addon/fold/foldgutter.css'; import 'codemirror/addon/fold/foldgutter.js'; import 'codemirror/addon/selection/active-line'; import 'codemirror/lib/codemirror.css'; +import 'codemirror/mode/clike/clike'; import 'codemirror/mode/javascript/javascript'; +import 'codemirror/mode/python/python'; import 'codemirror/mode/sql/sql'; import { isUndefined } from 'lodash'; import React, { useEffect, useState } from 'react'; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Metric/MetricDetails/MetricDetails.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Metric/MetricDetails/MetricDetails.tsx index dd4fbc326df..d01142a1f85 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Metric/MetricDetails/MetricDetails.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Metric/MetricDetails/MetricDetails.tsx @@ -292,8 +292,9 @@ const MetricDetails: React.FC = ({ firstPanel={{ className: 'entity-resizable-panel-container', children: ( -
+
= ({ onDescriptionUpdate={onDescriptionUpdate} onThreadLinkSelect={onThreadLinkSelect} /> -
), ...COMMON_RESIZABLE_PANEL_CONFIG.LEFT_PANEL, @@ -355,6 +352,20 @@ const MetricDetails: React.FC = ({ ), }, + { + label: ( + + ), + key: EntityTabs.EXPRESSION, + children: ( +
+ +
+ ), + }, { label: ( = ({ const [isUpdating, setIsUpdating] = React.useState(false); const [isEditing, setIsEditing] = React.useState(false); + const selectedLanguage = Form.useWatch('language', form); + const handleSubmit = async (values: Metric['metricExpression']) => { try { setIsUpdating(true); @@ -137,8 +139,8 @@ const MetricExpression: FC = ({ name="code" trigger="onChange"> @@ -165,8 +167,12 @@ const MetricExpression: FC = ({ ) : ( .CodeMirror { +.full-screen-editor-height > .CodeMirror, +.full-screen-editor-height > .react-codemirror2 > .CodeMirror { height: calc(100vh - 250px) !important; } diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/MetricEntityUtils/MetricUtils.test.ts b/openmetadata-ui/src/main/resources/ui/src/utils/MetricEntityUtils/MetricUtils.test.ts index cebcfe78bdc..2f0317bae54 100644 --- a/openmetadata-ui/src/main/resources/ui/src/utils/MetricEntityUtils/MetricUtils.test.ts +++ b/openmetadata-ui/src/main/resources/ui/src/utils/MetricEntityUtils/MetricUtils.test.ts @@ -10,8 +10,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { UnitOfMeasurement } from '../../generated/entity/data/metric'; -import { getSortedOptions } from './MetricUtils'; +import { CSMode } from '../../enums/codemirror.enum'; +import { + Language, + UnitOfMeasurement, +} from '../../generated/entity/data/metric'; +import { + getMetricExpressionLanguageName, + getSortedOptions, +} from './MetricUtils'; describe('getSortedOptions', () => { it('should sort options by granularity order if valueKey is granularity', () => { @@ -67,3 +74,31 @@ describe('getSortedOptions', () => { ]); }); }); + +describe('getMetricExpressionLanguageName', () => { + it('should return SQL if language is not provided', () => { + const result = getMetricExpressionLanguageName(); + + expect(result).toBe(CSMode.SQL); + + const result2 = getMetricExpressionLanguageName(undefined); + + expect(result2).toBe(CSMode.SQL); + + const result3 = getMetricExpressionLanguageName('' as Language); + + expect(result3).toBe(CSMode.SQL); + }); + + it('should return CLIKE if language is Java', () => { + const result = getMetricExpressionLanguageName(Language.Java); + + expect(result).toBe(CSMode.CLIKE); + }); + + it('should return language in lowercase if language is provided', () => { + const result = getMetricExpressionLanguageName(Language.Python); + + expect(result).toBe('python'); + }); +}); diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/MetricEntityUtils/MetricUtils.ts b/openmetadata-ui/src/main/resources/ui/src/utils/MetricEntityUtils/MetricUtils.ts index c5654b440e7..0bdb4e0de19 100644 --- a/openmetadata-ui/src/main/resources/ui/src/utils/MetricEntityUtils/MetricUtils.ts +++ b/openmetadata-ui/src/main/resources/ui/src/utils/MetricEntityUtils/MetricUtils.ts @@ -10,7 +10,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Metric, MetricGranularity } from '../../generated/entity/data/metric'; +import { CSMode } from '../../enums/codemirror.enum'; +import { + Language, + Metric, + MetricGranularity, +} from '../../generated/entity/data/metric'; const granularityOrder = [ MetricGranularity.Second, @@ -46,3 +51,15 @@ export const getSortedOptions = ( : 0; }); }; + +export const getMetricExpressionLanguageName = (language?: Language) => { + if (!language) { + return CSMode.SQL; + } + + if (language === Language.Java) { + return CSMode.CLIKE; + } + + return language.toLowerCase() as CSMode; +};