Skip to content

Commit cb029aa

Browse files
committed
fix(dev-ui): use OS-dependent file path separator
1 parent b831589 commit cb029aa

File tree

4 files changed

+38
-14
lines changed

4 files changed

+38
-14
lines changed

bom/dev-ui/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
<codeblock.version>1.1.1</codeblock.version>
3838
<qomponent.version>1.0.4</qomponent.version>
3939
<ldrs.version>1.1.7</ldrs.version>
40-
<directory-tree.version>1.0.3</directory-tree.version>
40+
<directory-tree.version>1.0.4</directory-tree.version>
4141
<hpcc-js-wasm.version>2.15.3</hpcc-js-wasm.version>
4242
<yargs.version>17.7.2</yargs.version>
4343
<cliui.version>8.0.1</cliui.version>
Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.quarkus.devui.spi.workspace;
22

3+
import java.io.File;
34
import java.nio.file.Path;
45
import java.util.List;
56
import java.util.stream.Collectors;
@@ -10,20 +11,20 @@
1011
* This hold all files in the user's project root
1112
*/
1213
public final class WorkspaceBuildItem extends SimpleBuildItem {
13-
private final List<WorkspaceItem> workspaceItems;
14+
private final WorkspaceItems workspaceItems;
1415
private final Path rootPath;
1516

1617
public WorkspaceBuildItem(Path rootPath, List<WorkspaceItem> workspaceItems) {
1718
this.rootPath = rootPath;
18-
this.workspaceItems = workspaceItems;
19+
this.workspaceItems = new WorkspaceItems(workspaceItems, File.separator);
1920
}
2021

21-
public List<WorkspaceItem> getWorkspaceItems() {
22+
public WorkspaceItems getWorkspaceItems() {
2223
return workspaceItems;
2324
}
2425

2526
public List<Path> getPaths() {
26-
return workspaceItems.stream()
27+
return workspaceItems.items.stream()
2728
.map(WorkspaceBuildItem.WorkspaceItem::path)
2829
.collect(Collectors.toList());
2930
}
@@ -32,7 +33,10 @@ public Path getRootPath() {
3233
return this.rootPath;
3334
}
3435

35-
public static record WorkspaceItem(String name, Path path) {
36+
public record WorkspaceItems(List<WorkspaceItem> items, String fileSeparator) {
37+
}
38+
39+
public record WorkspaceItem(String name, Path path) {
3640

3741
}
3842
}

extensions/devui/resources/src/main/resources/dev-ui/qui/qui-ide-link.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,12 @@ export class QuiIdeLink extends observeState(LitElement) {
6767
}
6868

6969
_checkIfStringStartsWith(str, substrs) {
70-
return substrs.some(substr => {
70+
return substrs?.some(substr => {
7171
if(substr && substr.trim !== ""){
7272
return str.startsWith(substr);
7373
}
7474
return false;
75-
});
75+
}) ?? false;
7676
}
7777

7878
render() {

extensions/devui/resources/src/main/resources/dev-ui/qwc/qwc-workspace.js

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ export class QwcWorkspace extends observeState(QwcHotReloadElement) {
119119

120120
static properties = {
121121
_workspaceItems: {state: true},
122+
_fileSeparator: {state: false},
122123
_workspaceTreeNames: {state: true},
123124
_workspaceActions: {state: true},
124125
_filteredActions: {state: true},
@@ -134,6 +135,7 @@ export class QwcWorkspace extends observeState(QwcHotReloadElement) {
134135
super();
135136
this.md = new MarkdownIt();
136137
this._workspaceItems = null;
138+
this._fileSeparator = '/';
137139
this._workspaceTreeNames = null;
138140
this._workspaceActions = [];
139141
this._filteredActions = this._workspaceActions;
@@ -192,8 +194,9 @@ export class QwcWorkspace extends observeState(QwcHotReloadElement) {
192194
directoryTree.selectFile(this._selectedWorkspaceItem.name);
193195
this._selectWorkspaceItem(this._selectedWorkspaceItem);
194196
} else {
195-
directoryTree.selectFile([...this._workspaceItems.values()][0].name);
196-
this._selectWorkspaceItem([...this._workspaceItems.values()][0]);
197+
const selectedItem = QwcWorkspace.getFirstJavaFile([...this._workspaceItems.values()]);
198+
directoryTree.selectFile(selectedItem.name);
199+
this._selectWorkspaceItem(selectedItem);
197200
}
198201
}
199202
}
@@ -217,6 +220,7 @@ export class QwcWorkspace extends observeState(QwcHotReloadElement) {
217220
_renderWorkspaceTree(){
218221
return html`<qui-directory-tree id="directoryTree" class="files"
219222
.directory="${this._workspaceTreeNames}"
223+
.fileSeparator="${this._fileSeparator}"
220224
header="Source Code"
221225
@file-select="${this._onFileSelect}"
222226
></qui-directory-tree>`;
@@ -252,7 +256,7 @@ export class QwcWorkspace extends observeState(QwcHotReloadElement) {
252256
</div>
253257
254258
<div class="mainMenuBarTitle" @dblclick="${this._toggleSplit}">
255-
${this._selectedWorkspaceItem?.name?.split('/').pop()}
259+
${this._selectedWorkspaceItem?.name?.split(this._fileSeparator).pop()}
256260
</div>
257261
258262
<div class="mainMenuBarActions">
@@ -688,8 +692,10 @@ export class QwcWorkspace extends observeState(QwcHotReloadElement) {
688692

689693
_loadWorkspaceItems(){
690694
this.jsonRpc.getWorkspaceItems().then(jsonRpcResponse => {
691-
if (Array.isArray(jsonRpcResponse.result)) {
692-
this._workspaceItems = new Map(jsonRpcResponse.result.map(obj => [obj.name, obj]));
695+
const items = jsonRpcResponse.result?.items;
696+
if (Array.isArray(items)) {
697+
this._fileSeparator = jsonRpcResponse.result.fileSeparator;
698+
this._workspaceItems = new Map(items.map(obj => [obj.name, obj]));
693699
} else {
694700
console.error("Expected an array but got:", jsonRpcResponse.result);
695701
}
@@ -747,7 +753,7 @@ export class QwcWorkspace extends observeState(QwcHotReloadElement) {
747753
_convertDirectoryStructureToTree() {
748754
const root = [];
749755
this._workspaceItems.forEach((value, key) => {
750-
const parts = value.name.split('/');
756+
const parts = value.name.split(this._fileSeparator);
751757
let currentLevel = root;
752758

753759
parts.forEach((part, index) => {
@@ -770,7 +776,21 @@ export class QwcWorkspace extends observeState(QwcHotReloadElement) {
770776
});
771777
});
772778

779+
// folder goes first so that we have same deterministic behavior on Windows and Linux
780+
root.sort((a, b) => {
781+
const aIsFolder = a.type === 'folder' ? 0 : 1;
782+
const bIsFolder = b.type === 'folder' ? 0 : 1;
783+
return aIsFolder - bIsFolder;
784+
});
785+
773786
return root;
774787
}
788+
789+
static getFirstJavaFile(workspaceItems) {
790+
const javaFileNode = workspaceItems.find(node => {
791+
return node.name && node.name.endsWith('.java');
792+
});
793+
return javaFileNode || workspaceItems[0];
794+
}
775795
}
776796
customElements.define('qwc-workspace', QwcWorkspace);

0 commit comments

Comments
 (0)