Skip to content

Commit 45d480b

Browse files
authored
Merge pull request axonivy#781 from axonivy/XIVY-16879_extension_improvements
Xivy 16879 extension improvements
2 parents 4fb7b5e + ff9ce54 commit 45d480b

File tree

21 files changed

+176
-121
lines changed

21 files changed

+176
-121
lines changed

extension/src/base/ivyProjectSelection.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
import * as vscode from 'vscode';
22
import { IvyProjectExplorer } from '../project-explorer/ivy-project-explorer';
3+
import { logErrorMessage } from './logging-util';
34

45
export const getIvyProject = async (projectExplorer: IvyProjectExplorer) => {
56
const projects = await projectExplorer.getIvyProjects();
7+
let uri: string | undefined;
8+
69
if (!projects || projects.length === 0) {
7-
vscode.window.showErrorMessage('No ivy-projects are open in the workspace.');
10+
logErrorMessage('No ivy-projects are open in the workspace.');
811
return;
12+
} else if (projects.length === 1) {
13+
uri = projects[0];
14+
} else {
15+
uri = await showIvyProjectPick(projects);
916
}
1017

18+
return uri ? vscode.Uri.file(uri) : undefined;
19+
};
20+
21+
const showIvyProjectPick = async (projects: Array<string>) => {
1122
const items = projects.map(project => ({
1223
label: project.substring(project.lastIndexOf('/') + 1),
1324
description: project,
@@ -21,6 +32,5 @@ export const getIvyProject = async (projectExplorer: IvyProjectExplorer) => {
2132
if (!selected) {
2233
return;
2334
}
24-
25-
return vscode.Uri.file(selected.uri);
35+
return selected.uri;
2636
};

extension/src/base/logging-util.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import * as vscode from 'vscode';
2+
3+
const outputChannel = vscode.window.createOutputChannel('Axon Ivy Extension Log', { log: true });
4+
5+
export const logErrorMessage = (message: string, ...items: Array<string>) => {
6+
outputChannel.error(message, ...items);
7+
return vscode.window.showErrorMessage(message, ...items);
8+
};
9+
10+
export const logWarningMessage = (message: string, ...items: Array<string>) => {
11+
outputChannel.warn(message, ...items);
12+
return vscode.window.showWarningMessage(message, ...items);
13+
};
14+
15+
export const logInformationMessage = (message: string, ...items: Array<string>) => {
16+
outputChannel.info(message, ...items);
17+
return vscode.window.showInformationMessage(message, ...items);
18+
};

extension/src/browser/ivy-browser-view-provider.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as vscode from 'vscode';
22
import { executeCommand, registerCommand } from '../base/commands';
3+
import { logErrorMessage } from '../base/logging-util';
34
import { findRootEntry, parseBuildManifest } from '../editors/build-manifest';
45

56
export class IvyBrowserViewProvider implements vscode.WebviewViewProvider {
@@ -57,7 +58,7 @@ export class IvyBrowserViewProvider implements vscode.WebviewViewProvider {
5758
const url = vscode.Uri.parse(e.url);
5859
vscode.env.openExternal(url);
5960
} catch {
60-
vscode.window.showErrorMessage(`Couldn't open uri '${e.url}' in external browser.`);
61+
logErrorMessage(`Couldn't open uri '${e.url}' in external browser.`);
6162
}
6263
break;
6364
case 'openHome':

extension/src/editors/cms-editor/open-cms-editor-cmd.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
import * as vscode from 'vscode';
22
import { messenger } from '../..';
33
import { registerCommand } from '../../base/commands';
4+
import { logErrorMessage } from '../../base/logging-util';
45
import { IvyProjectExplorer } from '../../project-explorer/ivy-project-explorer';
5-
import { TreeSelection, treeSelectionToProjectPath } from '../../project-explorer/tree-selection';
6+
import { TreeSelection, treeSelectionToUri, treeUriToProjectPath } from '../../project-explorer/tree-selection';
67
import { createWebViewContent } from '../webview-helper';
78
import { setupCommunication } from './webview-communication';
89

910
export const registerOpenCmsEditorCmd = (context: vscode.ExtensionContext, websocketUrl: URL) => {
1011
registerCommand('ivyBrowserView.openCmsEditor', context, async (selection: TreeSelection) => {
1112
let projectPath: string | undefined;
1213
try {
13-
projectPath = await treeSelectionToProjectPath(selection, IvyProjectExplorer.instance.getIvyProjects());
14+
const uri = await treeSelectionToUri(selection);
15+
projectPath = await treeUriToProjectPath(uri, IvyProjectExplorer.instance.getIvyProjects());
1416
} catch (error) {
1517
showError(error instanceof Error ? error.message : String(error));
1618
return;
@@ -26,5 +28,5 @@ export const registerOpenCmsEditorCmd = (context: vscode.ExtensionContext, webso
2628
};
2729

2830
const showError = (message: string) => {
29-
vscode.window.showErrorMessage(`Open CMS Editor: ${message}`);
31+
logErrorMessage(`Open CMS Editor: ${message}`);
3032
};

extension/src/editors/database-editor/open-database-editor-cmd.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
import * as vscode from 'vscode';
22
import { messenger } from '../..';
33
import { registerCommand } from '../../base/commands';
4+
import { logErrorMessage } from '../../base/logging-util';
45
import { IvyProjectExplorer } from '../../project-explorer/ivy-project-explorer';
5-
import { TreeSelection, treeSelectionToProjectPath } from '../../project-explorer/tree-selection';
6+
import { TreeSelection, treeSelectionToUri, treeUriToProjectPath } from '../../project-explorer/tree-selection';
67
import { createWebViewContent } from '../webview-helper';
78
import { setupCommunication } from './webview-communication';
89

910
export const registerOpenDatabaseEditorCmd = (context: vscode.ExtensionContext, websocketUrl: URL) => {
1011
registerCommand('ivyBrowserView.openDatabaseEditor', context, async (selection: TreeSelection) => {
1112
let projectPath: string | undefined;
1213
try {
13-
projectPath = await treeSelectionToProjectPath(selection, IvyProjectExplorer.instance.getIvyProjects());
14+
const uri = await treeSelectionToUri(selection);
15+
projectPath = await treeUriToProjectPath(uri, IvyProjectExplorer.instance.getIvyProjects());
1416
} catch (error) {
1517
showError(error instanceof Error ? error.message : String(error));
1618
return;
@@ -28,5 +30,5 @@ export const registerOpenDatabaseEditorCmd = (context: vscode.ExtensionContext,
2830
};
2931

3032
const showError = (message: string) => {
31-
vscode.window.showErrorMessage(`Open Database Editor: ${message}`);
33+
logErrorMessage(`Open Database Editor: ${message}`);
3234
};

extension/src/editors/process-editor/inscription-view/open-page.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import * as fs from 'fs';
33
import * as path from 'path';
44
import * as vscode from 'vscode';
55
import { executeCommand } from '../../../base/commands';
6+
import { logInformationMessage } from '../../../base/logging-util';
67
import { IvyBrowserViewProvider } from '../../../browser/ivy-browser-view-provider';
78
import { IvyProjectExplorer } from '../../../project-explorer/ivy-project-explorer';
89
import { InscriptionActionHandler } from './action-handlers';
@@ -42,7 +43,7 @@ function openInExplorer(absolutePath: string | null) {
4243
if (absolutePath) {
4344
executeCommand('vscode.open', vscode.Uri.file(absolutePath));
4445
} else {
45-
vscode.window.showInformationMessage('The entered url is not valid.');
46+
logInformationMessage('The entered url is not valid.');
4647
}
4748
}
4849

extension/src/editors/process-editor/process-vscode-connector.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
SetMarkersAction
1414
} from '@eclipse-glsp/vscode-integration';
1515
import * as vscode from 'vscode';
16+
import { logErrorMessage, logInformationMessage, logWarningMessage } from '../../base/logging-util';
1617
import { SelectedElement } from '../../base/process-editor-connector';
1718
import ProcessEditorProvider from './process-editor-provider';
1819

@@ -121,17 +122,17 @@ export class ProcessVscodeConnector<D extends vscode.CustomDocument = vscode.Cus
121122
switch (message.action.severity) {
122123
case 'ERROR':
123124
case 'FATAL':
124-
vscode.window.showErrorMessage(message.action.message);
125+
logErrorMessage(message.action.message);
125126
break;
126127
case 'WARNING':
127-
vscode.window.showWarningMessage(message.action.message);
128+
logWarningMessage(message.action.message);
128129
break;
129130
case 'INFO':
130131
case 'OK':
131132
if (message.action.message.includes('Model loading')) {
132133
this.modelLoading.show();
133134
} else {
134-
vscode.window.showInformationMessage(message.action.message);
135+
logInformationMessage(message.action.message);
135136
}
136137
break;
137138
case 'NONE':

extension/src/editors/variable-editor/new-variable-file-cmd.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import fs from 'fs';
22
import * as vscode from 'vscode';
33
import { registerCommand } from '../../base/commands';
4+
import { logErrorMessage } from '../../base/logging-util';
45
import { VariableEditorProvider } from './variable-editor-provider';
56

67
const fileName = 'variables.yaml';
@@ -9,17 +10,17 @@ export const registerNewVariablesFileCmd = (context: vscode.ExtensionContext) =>
910
registerCommand('yaml-variables-editor.new', context, () => {
1011
const workspaceFolders = vscode.workspace.workspaceFolders;
1112
if (!workspaceFolders || !workspaceFolders[0]) {
12-
vscode.window.showErrorMessage('No workspace found');
13+
logErrorMessage('No workspace found');
1314
return;
1415
}
1516
const configPath = vscode.Uri.joinPath(workspaceFolders[0].uri, 'config');
1617
if (!fs.existsSync(configPath.fsPath)) {
17-
vscode.window.showErrorMessage(`No config directory found in the workspace`);
18+
logErrorMessage(`No config directory found in the workspace`);
1819
return;
1920
}
2021
const variablesPath = vscode.Uri.joinPath(configPath, fileName);
2122
if (fs.existsSync(variablesPath.fsPath)) {
22-
vscode.window.showErrorMessage(`${fileName} file already exists`);
23+
logErrorMessage(`${fileName} file already exists`);
2324
return;
2425
}
2526
vscode.workspace.fs.writeFile(variablesPath, new TextEncoder().encode('Variables:'));
Lines changed: 3 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
import * as vscode from 'vscode';
22
import { Messenger } from 'vscode-messenger';
33
import { NotificationType } from 'vscode-messenger-common';
4-
import { Command } from '../../base/commands';
5-
import { getIvyProject } from '../../base/ivyProjectSelection';
6-
import { IvyProjectExplorer } from '../../project-explorer/ivy-project-explorer';
7-
import { addNewProject } from '../../project-explorer/new-project';
84
import { extensionVersion } from '../../version/extension-version';
95
import { createWebViewContent } from '../webview-helper';
106

@@ -38,7 +34,9 @@ export const showWelcomePage = async (context: vscode.ExtensionContext) => {
3834
messenger.onNotification(openUrlType, (url: string) => {
3935
vscode.env.openExternal(vscode.Uri.parse(url));
4036
});
41-
messenger.onNotification(commandType, (command: Command) => executeCommand(command));
37+
messenger.onNotification(commandType, command => {
38+
vscode.commands.executeCommand(command);
39+
});
4240

4341
panel.webview.html = createWebViewContent(context, panel.webview, 'welcome-page');
4442
currentPanel = panel;
@@ -50,43 +48,3 @@ export const showWelcomePage = async (context: vscode.ExtensionContext) => {
5048
currentPanel = undefined;
5149
});
5250
};
53-
54-
const executeCommand = async (command: Command) => {
55-
switch (command) {
56-
case 'ivyProjects.addNewProject':
57-
executeAddProject();
58-
break;
59-
case 'ivyProjects.addBusinessProcess':
60-
case 'ivyProjects.addNewFormDialog':
61-
case 'ivyProjects.importBpmnProcess':
62-
addProjectEntity(command);
63-
break;
64-
default:
65-
vscode.commands.executeCommand(command);
66-
}
67-
};
68-
69-
const executeAddProject = async () => {
70-
const folder = await vscode.window.showWorkspaceFolderPick();
71-
if (!folder) {
72-
return;
73-
}
74-
addNewProject(folder.uri);
75-
};
76-
77-
const addProjectEntity = async (command: Command) => {
78-
const projectExplorer = IvyProjectExplorer.instance;
79-
const project = await getIvyProject(projectExplorer);
80-
81-
switch (command) {
82-
case 'ivyProjects.addBusinessProcess':
83-
projectExplorer.addProcess(project, 'Business Process');
84-
break;
85-
case 'ivyProjects.addNewFormDialog':
86-
projectExplorer.addUserDialog(project, 'Form');
87-
break;
88-
case 'ivyProjects.importBpmnProcess':
89-
projectExplorer.importBpmnProcess(project);
90-
break;
91-
}
92-
};

extension/src/engine/api/axios-error-handler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { AxiosError } from 'axios';
2-
import * as vscode from 'vscode';
2+
import { logErrorMessage } from '../../base/logging-util';
33

44
export const handleAxiosError = (error: unknown) => {
55
if (error instanceof AxiosError) {
66
const message = error.response?.data.errorMessage ?? error;
7-
vscode.window.showErrorMessage(message);
7+
logErrorMessage(message);
88
throw message;
99
}
1010
throw error;

0 commit comments

Comments
 (0)