diff --git a/package.json b/package.json index 461e8c7c5..f23e1274c 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,12 @@ "packages/*" ], "resolutions": { - "@patternfly/patternfly": "5.2.1", - "@patternfly/react-code-editor": "5.1.0", - "@patternfly/react-core": "5.2.2", - "@patternfly/react-icons": "5.2.1", - "@patternfly/react-table": "5.2.2", - "@patternfly/react-topology": "5.2.1", + "@patternfly/patternfly": "5.3.1", + "@patternfly/react-code-editor": "5.3.3", + "@patternfly/react-core": "5.3.3", + "@patternfly/react-icons": "5.3.2", + "@patternfly/react-table": "5.3.3", + "@patternfly/react-topology": "5.4.0-prerelease.10", "axios": "1.7.2", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/packages/ui/package.json b/packages/ui/package.json index 9f191f2ae..14cc8921a 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -46,12 +46,12 @@ "@kaoto-next/uniforms-patternfly": "^0.6.10", "@kie-tools-core/editor": "0.32.0", "@kie-tools-core/notifications": "0.32.0", - "@patternfly/patternfly": "5.2.1", - "@patternfly/react-code-editor": "5.1.0", - "@patternfly/react-core": "5.2.2", - "@patternfly/react-icons": "5.2.1", - "@patternfly/react-table": "5.2.2", - "@patternfly/react-topology": "5.2.1", + "@patternfly/patternfly": "5.3.1", + "@patternfly/react-code-editor": "5.3.3", + "@patternfly/react-core": "5.3.3", + "@patternfly/react-icons": "5.3.2", + "@patternfly/react-table": "5.3.3", + "@patternfly/react-topology": "5.4.0-prerelease.10", "@types/uuid": "^10.0.0", "ajv": "^8.12.0", "ajv-draft-04": "^1.0.0", diff --git a/packages/ui/src/components/Form/dataFormat/DataFormatEditor.test.tsx b/packages/ui/src/components/Form/dataFormat/DataFormatEditor.test.tsx index 92382ade0..95a84bfe3 100644 --- a/packages/ui/src/components/Form/dataFormat/DataFormatEditor.test.tsx +++ b/packages/ui/src/components/Form/dataFormat/DataFormatEditor.test.tsx @@ -47,7 +47,7 @@ describe('DataFormatEditor', () => { it('should render', async () => { render(); - const buttons = screen.getAllByRole('button', { name: 'Menu toggle' }); + const buttons = screen.getAllByRole('button', { name: 'Typeahead menu toggle' }); await act(async () => { fireEvent.click(buttons[0]); }); @@ -59,7 +59,7 @@ describe('DataFormatEditor', () => { it('should filter candidates with a text input', async () => { render(); - const buttons = screen.getAllByRole('button', { name: 'Menu toggle' }); + const buttons = screen.getAllByRole('button', { name: 'Typeahead menu toggle' }); await act(async () => { fireEvent.click(buttons[0]); }); @@ -75,7 +75,7 @@ describe('DataFormatEditor', () => { it('should clear filter and close the dropdown with close button', async () => { render(); - const buttons = screen.getAllByRole('button', { name: 'Menu toggle' }); + const buttons = screen.getAllByRole('button', { name: 'Typeahead menu toggle' }); await act(async () => { fireEvent.click(buttons[0]); }); diff --git a/packages/ui/src/components/Form/loadBalancer/LoadBalancerEditor.test.tsx b/packages/ui/src/components/Form/loadBalancer/LoadBalancerEditor.test.tsx index 179d8a4d6..0f353dc22 100644 --- a/packages/ui/src/components/Form/loadBalancer/LoadBalancerEditor.test.tsx +++ b/packages/ui/src/components/Form/loadBalancer/LoadBalancerEditor.test.tsx @@ -48,7 +48,7 @@ describe('LoadBalancerEditor', () => { it('should render', async () => { render(); - const buttons = screen.getAllByRole('button', { name: 'Menu toggle' }); + const buttons = screen.getAllByRole('button', { name: 'Typeahead menu toggle' }); await act(async () => { fireEvent.click(buttons[0]); }); @@ -62,7 +62,7 @@ describe('LoadBalancerEditor', () => { it('should filter candidates with a text input', async () => { render(); - const buttons = screen.getAllByRole('button', { name: 'Menu toggle' }); + const buttons = screen.getAllByRole('button', { name: 'Typeahead menu toggle' }); await act(async () => { fireEvent.click(buttons[0]); }); @@ -78,7 +78,7 @@ describe('LoadBalancerEditor', () => { it('should clear filter and close the dropdown with close button', async () => { render(); - const buttons = screen.getAllByRole('button', { name: 'Menu toggle' }); + const buttons = screen.getAllByRole('button', { name: 'Typeahead menu toggle' }); await act(async () => { fireEvent.click(buttons[0]); }); diff --git a/packages/ui/src/components/SourceCode/SourceCode.tsx b/packages/ui/src/components/SourceCode/SourceCode.tsx index c6ceb7173..a910b4856 100644 --- a/packages/ui/src/components/SourceCode/SourceCode.tsx +++ b/packages/ui/src/components/SourceCode/SourceCode.tsx @@ -1,7 +1,6 @@ import { CodeEditor, CodeEditorProps, Language } from '@patternfly/react-code-editor'; -import * as monaco from 'monaco-editor'; import { configureMonacoYaml } from 'monaco-yaml'; -import { FunctionComponent, Ref, useCallback, useContext, useEffect, useMemo, useRef } from 'react'; +import { FunctionComponent, MutableRefObject, Ref, useCallback, useContext, useEffect, useMemo, useRef } from 'react'; import { EditorDidMount } from 'react-monaco-editor'; import { SourceSchemaType, sourceSchemaConfig } from '../../models/camel'; import { EntitiesContext } from '../../providers/entities.provider'; @@ -18,34 +17,33 @@ interface SourceCodeProps { export const SourceCode: FunctionComponent = (props) => { const editorRef = useRef[0] | null>(null); const entityContext = useContext(EntitiesContext); + const schemaType: SourceSchemaType = entityContext?.currentSchemaType ?? SourceSchemaType.Route; + const currentSchema = sourceSchemaConfig.config[schemaType].schema; + const monacoYamlHandlerRef: MutableRefObject | undefined> = useRef(undefined); - useEffect(() => { - const schemaType: SourceSchemaType = entityContext?.currentSchemaType ?? SourceSchemaType.Route; - const currentSchema = sourceSchemaConfig.config[schemaType].schema; - let monacoYamlHandler: ReturnType | undefined; - - if (currentSchema) { - monacoYamlHandler = configureMonacoYaml(monaco, { - enableSchemaRequest: true, - hover: true, - completion: true, - validate: true, - format: true, - schemas: [ - { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - schema: currentSchema.schema as any, - uri: currentSchema.uri, - fileMatch: ['*'], - }, - ], - }); - } + const editorProps: Ref = useRef({ + beforeMount: (monaco) => { + if (currentSchema) { + const monacoYamlHandler = configureMonacoYaml(monaco, { + enableSchemaRequest: true, + hover: true, + completion: true, + validate: true, + format: true, + schemas: [ + { + schema: currentSchema.schema, + uri: currentSchema.uri, + fileMatch: ['*'], + }, + ], + }); - return () => { - monacoYamlHandler?.dispose(); - }; - }, [entityContext?.currentSchemaType]); + /** Capturing the monacoYamlHandlerRef so we can dispose it when unmounting this component */ + monacoYamlHandlerRef.current = monacoYamlHandler; + } + }, + }); const handleEditorDidMount: EditorDidMount = useCallback((editor) => { editorRef.current = editor; @@ -81,6 +79,16 @@ export const SourceCode: FunctionComponent = (props) => { ]; }, []); + useEffect(() => { + /** + * This useEffect acts as an unmount hook for the CodeEditor component + * It disposes the monacoYamlHandlerRef.current when the component is unmounted + */ + return () => { + monacoYamlHandlerRef.current?.dispose(); + }; + }, []); + return ( = (props) => { onCodeChange={props.onCodeChange} customControls={customControls} language={Language.yaml} + editorProps={editorProps.current!} options={options.current!} onEditorDidMount={handleEditorDidMount} /> diff --git a/packages/ui/src/components/Visualization/Canvas/CanvasForm.test.tsx b/packages/ui/src/components/Visualization/Canvas/CanvasForm.test.tsx index ea30cc14c..20f36e30d 100644 --- a/packages/ui/src/components/Visualization/Canvas/CanvasForm.test.tsx +++ b/packages/ui/src/components/Visualization/Canvas/CanvasForm.test.tsx @@ -440,7 +440,7 @@ describe('CanvasForm', () => { , ); - const button = screen.getAllByRole('button', { name: 'Menu toggle' }); + const button = screen.getAllByRole('button', { name: 'Typeahead menu toggle' }); await act(async () => { fireEvent.click(button[0]); }); @@ -497,7 +497,7 @@ describe('CanvasForm', () => { expect(camelRoute.from.steps[0].marshal!.avro).toBeUndefined(); expect(camelRoute.from.steps[0].marshal!.id).toEqual('modified'); - const button = screen.getAllByRole('button', { name: 'Menu toggle' }); + const button = screen.getAllByRole('button', { name: 'Typeahead menu toggle' }); await act(async () => { fireEvent.click(button[0]); }); @@ -546,7 +546,7 @@ describe('CanvasForm', () => { , ); - const button = screen.getAllByRole('button', { name: 'Menu toggle' }); + const button = screen.getAllByRole('button', { name: 'Typeahead menu toggle' }); await act(async () => { fireEvent.click(button[0]); }); @@ -603,7 +603,7 @@ describe('CanvasForm', () => { expect(camelRoute.from.steps[0].loadBalance!.weighted).toBeUndefined(); expect(camelRoute.from.steps[0].loadBalance!.id).toEqual('modified'); - const button = screen.getAllByRole('button', { name: 'Menu toggle' }); + const button = screen.getAllByRole('button', { name: 'Typeahead menu toggle' }); await act(async () => { fireEvent.click(button[0]); }); diff --git a/packages/ui/src/components/Visualization/Canvas/__snapshots__/Canvas.test.tsx.snap b/packages/ui/src/components/Visualization/Canvas/__snapshots__/Canvas.test.tsx.snap index 5c1baf688..9ea86a136 100644 --- a/packages/ui/src/components/Visualization/Canvas/__snapshots__/Canvas.test.tsx.snap +++ b/packages/ui/src/components/Visualization/Canvas/__snapshots__/Canvas.test.tsx.snap @@ -747,6 +747,103 @@ exports[`Canvas should render correctly 1`] = ` y="-60" /> + + + + + route-8888 + + + + + + + + + + + + + + + + + - - - - route-8888 - - - - - - - - - - - - - - - - - + /> + + + + + route-8888 + + + + + + + + + + + + + + + + + - - - - route-8888 - - - - - - - - - - - - - - - - - + /> + + + + + route-8888 + + + + + + + + + + + + + + + + + - - - - route-8888 - - - - - - - - - - - - - - - - - + /> = 0.21.0 < 1" + checksum: 374ec0ea872ee15b33310e105a43217148161480d3955c5cece87d0f801754cd2c45a3f6c539a75da18a066c1615756fb87eaf1003f1df6a64a0cbce5d2c3749 + languageName: node + linkType: hard + +"@monaco-editor/react@npm:^4.6.0": + version: 4.6.0 + resolution: "@monaco-editor/react@npm:4.6.0" + dependencies: + "@monaco-editor/loader": ^1.4.0 + peerDependencies: + monaco-editor: ">= 0.25.0 < 1" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 9d44e76c5baad6db5f84c90a5540fbd3c9af691b97d76cf2a99b3c8273004d0efe44c2572d80e9d975c9af10022c21e4a66923924950a5201e82017c8b20428c + languageName: node + linkType: hard + "@mswjs/cookies@npm:^1.1.0": version: 1.1.1 resolution: "@mswjs/cookies@npm:1.1.1" @@ -3360,102 +3400,107 @@ __metadata: languageName: node linkType: hard -"@patternfly/patternfly@npm:5.2.1": - version: 5.2.1 - resolution: "@patternfly/patternfly@npm:5.2.1" - checksum: ed043826e22d8138d1f448f63a63750c7b710fbc73b947b3474271e140f1780a85b0b6e01ff602b087ebedd5dbffe0d50697539185497e336b623fe7128e915d +"@patternfly/patternfly@npm:5.3.1": + version: 5.3.1 + resolution: "@patternfly/patternfly@npm:5.3.1" + checksum: 2bb6ed396f5c36c5c4c11fbd1141fa5830f3f1b1d9846eedba1df43f445ea43d1cadbbcf9fd416f966bf6195aeea00fb14770ced81ae3d6ff47a4fcd241bf89b languageName: node linkType: hard -"@patternfly/react-code-editor@npm:5.1.0": - version: 5.1.0 - resolution: "@patternfly/react-code-editor@npm:5.1.0" +"@patternfly/react-code-editor@npm:5.3.3": + version: 5.3.3 + resolution: "@patternfly/react-code-editor@npm:5.3.3" dependencies: - "@patternfly/react-core": ^5.1.0 - "@patternfly/react-icons": ^5.1.0 - "@patternfly/react-styles": ^5.1.0 + "@monaco-editor/react": ^4.6.0 + "@patternfly/react-core": ^5.3.3 + "@patternfly/react-icons": ^5.3.2 + "@patternfly/react-styles": ^5.3.1 react-dropzone: 14.2.3 tslib: ^2.5.0 peerDependencies: react: ^17 || ^18 react-dom: ^17 || ^18 - react-monaco-editor: ^0.51.0 - checksum: 5d6e9d32491effa040c75f748a042d25d4405dfd2ce462df1abdd1bd2ea3fb6173b4caab58f399c4a42e40db1a820fd6cc4f0412fc59e47797eda2c277a8f72c + checksum: aab024e365402f74b7efa4a65849b728464093825c4dc631d94c73525db7c1b2067c3eb076cec1229d91181f2c18d7d01c03555cb927faf40a54cb3921480e0f languageName: node linkType: hard -"@patternfly/react-core@npm:5.2.2": - version: 5.2.2 - resolution: "@patternfly/react-core@npm:5.2.2" +"@patternfly/react-core@npm:5.3.3": + version: 5.3.3 + resolution: "@patternfly/react-core@npm:5.3.3" dependencies: - "@patternfly/react-icons": ^5.2.1 - "@patternfly/react-styles": ^5.2.1 - "@patternfly/react-tokens": ^5.2.1 + "@patternfly/react-icons": ^5.3.2 + "@patternfly/react-styles": ^5.3.1 + "@patternfly/react-tokens": ^5.3.1 focus-trap: 7.5.2 react-dropzone: ^14.2.3 tslib: ^2.5.0 peerDependencies: react: ^17 || ^18 react-dom: ^17 || ^18 - checksum: 88bee51a0275e493dbd9519d50bffa548096d5d06b644ced1e14dfe9771d3ec6c6d1bac80513db37e1866803435372e8ffc3c8ceeaaed4bb332e01ad7122a92d + checksum: 5af2b78ec3b5f7e56d28e150a5596b02cbc87cc1da7c6cb08517768ea165a2489847c4511cf1bc06411d7609da74c0144e0e0897171ac7d355624a576d471cc7 languageName: node linkType: hard -"@patternfly/react-icons@npm:5.2.1": - version: 5.2.1 - resolution: "@patternfly/react-icons@npm:5.2.1" +"@patternfly/react-icons@npm:5.3.2": + version: 5.3.2 + resolution: "@patternfly/react-icons@npm:5.3.2" peerDependencies: react: ^17 || ^18 react-dom: ^17 || ^18 - checksum: 2bc14d3a3de34c48816988b9be65429b9c4bd2edb28c3e82e8dd47cc4be031e30ce65b4987e00abfd09ed36b89637a6fdd19ee5c46b07ff701e8315201b7ca36 + checksum: 0d6f2c47905015fd70b1d2a53bb85844b04250742a37f067b42731f609bafda1f2819d77398985e4db0ac5662e24523b459013b312b9fde9a30df1f3de6bc15c + languageName: node + linkType: hard + +"@patternfly/react-styles@npm:^5.1.1": + version: 5.2.0 + resolution: "@patternfly/react-styles@npm:5.2.0" + checksum: ab38211d265c5fdcebf1c6d10503cca3fa87e7f5021021a61e0b1cf320f6f906eb7ae4279b5d7767cd657ddea4659d74b072b100416f8c6dfb485d4d31a3dc76 languageName: node linkType: hard -"@patternfly/react-styles@npm:^5.1.0, @patternfly/react-styles@npm:^5.1.1, @patternfly/react-styles@npm:^5.2.1": +"@patternfly/react-styles@npm:^5.3.1": version: 5.3.1 resolution: "@patternfly/react-styles@npm:5.3.1" checksum: fccb4e955e45538807397c7a53ee1b1f6ebf4137a4b708ad4e03f35b0dfe7b707f64240f11ee3a48b007d628d5d55b63b33c110a1f2d268b607e73ce8eccb514 languageName: node linkType: hard -"@patternfly/react-table@npm:5.2.2": - version: 5.2.2 - resolution: "@patternfly/react-table@npm:5.2.2" +"@patternfly/react-table@npm:5.3.3": + version: 5.3.3 + resolution: "@patternfly/react-table@npm:5.3.3" dependencies: - "@patternfly/react-core": ^5.2.2 - "@patternfly/react-icons": ^5.2.1 - "@patternfly/react-styles": ^5.2.1 - "@patternfly/react-tokens": ^5.2.1 + "@patternfly/react-core": ^5.3.3 + "@patternfly/react-icons": ^5.3.2 + "@patternfly/react-styles": ^5.3.1 + "@patternfly/react-tokens": ^5.3.1 lodash: ^4.17.19 tslib: ^2.5.0 peerDependencies: react: ^17 || ^18 react-dom: ^17 || ^18 - checksum: a97a63297d72a6c66eb3af07c05f7b5ab62c97250490af59eaa6992eab2e5b5c2cb170a307591ad18085849fc9a69b716acd969f74d3744106c2e0ab6e13e165 + checksum: 6e0bb878bab665e9b611ffa8dbf36a2fce27eb4c16ba7a2abe714ad5b4e96f68861b002a30ee582387779b39b1a7585fc935e6f9eaf1c85dc97c6bc65fdc2884 languageName: node linkType: hard -"@patternfly/react-tokens@npm:^5.2.1": +"@patternfly/react-tokens@npm:^5.3.1": version: 5.3.1 resolution: "@patternfly/react-tokens@npm:5.3.1" checksum: 0690ab162034370715e938c73a8364d1df2770d42ae2860ecca3cdbc38bae4b5aaf2bb9e46f3a3a4cdd2402b2ca40fd6b43de9bbce35429d392853f6e17f6aec languageName: node linkType: hard -"@patternfly/react-topology@npm:5.2.1": - version: 5.2.1 - resolution: "@patternfly/react-topology@npm:5.2.1" +"@patternfly/react-topology@npm:5.4.0-prerelease.10": + version: 5.4.0-prerelease.10 + resolution: "@patternfly/react-topology@npm:5.4.0-prerelease.10" dependencies: + "@dagrejs/dagre": 1.1.2 "@patternfly/react-core": ^5.1.1 "@patternfly/react-icons": ^5.1.1 "@patternfly/react-styles": ^5.1.1 "@types/d3": ^7.4.0 "@types/d3-force": ^1.2.1 - "@types/dagre": 0.7.42 "@types/react-measure": ^2.0.6 d3: ^7.8.0 - dagre: 0.8.2 - lodash: ^4.17.19 mobx: ^6.9.0 mobx-react: ^7.6.0 point-in-svg-path: ^1.0.1 @@ -3466,7 +3511,7 @@ __metadata: peerDependencies: react: ^17 || ^18 react-dom: ^17 || ^18 - checksum: 91dd662a42a21b717cbce815f2305ec9957cc3a013f42591be9a7bac704eba7ff5eba2113736253255b4f8821380d32a0cf84eb04203068f048d66cf189c468b + checksum: 3ae348a86593ef5aeddac9cf1339f103b023c05a5ef1e9112b7a459e5b59d75dfc8047b9f0e4c91af4e34abd4fded8d093e92cf98088b78508963ea68986493d languageName: node linkType: hard @@ -5573,13 +5618,6 @@ __metadata: languageName: node linkType: hard -"@types/dagre@npm:0.7.42": - version: 0.7.42 - resolution: "@types/dagre@npm:0.7.42" - checksum: c63a0e9155df7d00b4e3bd5a781a69a958cf7281d2fec90cbea0e553841cd41bef3b35c749b1b481811ac7d81d25eb8a8366ea17ac647a907828e399ccdce82d - languageName: node - linkType: hard - "@types/detect-port@npm:^1.3.0": version: 1.3.5 resolution: "@types/detect-port@npm:1.3.5" @@ -8693,16 +8731,6 @@ __metadata: languageName: node linkType: hard -"dagre@npm:0.8.2": - version: 0.8.2 - resolution: "dagre@npm:0.8.2" - dependencies: - graphlib: ^2.1.5 - lodash: ^4.17.4 - checksum: 5a0446354610d423152badf34d0870a23382a8d224e158522840513dc095bf60fbc45132f9093a5bb348597be9967a46a21f3729af1a6d8d4d98d73ed8825fa4 - languageName: node - linkType: hard - "dargs@npm:^8.0.0": version: 8.1.0 resolution: "dargs@npm:8.1.0" @@ -11163,15 +11191,6 @@ __metadata: languageName: node linkType: hard -"graphlib@npm:^2.1.5": - version: 2.1.8 - resolution: "graphlib@npm:2.1.8" - dependencies: - lodash: ^4.17.15 - checksum: 1e0db4dea1c8187d59103d5582ecf32008845ebe2103959a51d22cb6dae495e81fb9263e22c922bca3aaecb56064a45cd53424e15a4626cfb5a0c52d0aff61a8 - languageName: node - linkType: hard - "graphql@npm:^16.8.1": version: 16.8.2 resolution: "graphql@npm:16.8.2" @@ -13376,7 +13395,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.0.0, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:~4.17.15": +"lodash@npm:^4.0.0, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21, lodash@npm:~4.17.15": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -16857,6 +16876,13 @@ __metadata: languageName: node linkType: hard +"state-local@npm:^1.0.6": + version: 1.0.7 + resolution: "state-local@npm:1.0.7" + checksum: d1afcf1429e7e6eb08685b3a94be8797db847369316d4776fd51f3962b15b984dacc7f8e401ad20968e5798c9565b4b377afedf4e4c4d60fe7495e1cbe14a251 + languageName: node + linkType: hard + "statuses@npm:2.0.1, statuses@npm:^2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1"