From 71ed51d55273a95be1779c9a269c33514e00d70b Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 29 Sep 2025 18:40:59 +0530 Subject: [PATCH 01/21] Reset Query Clauses Panel store when cleanup --- .../src/components/DataMapper/DataMapperEditor.tsx | 1 + workspaces/ballerina/data-mapper/src/store/store.ts | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx index 3ad59f53d24..ae49237b456 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx @@ -280,6 +280,7 @@ export function DataMapperEditor(props: DataMapperEditorProps) { useDMCollapsedFieldsStore.getState().resetFields(); useDMExpandedFieldsStore.getState().resetFields(); useDMExpressionBarStore.getState().resetExpressionBarStore(); + useDMQueryClausesPanelStore.getState().resetQueryClausesPanelStore(); } const handleOnClose = () => { diff --git a/workspaces/ballerina/data-mapper/src/store/store.ts b/workspaces/ballerina/data-mapper/src/store/store.ts index e5b2fa3248a..545d518bb8c 100644 --- a/workspaces/ballerina/data-mapper/src/store/store.ts +++ b/workspaces/ballerina/data-mapper/src/store/store.ts @@ -162,9 +162,13 @@ export const useDMExpressionBarStore = create((set export interface DataMapperQueryClausesPanelState { isQueryClausesPanelOpen: boolean; setIsQueryClausesPanelOpen: (isQueryClausesPanelOpen: boolean) => void; + resetQueryClausesPanelStore: () => void; } export const useDMQueryClausesPanelStore = create((set) => ({ isQueryClausesPanelOpen: false, setIsQueryClausesPanelOpen: (isQueryClausesPanelOpen: boolean) => set({ isQueryClausesPanelOpen }), + resetQueryClausesPanelStore: () => set({ + isQueryClausesPanelOpen: false + }) })); From 5d1d0dbe79b6a9cca648b547d14334069f19c1d6 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 29 Sep 2025 19:59:03 +0530 Subject: [PATCH 02/21] Add refresh and reset functionality --- .../src/views/DataMapper/DataMapperView.tsx | 49 +++++++++++++------ .../DataMapper/DataMapperEditor.tsx | 4 ++ .../DataMapper/Header/DataMapperHeader.tsx | 23 ++++++++- .../ballerina/data-mapper/src/index.tsx | 4 +- 4 files changed, 61 insertions(+), 19 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx index 7909fd0644f..7e00b54930b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx @@ -92,7 +92,8 @@ export function DataMapperView(props: DataMapperProps) { const { model, isFetching, - isError + isError, + refetch } = useDataMapperModel(filePath, viewState, position); const prevPositionRef = useRef(position); @@ -189,21 +190,6 @@ export function DataMapperView(props: DataMapperProps) { [modelState] ); - - const onDMClose = () => { - onClose ? onClose() : rpcClient.getVisualizerRpcClient()?.goBack(); - } - - const onEdit = () => { - const context: VisualizerLocation = { - view: MACHINE_VIEW.BIDataMapperForm, - identifier: modelState.model.output.name, - documentUri: filePath, - }; - - rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: context }); - } - const updateExpression = async (outputId: string, expression: string, viewId: string, name: string) => { try { const resp = await rpcClient @@ -537,6 +523,35 @@ export function DataMapperView(props: DataMapperProps) { parentField.isDeepNested = false; } + + + const onDMClose = () => { + onClose ? onClose() : rpcClient.getVisualizerRpcClient()?.goBack(); + } + + + const onDMRefresh = async () => { + await refetch(); + }; + + const onDMReset = async () => { + await deleteMapping( + { output: name, expression: undefined }, + name + ); + }; + + const onEdit = () => { + const context: VisualizerLocation = { + view: MACHINE_VIEW.BIDataMapperForm, + identifier: modelState.model.output.name, + documentUri: filePath, + }; + + rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: context }); + } + + useEffect(() => { // Hack to hit the error boundary if (isError) { @@ -652,6 +667,8 @@ export function DataMapperView(props: DataMapperProps) { modelState={modelState} name={name} onClose={onDMClose} + onRefresh={onDMRefresh} + onReset={onDMReset} onEdit={reusable ? onEdit : undefined} applyModifications={updateExpression} addArrayElement={addArrayElement} diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx index ae49237b456..8ae68b725f9 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx @@ -126,6 +126,8 @@ export function DataMapperEditor(props: DataMapperEditorProps) { name, applyModifications, onClose, + onRefresh, + onReset, onEdit, addArrayElement, handleView, @@ -331,6 +333,8 @@ export function DataMapperEditor(props: DataMapperEditorProps) { hasEditDisabled={!!errorKind} onClose={handleOnClose} onBack={handleOnBack} + onRefresh={onRefresh} + onReset={onReset} onEdit={onEdit} autoMapWithAI={autoMapWithAI} undoRedoGroup={undoRedoGroup} diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx index 624931a2c90..f5de7697e0b 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx @@ -18,7 +18,7 @@ // tslint:disable: jsx-no-multiline-js import React from "react"; import styled from "@emotion/styled"; -import { Codicon, Icon } from "@wso2/ui-toolkit"; +import { Button, Codicon, Icon } from "@wso2/ui-toolkit"; import HeaderSearchBox from "./HeaderSearchBox"; import HeaderBreadcrumb from "./HeaderBreadcrumb"; @@ -35,17 +35,34 @@ export interface DataMapperHeaderProps { onClose: () => void; onBack: () => void; onEdit?: () => void; + onRefresh: () => Promise; + onReset: () => Promise; autoMapWithAI: () => Promise; undoRedoGroup: () => JSX.Element; } export function DataMapperHeader(props: DataMapperHeaderProps) { - const { views, switchView, hasEditDisabled, onClose, onBack, onEdit, autoMapWithAI, undoRedoGroup } = props; + const { views, switchView, hasEditDisabled, onClose, onBack, onRefresh, onReset, onEdit, autoMapWithAI, undoRedoGroup } = props; + + const [isRefreshing, setIsRefreshing] = React.useState(false); + const [isResetting, setIsResetting] = React.useState(false); const handleAutoMap = async () => { await autoMapWithAI(); }; + const handleOnRefresh = async () => { + setIsRefreshing(true); + await onRefresh(); + setIsRefreshing(false); + }; + + const handleOnReset = async () => { + setIsResetting(true); + await onReset(); + setIsResetting(false); + }; + return ( @@ -53,6 +70,8 @@ export function DataMapperHeader(props: DataMapperHeaderProps) { {undoRedoGroup && undoRedoGroup()} + + Data Mapper {!hasEditDisabled && ( diff --git a/workspaces/ballerina/data-mapper/src/index.tsx b/workspaces/ballerina/data-mapper/src/index.tsx index d1140ed4dc5..e46a4914ea2 100644 --- a/workspaces/ballerina/data-mapper/src/index.tsx +++ b/workspaces/ballerina/data-mapper/src/index.tsx @@ -64,7 +64,6 @@ export interface DataMapperEditorProps { name: string; applyModifications: (outputId: string, expression: string, viewId: string, name: string) => Promise; addArrayElement: (outputId: string, viewId: string, name: string) => Promise; - generateForm: (formProps: DMFormProps) => JSX.Element; convertToQuery: (mapping: Mapping, clauseType: ResultClauseType, viewId: string, name: string) => Promise; addClauses: (clause: IntermediateClause, targetField: string, isNew: boolean, index:number) => Promise; deleteClause: (targetField: string, index: number) => Promise; @@ -75,9 +74,12 @@ export interface DataMapperEditorProps { mapWithTransformFn: (mapping: Mapping, metadata: FnMetadata, viewId: string) => Promise; goToFunction: (functionRange: LineRange) => Promise; enrichChildFields: (parentField: IOType) => Promise; + onRefresh: () => Promise; + onReset: () => Promise; onClose: () => void; onEdit?: () => void; handleView: (viewId: string, isSubMapping?: boolean) => void; + generateForm: (formProps: DMFormProps) => JSX.Element; undoRedoGroup: () => JSX.Element; } From 21386316ced8e9201d73c8d79455f7ea4c3f4e0c Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 29 Sep 2025 22:06:18 +0530 Subject: [PATCH 03/21] Enhance Refresh and Reset buttons with icons, loading indicators and tooltips --- .../DataMapper/Header/DataMapperHeader.tsx | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx index f5de7697e0b..c29ff3c19d7 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx @@ -18,7 +18,7 @@ // tslint:disable: jsx-no-multiline-js import React from "react"; import styled from "@emotion/styled"; -import { Button, Codicon, Icon } from "@wso2/ui-toolkit"; +import { Button, Codicon, Icon, ProgressRing } from "@wso2/ui-toolkit"; import HeaderSearchBox from "./HeaderSearchBox"; import HeaderBreadcrumb from "./HeaderBreadcrumb"; @@ -70,8 +70,24 @@ export function DataMapperHeader(props: DataMapperHeaderProps) { {undoRedoGroup && undoRedoGroup()} - - + + Data Mapper {!hasEditDisabled && ( From ae59f839fbcd79530267b3a72e986e9186dfe05b Mon Sep 17 00:00:00 2001 From: ChamodA Date: Fri, 3 Oct 2025 19:15:41 +0530 Subject: [PATCH 04/21] Gen RPC code for clearTypeCache --- .../ballerina-core/src/interfaces/extended-lang-client.ts | 4 ++++ .../ballerina-core/src/rpc-types/data-mapper/index.ts | 4 +++- .../ballerina-core/src/rpc-types/data-mapper/rpc-type.ts | 4 +++- .../src/rpc-managers/data-mapper/rpc-handler.ts | 2 ++ .../src/rpc-managers/data-mapper/rpc-manager.ts | 6 ++++++ .../src/rpc-clients/data-mapper/rpc-client.ts | 6 ++++++ 6 files changed, 24 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts index 87b6d04102c..38500687843 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -470,6 +470,10 @@ export interface MapWithFnRequest { subMappingName?: string; } +export interface ClearTypeCacheResponse { + success: boolean; +} + export interface GetDataMapperCodedataRequest { filePath: string; codedata: CodeData; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/index.ts index dce3f653c96..0508511647d 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/index.ts @@ -41,7 +41,8 @@ import { DMModelRequest, ProcessTypeReferenceResponse, ProcessTypeReferenceRequest, - ExpandedDMModelResponse + ExpandedDMModelResponse, + ClearTypeCacheResponse } from "../../interfaces/extended-lang-client"; export interface DataMapperAPI { @@ -64,4 +65,5 @@ export interface DataMapperAPI { getProperty: (params: PropertyRequest) => Promise; getExpandedDMFromDMModel: (params: DMModelRequest) => Promise; getProcessTypeReference: (params: ProcessTypeReferenceRequest) => Promise; + clearTypeCache: () => Promise; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/rpc-type.ts index 774ebd4faa7..875a6920739 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/rpc-type.ts @@ -43,7 +43,8 @@ import { DMModelRequest, ProcessTypeReferenceResponse, ProcessTypeReferenceRequest, - ExpandedDMModelResponse + ExpandedDMModelResponse, + ClearTypeCacheResponse } from "../../interfaces/extended-lang-client"; import { RequestType } from "vscode-messenger-common"; @@ -67,3 +68,4 @@ export const getAllDataMapperSource: RequestType = { method: `${_preFix}/getProperty` }; export const getExpandedDMFromDMModel: RequestType = { method: `${_preFix}/getExpandedDMFromDMModel` }; export const getProcessTypeReference: RequestType = { method: `${_preFix}/getProcessTypeReference` }; +export const clearTypeCache: RequestType = { method: `${_preFix}/clearTypeCache` }; diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-handler.ts index 31773447c65..98e04b388c2 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-handler.ts @@ -25,6 +25,7 @@ import { addSubMapping, AddSubMappingRequest, AllDataMapperSourceRequest, + clearTypeCache, convertToQuery, ConvertToQueryRequest, DataMapperModelRequest, @@ -80,4 +81,5 @@ export function registerDataMapperRpcHandlers(messenger: Messenger) { messenger.onRequest(getProperty, (args: PropertyRequest) => rpcManger.getProperty(args)); messenger.onRequest(getExpandedDMFromDMModel, (args: DMModelRequest) => rpcManger.getExpandedDMFromDMModel(args)); messenger.onRequest(getProcessTypeReference, (args: ProcessTypeReferenceRequest) => rpcManger.getProcessTypeReference(args)); + messenger.onRequest(clearTypeCache, () => rpcManger.clearTypeCache()); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts index 8f6869cc5ec..fca7be4a73f 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts @@ -22,6 +22,7 @@ import { AddClausesRequest, AddSubMappingRequest, AllDataMapperSourceRequest, + ClearTypeCacheResponse, ConvertToQueryRequest, DataMapperAPI, DataMapperModelRequest, @@ -409,4 +410,9 @@ export class DataMapperRpcManager implements DataMapperAPI { }); }); } + + async clearTypeCache(): Promise { + // ADD YOUR IMPLEMENTATION HERE + throw new Error('Not implemented'); + } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/data-mapper/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/data-mapper/rpc-client.ts index d0c9fcf2233..20a4f0978b3 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/data-mapper/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/data-mapper/rpc-client.ts @@ -22,6 +22,7 @@ import { AddClausesRequest, AddSubMappingRequest, AllDataMapperSourceRequest, + ClearTypeCacheResponse, ConvertToQueryRequest, DMModelRequest, DataMapperAPI, @@ -48,6 +49,7 @@ import { addClauses, addNewArrayElement, addSubMapping, + clearTypeCache, convertToQuery, deleteClause, deleteMapping, @@ -150,4 +152,8 @@ export class DataMapperRpcClient implements DataMapperAPI { getProcessTypeReference(params: ProcessTypeReferenceRequest): Promise { return this._messenger.sendRequest(getProcessTypeReference, HOST_EXTENSION, params); } + + clearTypeCache(): Promise { + return this._messenger.sendRequest(clearTypeCache, HOST_EXTENSION); + } } From 65c78d8b45a11659ed47a3d8c9369b98e3df9a2a Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sun, 5 Oct 2025 10:01:09 +0530 Subject: [PATCH 05/21] Clear type cache when refreshing data mapper explicitly --- .../src/core/extended-language-client.ts | 8 +++++++- .../src/rpc-managers/data-mapper/rpc-manager.ts | 10 ++++++++-- .../src/views/DataMapper/DataMapperView.tsx | 9 ++++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts index 0a95898359d..1094af3ecbd 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -259,7 +259,8 @@ import { onMigrationToolLogs, GetMigrationToolsResponse, DeleteSubMappingRequest, - DeleteClauseRequest + DeleteClauseRequest, + ClearTypeCacheResponse } from "@wso2/ballerina-core"; import { BallerinaExtension } from "./index"; import { debug, handlePullModuleProgress } from "../utils"; @@ -357,6 +358,7 @@ enum EXTENDED_APIS { DATA_MAPPER_CODEDATA = 'dataMapper/nodePosition', DATA_MAPPER_SUB_MAPPING_CODEDATA = 'dataMapper/subMapping', DATA_MAPPER_PROPERTY = 'dataMapper/fieldPosition', + DATA_MAPPER_CLEAR_TYPE_CACHE = 'dataMapper/clearTypeCache', VIEW_CONFIG_VARIABLES = 'configEditor/getConfigVariables', UPDATE_CONFIG_VARIABLES = 'configEditor/updateConfigVariables', VIEW_CONFIG_VARIABLES_V2 = 'configEditorV2/getConfigVariables', @@ -807,6 +809,10 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.DATA_MAPPER_PROPERTY, params); } + async clearTypeCache(): Promise { + return this.sendRequest(EXTENDED_APIS.DATA_MAPPER_CLEAR_TYPE_CACHE); + } + async getGraphqlModel(params: GraphqlDesignServiceParams): Promise { return this.sendRequest(EXTENDED_APIS.GRAPHQL_DESIGN_MODEL, params); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts index fca7be4a73f..a374db3a2b0 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts @@ -412,7 +412,13 @@ export class DataMapperRpcManager implements DataMapperAPI { } async clearTypeCache(): Promise { - // ADD YOUR IMPLEMENTATION HERE - throw new Error('Not implemented'); + return new Promise(async (resolve) => { + await StateMachine + .langClient() + .clearTypeCache() + .then((resp) => { + resolve(resp); + }); + }); } } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx index 7e00b54930b..c1dc9b02502 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx @@ -529,8 +529,15 @@ export function DataMapperView(props: DataMapperProps) { onClose ? onClose() : rpcClient.getVisualizerRpcClient()?.goBack(); } - const onDMRefresh = async () => { + try { + const resp = await rpcClient + .getDataMapperRpcClient() + .clearTypeCache(); + console.log(">>> [Data Mapper] clearTypeCache response:", resp); + } catch (error) { + console.error(error); + } await refetch(); }; From 38e1f60e8793001ff1df18d442053f147224df82 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sun, 5 Oct 2025 10:17:12 +0530 Subject: [PATCH 06/21] Refactor DataMapperHeader to use RefreshResetGroup component for refresh and reset actions --- .../DataMapper/Header/DataMapperHeader.tsx | 35 +-------- .../DataMapper/Header/RefreshResetGroup.tsx | 71 +++++++++++++++++++ 2 files changed, 73 insertions(+), 33 deletions(-) create mode 100644 workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx index c29ff3c19d7..83a357af23e 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx @@ -27,6 +27,7 @@ import { VSCodeButton } from "@vscode/webview-ui-toolkit/react"; import AutoMapButton from "./AutoMapButton"; import ExpressionBarWrapper from "./ExpressionBar"; import EditButton from "./EditButton"; +import { RefreshResetGroup } from "./RefreshResetGroup"; export interface DataMapperHeaderProps { views: View[]; @@ -44,25 +45,10 @@ export interface DataMapperHeaderProps { export function DataMapperHeader(props: DataMapperHeaderProps) { const { views, switchView, hasEditDisabled, onClose, onBack, onRefresh, onReset, onEdit, autoMapWithAI, undoRedoGroup } = props; - const [isRefreshing, setIsRefreshing] = React.useState(false); - const [isResetting, setIsResetting] = React.useState(false); - const handleAutoMap = async () => { await autoMapWithAI(); }; - const handleOnRefresh = async () => { - setIsRefreshing(true); - await onRefresh(); - setIsRefreshing(false); - }; - - const handleOnReset = async () => { - setIsResetting(true); - await onReset(); - setIsResetting(false); - }; - return ( @@ -70,24 +56,7 @@ export function DataMapperHeader(props: DataMapperHeaderProps) { {undoRedoGroup && undoRedoGroup()} - - + Data Mapper {!hasEditDisabled && ( diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx new file mode 100644 index 00000000000..8fed8005939 --- /dev/null +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState } from "react"; +import styled from "@emotion/styled"; +import { Button, Codicon, ProgressRing } from "@wso2/ui-toolkit"; + +const ButtonGroup = styled.div` + display: flex; + align-items: center; +`; + +interface RefreshResetGroupProps { + onRefresh: () => Promise; + onReset: () => Promise; +} + +export function RefreshResetGroup({ onRefresh, onReset }: RefreshResetGroupProps) { + const [isRefreshing, setIsRefreshing] = useState(false); + const [isResetting, setIsResetting] = useState(false); + + const handleOnRefresh = async () => { + setIsRefreshing(true); + await onRefresh(); + setIsRefreshing(false); + }; + + const handleOnReset = async () => { + setIsResetting(true); + await onReset(); + setIsResetting(false); + }; + + return ( + + + + + ); +} From 1b1c5dbfd82c8bf3c2ab592e0b3353662bcee249 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sun, 5 Oct 2025 10:27:51 +0530 Subject: [PATCH 07/21] Refactor RefreshResetGroup to use ActionButton component for refresh and reset actions; adjust HeaderContent gap --- .../DataMapper/Header/DataMapperHeader.tsx | 2 +- .../DataMapper/Header/RefreshResetGroup.tsx | 71 ++++++++++--------- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx index 83a357af23e..6a2d1a24f21 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx @@ -98,7 +98,7 @@ const HeaderContent = styled.div` background-color: var(--vscode-editorWidget-background); justify-content: space-between; align-items: center; - gap: 12px; + gap: 4px; border-bottom: 1px solid rgba(102,103,133,0.15); `; diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx index 8fed8005939..21df6374939 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx @@ -25,47 +25,52 @@ const ButtonGroup = styled.div` align-items: center; `; +interface ActionButtonProps { + onClick: () => Promise; + iconName: string; + tooltip: string; +} + +function ActionButton({ onClick, iconName, tooltip }: ActionButtonProps) { + const [inProgress, setInProgress] = useState(false); + + const handleOnClick = async () => { + setInProgress(true); + await onClick(); + setInProgress(false); + }; + + return ( + + ); +} + interface RefreshResetGroupProps { onRefresh: () => Promise; onReset: () => Promise; } export function RefreshResetGroup({ onRefresh, onReset }: RefreshResetGroupProps) { - const [isRefreshing, setIsRefreshing] = useState(false); - const [isResetting, setIsResetting] = useState(false); - - const handleOnRefresh = async () => { - setIsRefreshing(true); - await onRefresh(); - setIsRefreshing(false); - }; - - const handleOnReset = async () => { - setIsResetting(true); - await onReset(); - setIsResetting(false); - }; - return ( - - + + ); } From 62eb99a7a6c3a533589ed259490af6f687be50f8 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sun, 5 Oct 2025 10:41:43 +0530 Subject: [PATCH 08/21] Add vertical divider between RefreshResetGroup and UndoRedoGroup in DataMapperHeader --- .../components/DataMapper/Header/DataMapperHeader.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx index 6a2d1a24f21..d9e4b30a9f2 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx @@ -56,6 +56,7 @@ export function DataMapperHeader(props: DataMapperHeaderProps) { {undoRedoGroup && undoRedoGroup()} + Data Mapper @@ -109,11 +110,17 @@ const Title = styled.h2` color: var(--vscode-foreground); `; +const VerticalDivider = styled.div` + height: 20px; + width: 1px; + background-color: var(--dropdown-border); +`; + const RightContainer = styled.div<{ isClickable: boolean }>` display: flex; align-items: center; gap: 12px; - pointer-events: ${({ isClickable }) => (isClickable ? 'auto' : 'none')}; + pointer-events: ${({ isClickable }) => (isClickable ? "auto" : "none")}; opacity: ${({ isClickable }) => (isClickable ? 1 : 0.5)}; `; From 390c0838b42c3efa8c9da1190d561cd15a9fc704 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Wed, 8 Oct 2025 14:15:50 +0530 Subject: [PATCH 09/21] Add triggerRefresh property to data models and update related hooks for refresh logic --- .../src/interfaces/data-mapper.ts | 2 ++ .../src/rpc-managers/data-mapper/utils.ts | 3 ++- .../ballerina-visualizer/src/Hooks.tsx | 19 ++++++++++++++++--- .../src/views/DataMapper/DataMapperView.tsx | 14 ++++++++------ .../Diagram/hooks/useDiagramModel.ts | 11 +++++++++-- 5 files changed, 37 insertions(+), 12 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts b/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts index a0f6be413f5..1e2c3aa789f 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts @@ -115,6 +115,7 @@ export interface ExpandedDMModel { rootViewId: string; query?: Query; mapping_fields?: Record; + triggerRefresh?: boolean; } export interface DMModel { @@ -127,6 +128,7 @@ export interface DMModel { query?: Query; focusInputs?: Record; mapping_fields?: Record; + triggerRefresh?: boolean; } export interface ModelState { diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts index c45223f6b68..471fc7261d5 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts @@ -517,7 +517,8 @@ export function expandDMModel( mappings: model.mappings, query: model.query, source: "", - rootViewId + rootViewId, + triggerRefresh: model.triggerRefresh }; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx b/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx index 49933195e92..45106316992 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx @@ -18,6 +18,7 @@ import { useQuery } from '@tanstack/react-query'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; import { DMViewState, LinePosition } from '@wso2/ballerina-core'; +import { useRef } from 'react'; export const useDataMapperModel = ( filePath: string, @@ -28,6 +29,8 @@ export const useDataMapperModel = ( const viewId = viewState?.viewId; const codedata = viewState?.codedata; + const triggerRefresh = useRef(false); + const getDMModel = async () => { try { const modelParams = { @@ -43,6 +46,11 @@ export const useDataMapperModel = ( .getDataMapperRpcClient() .getDataMapperModel(modelParams); + if (triggerRefresh.current) { + res.mappingsModel.triggerRefresh = true; + triggerRefresh.current = false; + } + console.log('>>> [Data Mapper] Model:', res); return res.mappingsModel; } catch (error) { @@ -57,10 +65,15 @@ export const useDataMapperModel = ( isError, refetch } = useQuery({ - queryKey: ['getDMModel', { codedata, viewId }], - queryFn: () => getDMModel(), + queryKey: ['getDMModel', codedata, viewId], + queryFn: getDMModel, networkMode: 'always' }); - return {model, isFetching, isError, refetch}; + const refreshDMModel = async () => { + triggerRefresh.current = true; + await refetch(); + }; + + return {model, isFetching, isError, refreshDMModel}; }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx index c1dc9b02502..5c5e460c019 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx @@ -93,7 +93,7 @@ export function DataMapperView(props: DataMapperProps) { model, isFetching, isError, - refetch + refreshDMModel } = useDataMapperModel(filePath, viewState, position); const prevPositionRef = useRef(position); @@ -120,10 +120,12 @@ export function DataMapperView(props: DataMapperProps) { const currentSignature = JSON.stringify(getModelSignature(model)); const prevSignature = prevSignatureRef.current; - const hasInputsChanged = hasSignatureChanged(currentSignature, prevSignature, 'inputs'); - const hasOutputChanged = hasSignatureChanged(currentSignature, prevSignature, 'output'); - const hasSubMappingsChanged = hasSignatureChanged(currentSignature, prevSignature, 'subMappings'); - const hasRefsChanged = hasSignatureChanged(currentSignature, prevSignature, 'refs'); + const triggerRefresh = model.triggerRefresh; + + const hasInputsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'inputs'); + const hasOutputChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'output'); + const hasSubMappingsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'subMappings'); + const hasRefsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'refs'); // Check if it's already an ExpandedDMModel const isExpandedModel = !('refs' in model); @@ -538,7 +540,7 @@ export function DataMapperView(props: DataMapperProps) { } catch (error) { console.error(error); } - await refetch(); + await refreshDMModel(); }; const onDMReset = async () => { diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/hooks/useDiagramModel.ts b/workspaces/ballerina/data-mapper/src/components/Diagram/hooks/useDiagramModel.ts index 751a9ce04b5..85babd4ccc0 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/hooks/useDiagramModel.ts +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/hooks/useDiagramModel.ts @@ -26,12 +26,13 @@ import { useDMSearchStore } from "../../../store/store"; import { InputNode } from "../Node"; import { getErrorKind } from "../utils/common-utils"; import { OverlayLayerModel } from "../OverlayLayer/OverlayLayerModel"; +import { useEffect } from "react"; export const useDiagramModel = ( nodes: DataMapperNodeModel[], diagramModel: DiagramModel, onError:(kind: ErrorNodeKind) => void, - zoomLevel: number, + zoomLevel: number ): { updatedModel: DiagramModel; isFetching: boolean; @@ -86,7 +87,7 @@ export const useDiagramModel = ( data: updatedModel, isFetching, isError, - refetch, + refetch } = useQuery({ queryKey: [ 'diagramModel', @@ -103,5 +104,11 @@ export const useDiagramModel = ( networkMode: 'always', }); + useEffect(() => { + if (model?.triggerRefresh) { + refetch(); + } + }, [model, refetch]); + return { updatedModel, isFetching, isError, refetch }; }; From 8bca700972b0daabc340ec3f5d49fddc50a339ef Mon Sep 17 00:00:00 2001 From: ChamodA Date: Wed, 8 Oct 2025 14:25:39 +0530 Subject: [PATCH 10/21] Change initPorts method signature to return a Promise for asynchronous initialization --- .../src/components/Diagram/Node/commons/DataMapperNode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts index d409fef383e..d25ed83eae0 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts @@ -93,7 +93,7 @@ export abstract class DataMapperNodeModel extends NodeModel; abstract initLinks(): void; protected async addPortsForInputField(attributes: InputPortAttributes): Promise { From 748e12ccfd3aedb2cc2adf45e512d59d0fa23ee5 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Wed, 8 Oct 2025 14:34:55 +0530 Subject: [PATCH 11/21] Refactor code formatting for consistency in Hooks and DataMapperView components --- workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx | 2 +- .../src/views/DataMapper/DataMapperView.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx b/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx index 45106316992..e05b886b71d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx @@ -75,5 +75,5 @@ export const useDataMapperModel = ( await refetch(); }; - return {model, isFetching, isError, refreshDMModel}; + return { model, isFetching, isError, refreshDMModel }; }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx index 5c5e460c019..2e8709072a7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx @@ -122,7 +122,7 @@ export function DataMapperView(props: DataMapperProps) { const triggerRefresh = model.triggerRefresh; - const hasInputsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'inputs'); + const hasInputsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'inputs'); const hasOutputChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'output'); const hasSubMappingsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'subMappings'); const hasRefsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'refs'); From 4760a1a9d2321a250ad7e3ece8f41b0fb8528411 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Wed, 8 Oct 2025 14:38:58 +0530 Subject: [PATCH 12/21] Update initPorts method signature to allow both Promise and void return types --- .../src/components/Diagram/Node/commons/DataMapperNode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts index d25ed83eae0..4912f5006b3 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts @@ -93,7 +93,7 @@ export abstract class DataMapperNodeModel extends NodeModel; + abstract initPorts(): Promise | void; abstract initLinks(): void; protected async addPortsForInputField(attributes: InputPortAttributes): Promise { From ec7cfb686fd6d8037b585311c93624a20d659495 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Fri, 17 Oct 2025 13:20:11 +0530 Subject: [PATCH 13/21] Fix undo-redo stack reset condition to handle side-by-side editing --- .../ballerina-extension/src/views/visualizer/webview.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts b/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts index e64ae2a9c7d..4cb902a33f8 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts @@ -68,7 +68,7 @@ export class VisualizerWebview { const documentUri = document.document.uri.toString(); const isDocumentUnderProject = documentUri.includes(projectUri); // Reset visualizer the undo-redo stack if user did changes in the editor - if (isOpened && isDocumentUnderProject) { + if (isOpened && isDocumentUnderProject && !this._panel?.active) { undoRedoManager.reset(); } From 0e5e9131a6f7a9fd620c3f3a604dea857713964e Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sat, 25 Oct 2025 21:00:25 +0530 Subject: [PATCH 14/21] Update property valueType to "DATA_MAPPING_EXPRESSION" in completion request --- .../src/views/DataMapper/DataMapperView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx index 7909fd0644f..63fcb580141 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx @@ -581,7 +581,7 @@ export function DataMapperView(props: DataMapperProps) { lineOffset: lineOffset, offset: charOffset, codedata: viewState.codedata, - property: property, + property: { ...property, valueType: "DATA_MAPPING_EXPRESSION" } }, completionContext: { triggerKind: triggerCharacter ? 2 : 1, From 36ee64b58f096bd9c6dd7763ac630aef5fbe0652 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Wed, 22 Oct 2025 11:27:09 +0530 Subject: [PATCH 15/21] Update @playwright/test and playwright-core to version 1.55.1 across multiple workspaces --- workspaces/bi/bi-extension/package.json | 2 +- workspaces/choreo/choreo-extension/package.json | 2 +- workspaces/common-libs/playwright-vscode-tester/package.json | 4 ++-- workspaces/mi/mi-extension/package.json | 4 ++-- workspaces/mi/mi-visualizer/package.json | 2 +- workspaces/wso2-platform/wso2-platform-extension/package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/workspaces/bi/bi-extension/package.json b/workspaces/bi/bi-extension/package.json index c2572eeeabf..2cfd9cfda14 100644 --- a/workspaces/bi/bi-extension/package.json +++ b/workspaces/bi/bi-extension/package.json @@ -196,7 +196,7 @@ "webpack": "^5.99.8", "webpack-cli": "^6.0.1", "webpack-permissions-plugin": "^1.0.9", - "@playwright/test": "~1.52.0", + "@playwright/test": "~1.55.1", "@wso2/playwright-vscode-tester": "workspace:*" } } diff --git a/workspaces/choreo/choreo-extension/package.json b/workspaces/choreo/choreo-extension/package.json index 7ebb0206ea2..1c9071dd0d8 100644 --- a/workspaces/choreo/choreo-extension/package.json +++ b/workspaces/choreo/choreo-extension/package.json @@ -188,7 +188,7 @@ "postbuild": "pnpm run package && pnpm run copyVSIX" }, "devDependencies": { - "@playwright/test": "1.52.0", + "@playwright/test": "1.55.1", "@types/byline": "^4.2.36", "@types/js-yaml": "^4.0.9", "@types/mocha": "~10.0.1", diff --git a/workspaces/common-libs/playwright-vscode-tester/package.json b/workspaces/common-libs/playwright-vscode-tester/package.json index 35ba6e602e4..22e30adc565 100644 --- a/workspaces/common-libs/playwright-vscode-tester/package.json +++ b/workspaces/common-libs/playwright-vscode-tester/package.json @@ -31,8 +31,8 @@ "hpagent": "~1.2.0", "targz": "~1.0.1", "unzipper": "~0.12.3", - "playwright-core": "~1.52.0", + "playwright-core": "~1.55.1", "got": "14.4.7", - "@playwright/test": "1.52.0" + "@playwright/test": "1.55.1" } } diff --git a/workspaces/mi/mi-extension/package.json b/workspaces/mi/mi-extension/package.json index 346a9caf352..0f97d339e23 100644 --- a/workspaces/mi/mi-extension/package.json +++ b/workspaces/mi/mi-extension/package.json @@ -988,8 +988,8 @@ "ts-morph": "^26.0.0", "await-notify": "^1.0.1", "yaml": "~2.8.0", - "@playwright/test": "~1.52.0", - "playwright-core": "~1.52.0" + "@playwright/test": "~1.55.1", + "playwright-core": "~1.55.1" }, "dependencies": { "copyfiles": "^2.4.1", diff --git a/workspaces/mi/mi-visualizer/package.json b/workspaces/mi/mi-visualizer/package.json index 4a4abf34bfc..cb90299a305 100644 --- a/workspaces/mi/mi-visualizer/package.json +++ b/workspaces/mi/mi-visualizer/package.json @@ -60,7 +60,7 @@ "@wso2/mi-component-diagram": "workspace:*", "lodash": "~4.17.21", "cron-expression-validator": "~1.0.20", - "@playwright/test": "1.52.0", + "@playwright/test": "1.55.1", "react-pdf": "~9.2.1", "@monaco-editor/react": "^4.7.0" }, diff --git a/workspaces/wso2-platform/wso2-platform-extension/package.json b/workspaces/wso2-platform/wso2-platform-extension/package.json index 3a479682516..228a2790b6e 100644 --- a/workspaces/wso2-platform/wso2-platform-extension/package.json +++ b/workspaces/wso2-platform/wso2-platform-extension/package.json @@ -212,7 +212,7 @@ "postbuild": "pnpm run package && pnpm run copyVSIX" }, "devDependencies": { - "@playwright/test": "1.52.0", + "@playwright/test": "1.55.1", "@types/byline": "^4.2.36", "@types/js-yaml": "^4.0.9", "@types/mocha": "~10.0.1", From 5689b80e2d43c2e5f0e2c5ee8743596be275b22b Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Sat, 25 Oct 2025 22:28:34 +0530 Subject: [PATCH 16/21] Refactor ConnectorView to directly set connectors from model categories and comment out localConnectors in project explorer --- .../src/views/BI/Connection/ConnectorView/index.tsx | 12 +++++------- .../project-explorer/project-explorer-provider.ts | 3 ++- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Connection/ConnectorView/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Connection/ConnectorView/index.tsx index 6d9a66f70ff..bffcf553923 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Connection/ConnectorView/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Connection/ConnectorView/index.tsx @@ -119,7 +119,7 @@ export function ConnectorView(props: ConnectorViewProps) { const [isSearching, setIsSearching] = useState(false); const [fetchingInfo, setFetchingInfo] = useState(false); const [selectedConnectorCategory, setSelectedConnectorCategory] = useState( - openCustomConnectorView? "LocalConnectors" : "StandardLibrary" + openCustomConnectorView ? "LocalConnectors" : "StandardLibrary" ); useEffect(() => { @@ -152,9 +152,8 @@ export function ConnectorView(props: ConnectorViewProps) { }) .then(async (model) => { console.log(">>> bi connectors", model); - const filtered = await filterCategories(model.categories); - console.log(">>> bi filtered connectors", filtered); - setConnectors(filtered); + console.log(">>> bi filtered connectors", model.categories); + setConnectors(model.categories); }) .finally(() => { setIsSearching(false); @@ -188,9 +187,8 @@ export function ConnectorView(props: ConnectorViewProps) { }) .then(async (model) => { console.log(">>> bi searched connectors", model); - const filtered = await filterCategories(model.categories); - console.log(">>> bi filtered connectors", filtered); - setConnectors(filtered); + console.log(">>> bi filtered connectors", model.categories); + setConnectors(model.categories); }) .finally(() => { setIsSearching(false); diff --git a/workspaces/bi/bi-extension/src/project-explorer/project-explorer-provider.ts b/workspaces/bi/bi-extension/src/project-explorer/project-explorer-provider.ts index 3d38d3f2460..354115c107f 100644 --- a/workspaces/bi/bi-extension/src/project-explorer/project-explorer-provider.ts +++ b/workspaces/bi/bi-extension/src/project-explorer/project-explorer-provider.ts @@ -315,7 +315,8 @@ function getEntriesBI(components: ProjectStructureResponse): ProjectExplorerEntr if (localConnectors.children.length > 0) { localConnectors.collapsibleState = vscode.TreeItemCollapsibleState.Expanded; } - entries.push(localConnectors); + // REMOVE THE CUSTOM CONNECTOR TREE ITEM FOR NOW + // entries.push(localConnectors); return entries; } From ab0278941d031349e35c3192c67ad0f9cade522c Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sat, 25 Oct 2025 22:40:18 +0530 Subject: [PATCH 17/21] Update @playwright/test and playwright-core to version 1.55.1 in pnpm-lock.yaml --- common/config/rush/pnpm-lock.yaml | 57 ++++++++++++++++--------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index e483ed47f52..5157348b745 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -2108,8 +2108,8 @@ importers: version: 4.38.3 devDependencies: '@playwright/test': - specifier: ~1.52.0 - version: 1.52.0 + specifier: ~1.55.1 + version: 1.55.1 '@types/mocha': specifier: ^10.0.3 version: 10.0.10 @@ -2254,8 +2254,8 @@ importers: specifier: ^1.8.3 version: 1.9.4 '@playwright/test': - specifier: 1.52.0 - version: 1.52.0 + specifier: 1.55.1 + version: 1.55.1 '@types/byline': specifier: ^4.2.36 version: 4.2.36 @@ -2486,8 +2486,8 @@ importers: ../../workspaces/common-libs/playwright-vscode-tester: dependencies: '@playwright/test': - specifier: 1.52.0 - version: 1.52.0 + specifier: 1.55.1 + version: 1.55.1 '@vscode/vsce': specifier: ~3.4.2 version: 3.4.2 @@ -2504,8 +2504,8 @@ importers: specifier: ~1.2.0 version: 1.2.0 playwright-core: - specifier: ~1.52.0 - version: 1.52.0 + specifier: ~1.55.1 + version: 1.55.1 targz: specifier: ~1.0.1 version: 1.0.1 @@ -3345,8 +3345,8 @@ importers: version: 4.38.3 devDependencies: '@playwright/test': - specifier: ~1.52.0 - version: 1.52.0 + specifier: ~1.55.1 + version: 1.55.1 '@types/mocha': specifier: ^10.0.1 version: 10.0.10 @@ -3387,8 +3387,8 @@ importers: specifier: ^11.4.0 version: 11.7.1 playwright-core: - specifier: ~1.52.0 - version: 1.52.0 + specifier: ~1.55.1 + version: 1.55.1 rimraf: specifier: ~6.0.1 version: 6.0.1 @@ -3481,8 +3481,8 @@ importers: specifier: ^4.7.0 version: 4.7.0(monaco-editor@0.52.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@playwright/test': - specifier: 1.52.0 - version: 1.52.0 + specifier: 1.55.1 + version: 1.55.1 '@pmmmwh/react-refresh-webpack-plugin': specifier: ~0.6.0 version: 0.6.1(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.101.0) @@ -3812,8 +3812,8 @@ importers: specifier: ^1.9.4 version: 1.9.4 '@playwright/test': - specifier: 1.52.0 - version: 1.52.0 + specifier: 1.55.1 + version: 1.55.1 '@types/byline': specifier: ^4.2.36 version: 4.2.36 @@ -6059,8 +6059,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.52.0': - resolution: {integrity: sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==} + '@playwright/test@1.55.1': + resolution: {integrity: sha512-IVAh/nOJaw6W9g+RJVlIQJ6gSiER+ae6mKQ5CX1bERzQgbC1VSeBlwdvczT7pxb0GWiyrxH4TGKbMfDb4Sq/ig==} engines: {node: '>=18'} hasBin: true @@ -17241,13 +17241,13 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - playwright-core@1.52.0: - resolution: {integrity: sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==} + playwright-core@1.55.1: + resolution: {integrity: sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==} engines: {node: '>=18'} hasBin: true - playwright@1.52.0: - resolution: {integrity: sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==} + playwright@1.55.1: + resolution: {integrity: sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==} engines: {node: '>=18'} hasBin: true @@ -24169,7 +24169,10 @@ snapshots: jest-runner: 25.5.4 jest-runtime: 25.5.4 transitivePeerDependencies: + - bufferutil + - canvas - supports-color + - utf-8-validate '@jest/test-sequencer@29.7.0': dependencies: @@ -24689,9 +24692,9 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.52.0': + '@playwright/test@1.55.1': dependencies: - playwright: 1.52.0 + playwright: 1.55.1 '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.101.0)': dependencies: @@ -42818,11 +42821,11 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 - playwright-core@1.52.0: {} + playwright-core@1.55.1: {} - playwright@1.52.0: + playwright@1.55.1: dependencies: - playwright-core: 1.52.0 + playwright-core: 1.55.1 optionalDependencies: fsevents: 2.3.2 From 2c8e9a240b2cb46a3ad0d41eaad98ea567e2f48c Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sun, 26 Oct 2025 18:42:02 +0530 Subject: [PATCH 18/21] Remove menu item for aggregating arrays in MappingOptionsWidget --- .../src/components/Diagram/Label/MappingOptionsWidget.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Label/MappingOptionsWidget.tsx b/workspaces/ballerina/data-mapper/src/components/Diagram/Label/MappingOptionsWidget.tsx index f2e0467e5f0..37730aede5e 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Label/MappingOptionsWidget.tsx +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Label/MappingOptionsWidget.tsx @@ -159,11 +159,6 @@ export function MappingOptionsWidget(props: MappingOptionsWidgetProps) { id: "a2s-direct", label: getItemElement("a2s-direct", "Extract Single Element from Array"), onClick: wrapWithProgress(onClickMapArraysAccessSingleton) - }, - { - id: "a2s-aggregate", - label: getItemElement("a2s-aggregate", "Aggregate using Query"), - onClick: wrapWithProgress(onClickAggregateArray) } ]; From e114cb94fc76e194086e528609f1358b27bc2068 Mon Sep 17 00:00:00 2001 From: madushajg Date: Sun, 26 Oct 2025 20:37:05 +0530 Subject: [PATCH 19/21] Enhance data type handling in Data Mapper by adding new TypeKind enums for signed and unsigned integers, and string character types --- .../src/interfaces/data-mapper.ts | 7 +++++ .../Diagram/Label/MappingOptionsWidget.tsx | 2 +- .../components/Diagram/utils/type-utils.ts | 30 +++++++++++++++++-- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts b/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts index 1e2c3aa789f..bc6569f90a7 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts @@ -24,7 +24,14 @@ export enum TypeKind { Record = "record", Array = "array", String = "string", + StringChar = "string:Char", Int = "int", + IntSigned8 = "int:Signed8", + IntSigned16 = "int:Signed16", + IntSigned32 = "int:Signed32", + IntUnsigned8 = "int:Unsigned8", + IntUnsigned16 = "int:Unsigned16", + IntUnsigned32 = "int:Unsigned32", Float = "float", Decimal = "decimal", Boolean = "boolean", diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Label/MappingOptionsWidget.tsx b/workspaces/ballerina/data-mapper/src/components/Diagram/Label/MappingOptionsWidget.tsx index f2e0467e5f0..95856748647 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Label/MappingOptionsWidget.tsx +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Label/MappingOptionsWidget.tsx @@ -178,7 +178,7 @@ export function MappingOptionsWidget(props: MappingOptionsWidgetProps) { const defaultMenuItems: Item[] = [ { id: "a2a-direct", - label: getItemElement("direct", "Map directly"), + label: getItemElement("direct", "Map Anyway"), onClick: wrapWithProgress(onClickMapDirectly) } ]; diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/utils/type-utils.ts b/workspaces/ballerina/data-mapper/src/components/Diagram/utils/type-utils.ts index e1bc4b46be6..93706781864 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/utils/type-utils.ts +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/utils/type-utils.ts @@ -61,6 +61,32 @@ export function isEnumMember(parent: InputNode): boolean { } export function isPrimitive(typeKind: TypeKind): boolean { - return typeKind === TypeKind.String || typeKind === TypeKind.Int || typeKind === TypeKind.Float || - typeKind === TypeKind.Decimal || typeKind === TypeKind.Boolean || typeKind === TypeKind.Byte; + const genericTypeKind = getGenericTypeKind(typeKind); + return genericTypeKind === TypeKind.String || + genericTypeKind === TypeKind.Int || + genericTypeKind === TypeKind.Float || + genericTypeKind === TypeKind.Decimal || + genericTypeKind === TypeKind.Boolean || + genericTypeKind === TypeKind.Byte; } + +export function getGenericTypeKind(typeKind: TypeKind): TypeKind { + switch (typeKind) { + case TypeKind.IntSigned8: + return TypeKind.Int; + case TypeKind.IntSigned16: + return TypeKind.Int; + case TypeKind.IntSigned32: + return TypeKind.Int; + case TypeKind.IntUnsigned8: + return TypeKind.Int; + case TypeKind.IntUnsigned16: + return TypeKind.Int; + case TypeKind.IntUnsigned32: + return TypeKind.Int; + case TypeKind.StringChar: + return TypeKind.String; + default: + return typeKind; + } +}; From 56055340c7bcfd559ea6f7dc451adccf7ebe5094 Mon Sep 17 00:00:00 2001 From: madushajg Date: Sun, 26 Oct 2025 22:21:46 +0530 Subject: [PATCH 20/21] Update CHANGELOG for version 1.3.2 --- workspaces/bi/bi-extension/CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/workspaces/bi/bi-extension/CHANGELOG.md b/workspaces/bi/bi-extension/CHANGELOG.md index 0101b4c2ea7..9a34550e2af 100644 --- a/workspaces/bi/bi-extension/CHANGELOG.md +++ b/workspaces/bi/bi-extension/CHANGELOG.md @@ -7,6 +7,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) ## [Unreleased] +## [1.3.2](https://github.com/wso2/vscode-extensions/compare/ballerina-integrator-1.3.1...ballerina-integrator-1.3.2) - 2025-10-26 + +### Changed + +- **Data Mapper** Enable reset and refresh options. + +### Fixed + +- **Editor** Allow artifact creation even when corresponding source files are missing. +- **Data Mapper** — Add support for mappings with built-in Ballerina sub-types (e.g., int:Signed32), fix creation using types from sub-modules, enable expression-bar completions for reusable mappers, and correct link rendering for optional field access. +- **Type Browser** — Improve type filtering based on user queries. +- **Service Class Designer** — Enable connection generation for clients created from WSDL files. + + ## [1.3.1](https://github.com/wso2/vscode-extensions/compare/ballerina-integrator-1.3.0...ballerina-integrator-1.3.1) - 2025-10-15 ### Changed From 75e91073f3e2ce693bf389e7f5381053db6a4533 Mon Sep 17 00:00:00 2001 From: choreo-cicd Date: Sun, 26 Oct 2025 17:13:14 +0000 Subject: [PATCH 21/21] Update version to ballerina-integrator-1.3.2 --- workspaces/ballerina/ballerina-extension/package.json | 2 +- workspaces/bi/bi-extension/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index ad858fcdcd1..15c4e053aed 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -2,7 +2,7 @@ "name": "ballerina", "displayName": "Ballerina", "description": "Ballerina Language support, debugging, graphical visualization, AI-based data-mapping and many more.", - "version": "5.4.1", + "version": "5.4.2", "publisher": "wso2", "icon": "resources/images/ballerina.png", "homepage": "https://wso2.com/ballerina/vscode/docs", diff --git a/workspaces/bi/bi-extension/package.json b/workspaces/bi/bi-extension/package.json index 2cfd9cfda14..0aeb1056bd1 100644 --- a/workspaces/bi/bi-extension/package.json +++ b/workspaces/bi/bi-extension/package.json @@ -2,7 +2,7 @@ "name": "ballerina-integrator", "displayName": "WSO2 Integrator: BI", "description": "An extension which gives a development environment for designing, developing, debugging, and testing integration solutions.", - "version": "1.3.1", + "version": "1.3.2", "publisher": "wso2", "icon": "resources/images/wso2-ballerina-integrator-logo.png", "repository": {