From 08d47c20cd2a783dbeb3d145242de3698cae40e5 Mon Sep 17 00:00:00 2001 From: Yordan Stoyanov Date: Mon, 6 Jul 2026 16:52:41 +0200 Subject: [PATCH 1/9] chore(chart-playground-web): add react-simple-code-editor and highlight.js --- .../chart-playground-web/package.json | 4 +++- pnpm-lock.yaml | 23 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/pluggableWidgets/chart-playground-web/package.json b/packages/pluggableWidgets/chart-playground-web/package.json index 36978e4e95..9222d0095d 100644 --- a/packages/pluggableWidgets/chart-playground-web/package.json +++ b/packages/pluggableWidgets/chart-playground-web/package.json @@ -43,7 +43,9 @@ "@mendix/shared-charts": "workspace:*", "@mendix/widget-plugin-component-kit": "workspace:*", "@mendix/widget-plugin-hooks": "workspace:*", - "@mendix/widget-plugin-platform": "workspace:*" + "@mendix/widget-plugin-platform": "workspace:*", + "highlight.js": "^11.11.1", + "react-simple-code-editor": "^0.14.1" }, "devDependencies": { "@mendix/automation-utils": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd029ea4a0..19a0283227 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -762,6 +762,12 @@ importers: '@mendix/widget-plugin-platform': specifier: workspace:* version: link:../../shared/widget-plugin-platform + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 + react-simple-code-editor: + specifier: ^0.14.1 + version: 0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@mendix/automation-utils': specifier: workspace:* @@ -7504,6 +7510,10 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + hono@4.12.27: resolution: {integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==} engines: {node: '>=16.9.0'} @@ -9590,6 +9600,12 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} + react-simple-code-editor@0.14.1: + resolution: {integrity: sha512-BR5DtNRy+AswWJECyA17qhUDvrrCZ6zXOCfkQY5zSmb96BVUbpVAv03WpcjcwtCwiLbIANx3gebHOcXYn1EHow==} + peerDependencies: + react: '>=18.0.0 <19.0.0' + react-dom: '>=18.0.0 <19.0.0' + react-test-renderer@19.2.7: resolution: {integrity: sha512-U4TyPDJ9MsC8rFimXuJum8w40aPc9kbOZYO8Pc2/4A884i8hwJsMNA/JNyuOc/f2/37wHvk7HjpVl1V4re7Dig==} peerDependencies: @@ -16295,6 +16311,8 @@ snapshots: dependencies: hermes-estree: 0.25.1 + highlight.js@11.11.1: {} + hono@4.12.27: {} hosted-git-info@9.0.3: @@ -18963,6 +18981,11 @@ snapshots: react-refresh@0.14.2: {} + react-simple-code-editor@0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-test-renderer@19.2.7(react@18.3.1): dependencies: react: 18.3.1 From 543449c08269f2354bf74f46d6d2076e81be434e Mon Sep 17 00:00:00 2001 From: Yordan Stoyanov Date: Mon, 6 Jul 2026 16:52:49 +0200 Subject: [PATCH 2/9] fix(chart-playground-web): restore highlighted JSON editor with invalid-JSON feedback --- .../src/components/CodeEditor.tsx | 54 ++++++++++++++++--- .../src/ui/Playground.scss | 17 ++++++ 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/packages/pluggableWidgets/chart-playground-web/src/components/CodeEditor.tsx b/packages/pluggableWidgets/chart-playground-web/src/components/CodeEditor.tsx index 7cda2cdcf0..2eb39f1280 100644 --- a/packages/pluggableWidgets/chart-playground-web/src/components/CodeEditor.tsx +++ b/packages/pluggableWidgets/chart-playground-web/src/components/CodeEditor.tsx @@ -1,4 +1,10 @@ +import hljs from "highlight.js/lib/core"; +import json from "highlight.js/lib/languages/json"; import { ReactElement } from "react"; +import Editor from "react-simple-code-editor"; +import "highlight.js/styles/atom-one-light.css"; + +hljs.registerLanguage("json", json); export interface CodeEditorProps { value: string; @@ -7,13 +13,49 @@ export interface CodeEditorProps { height?: string; } +function highlight(code: string): string { + try { + return hljs.highlight(code, { language: "json", ignoreIllegals: true }).value; + } catch (error) { + console.warn("Syntax highlighting error:", error); + return code; + } +} + +function jsonError(code: string): string | null { + if (code.trim() === "") { + return null; + } + try { + JSON.parse(code); + return null; + } catch (error) { + return error instanceof Error ? error.message : "Invalid JSON"; + } +} + export function CodeEditor(props: CodeEditorProps): ReactElement { + const error = jsonError(props.value); + return ( -