Skip to content

Commit 1caa4a2

Browse files
authored
fix: improve style and fix breakpoints view init (#2583)
* fix: improve style and fix breakpoints view init * chore: fix build * chore: fix test * fix: init storage correctly * chore: fix build
1 parent db74351 commit 1caa4a2

10 files changed

Lines changed: 157 additions & 135 deletions

File tree

packages/components/src/recycle-tree/basic/tree-node.tsx

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import cls from 'classnames';
22
import React, { useCallback } from 'react';
33

4+
import { isDefined } from '@opensumi/ide-utils';
5+
46
import { Button } from '../../button';
57
import { Icon } from '../../icon';
68
import { Loading } from '../../loading';
79

810
import { BasicCompositeTreeNode, BasicTreeNode } from './tree-node.define';
911
import { IBasicInlineMenuPosition, IBasicNodeRendererProps, DECORATIONS } from './types';
12+
1013
import './styles.less';
1114

1215
export const BasicTreeNodeRenderer: React.FC<
@@ -67,19 +70,23 @@ export const BasicTreeNodeRenderer: React.FC<
6770
},
6871
[onClick, onTwistierClick],
6972
);
70-
const paddingLeft = `${(item.depth || 0) * (indent || 0)}px`;
73+
// 14 * 2 = Toggle Icon Size + Icon Size
74+
const paddingLeft = BasicCompositeTreeNode.is(item)
75+
? `${(item.depth || 0) * (indent || 0)}px`
76+
: `${(item.depth || 0) * (indent || 0) + 14 * 2}px`;
7177

72-
const editorNodeStyle = {
78+
const treeNodeStyle = {
7379
height: itemHeight,
7480
lineHeight: `${itemHeight}px`,
7581
paddingLeft,
7682
} as React.CSSProperties;
7783

7884
const renderIcon = useCallback(
79-
(node: BasicCompositeTreeNode | BasicTreeNode) => (
80-
// 图标的最大高度设置为 `itemHeight - 8`, 这样在视觉上看起来有一种 padding 的效果
81-
<Icon icon={node.icon} className={cls('icon', node.iconClassName)} style={{ maxHeight: itemHeight - 8 }} />
82-
),
85+
(node: BasicCompositeTreeNode | BasicTreeNode) =>
86+
node.iconClassName ? (
87+
// 图标的最大高度设置为 `itemHeight - 8`, 这样在视觉上看起来有一种 padding 的效果
88+
<Icon icon={node.icon} className={cls('icon', node.iconClassName)} style={{ maxHeight: itemHeight - 8 }} />
89+
) : null,
8390
[],
8491
);
8592

@@ -163,7 +170,11 @@ export const BasicTreeNodeRenderer: React.FC<
163170
};
164171

165172
const renderTwice = (item: BasicCompositeTreeNode | BasicTreeNode) => {
166-
if (!(item as BasicCompositeTreeNode).expandable) {
173+
if (isDefined((item as BasicCompositeTreeNode).expandable)) {
174+
if (!(item as BasicCompositeTreeNode).expandable) {
175+
return <div className={cls('segment', 'expansion_toggle')}></div>;
176+
}
177+
} else {
167178
return null;
168179
}
169180

@@ -179,7 +190,7 @@ export const BasicTreeNodeRenderer: React.FC<
179190
onDoubleClick={handleDbClick}
180191
onContextMenu={handleContextMenu}
181192
className={cls('tree_node', className, decorations ? decorations.classlist : null)}
182-
style={editorNodeStyle}
193+
style={treeNodeStyle}
183194
data-id={item.id}
184195
>
185196
<div className='content'>

packages/core-browser/src/services/storage-service.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ abstract class BaseBrowserStorageService implements StorageService {
9999
} catch (e) {
100100
this.logger.error(`storage getDate error: ${e}, use defaultValue as result.`);
101101
}
102+
if (defaultValue && isObject(defaultValue)) {
103+
delete defaultValue['expires'];
104+
}
102105
return defaultValue;
103106
}
104107

packages/debug/__tests__/browser/view/breakpoint/debug-breakpoints.service.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ describe('Debug Breakpoints Service', () => {
4444
updateBreakpoint: jest.fn(),
4545
updateExceptionBreakpoints: jest.fn(),
4646
cleanAllMarkers: jest.fn(),
47+
whenReady: Promise.resolve(),
4748
};
4849

4950
const mockContextKeyService = {
@@ -111,7 +112,7 @@ describe('Debug Breakpoints Service', () => {
111112
expect(typeof debugBreakpointsService.toggleBreakpoints).toBe('function');
112113
});
113114

114-
it('should init success', () => {
115+
it('should init success', async () => {
115116
expect(mockBreakpointManager.onDidChangeBreakpoints).toBeCalledTimes(1);
116117
expect(mockBreakpointManager.onDidChangeExceptionsBreakpoints).toBeCalledTimes(1);
117118
expect(mockContextKeyService.onDidChangeContext).toBeCalledTimes(1);

packages/debug/src/browser/view/breakpoints/debug-breakpoints.module.less

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
width: 19px;
4141
height: 19px;
4242
min-width: 19px;
43+
margin-right: 3px;
4344
}
4445

4546
.debug_breakpoints_badge {
@@ -67,5 +68,5 @@
6768
}
6869

6970
.debug_breakpoints_item_tree_node {
70-
padding-left: 22px !important;
71+
padding-left: 27px !important;
7172
}

packages/debug/src/browser/view/breakpoints/debug-breakpoints.service.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ export class DebugBreakpointsService extends WithEventBus {
8989

9090
async init() {
9191
await this.updateRoots();
92-
await this.updateBreakpoints();
9392
this.workspaceService.onWorkspaceChanged(async () => {
9493
this.updateRoots();
9594
this.updateBreakpoints();
@@ -100,6 +99,9 @@ export class DebugBreakpointsService extends WithEventBus {
10099
this.breakpoints.onDidChangeExceptionsBreakpoints(() => {
101100
this.updateBreakpoints();
102101
});
102+
this.breakpoints.whenReady.then(() => {
103+
this.updateBreakpoints();
104+
});
103105
this.contextKeyService.onDidChangeContext((e) => {
104106
if (e.payload.affectsSome(new Set([CONTEXT_IN_DEBUG_MODE_KEY]))) {
105107
runInAction(() => {
@@ -190,7 +192,6 @@ export class DebugBreakpointsService extends WithEventBus {
190192
this.treeNodeMap.set(uri.toString(), getTreeNodes);
191193
}
192194
});
193-
194195
this._onDidChangeBreakpointsTreeNode.fire(this.treeNodeMap);
195196
}
196197

packages/debug/src/browser/view/breakpoints/debug-breakpoints.view.tsx

Lines changed: 63 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
import cls from 'classnames';
22
import { observer } from 'mobx-react-lite';
3-
import React, { useCallback, useEffect, useMemo, useState } from 'react';
3+
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
44

5-
import {
6-
BasicRecycleTree,
7-
CheckBox,
8-
IBasicTreeData,
9-
ICompositeTreeNode,
10-
ITreeNodeOrCompositeTreeNode,
11-
} from '@opensumi/ide-components';
5+
import { BasicRecycleTree, CheckBox, IBasicTreeData, ICompositeTreeNode } from '@opensumi/ide-components';
126
import { Badge } from '@opensumi/ide-components';
137
import {
148
useInjectable,
@@ -19,6 +13,7 @@ import {
1913
Disposable,
2014
ViewState,
2115
Event,
16+
isUndefined,
2217
} from '@opensumi/ide-core-browser';
2318
import { DebugProtocol } from '@opensumi/vscode-debugprotocol/lib/debugProtocol';
2419

@@ -33,6 +28,7 @@ import {
3328
} from '../../breakpoint';
3429
import { DebugSessionManager } from '../../debug-session-manager';
3530

31+
import { BreakpointsTreeNode } from './debug-breakpoints-tree.model';
3632
import styles from './debug-breakpoints.module.less';
3733
import { DebugBreakpointsService } from './debug-breakpoints.service';
3834

@@ -47,66 +43,74 @@ export interface BreakpointItem {
4743
export const DebugBreakpointView = observer(({ viewState }: React.PropsWithChildren<{ viewState: ViewState }>) => {
4844
const debugBreakpointsService: DebugBreakpointsService = useInjectable(DebugBreakpointsService);
4945
const { enable, toggleBreakpointEnable } = debugBreakpointsService;
46+
const isDisposed = useRef<boolean>(false);
5047
const [treeData, setTreeData] = useState<IBasicTreeData[]>([]);
5148

52-
useEffect(() => {
53-
const dispose = new Disposable();
54-
55-
dispose.addDispose(
56-
debugBreakpointsService.onDidChangeBreakpointsTreeNode((nodes) => {
57-
const { roots } = debugBreakpointsService;
58-
const breakpointTreeData: IBasicTreeData[] = [];
59-
60-
Array.from(nodes.entries()).forEach(([uri, items]) => {
61-
const isException = EXCEPTION_BREAKPOINT_URI.toString() === uri;
62-
63-
if (isException) {
64-
items.forEach((item) => {
65-
breakpointTreeData.push({
66-
label: '',
67-
expandable: false,
68-
children: [],
69-
description: (
70-
<BreakpointItem
71-
toggle={() => toggleBreakpointEnable(item.breakpoint)}
72-
breakpointEnabled={enable}
73-
data={item.rawData}
74-
isDebugMode={debugBreakpointsService.inDebugMode}
75-
></BreakpointItem>
76-
),
77-
});
78-
});
79-
} else {
80-
const toURI = URI.parse(uri);
81-
const parent = roots.filter((root) => root.isEqualOrParent(toURI))[0];
82-
49+
const updateTreeData = useCallback(
50+
(nodes: [string, BreakpointsTreeNode[]][]) => {
51+
const { roots } = debugBreakpointsService;
52+
const breakpointTreeData: IBasicTreeData[] = [];
53+
nodes.forEach(([uri, items]) => {
54+
const isException = EXCEPTION_BREAKPOINT_URI.toString() === uri;
55+
if (isException) {
56+
items.forEach((item) => {
8357
breakpointTreeData.push({
84-
label: parent ? parent.relative(toURI)!.toString() : URI.parse(uri).displayName,
85-
expandable: true,
86-
iconClassName: getIcon('file-text'),
87-
expanded: true,
88-
children: items.map((item) => ({
89-
...item,
90-
label: '',
91-
expandable: false,
92-
description: (
93-
<BreakpointItem
94-
toggle={() => toggleBreakpointEnable(item.breakpoint)}
95-
breakpointEnabled={enable}
96-
data={item.rawData}
97-
isDebugMode={debugBreakpointsService.inDebugMode}
98-
></BreakpointItem>
99-
),
100-
})),
58+
label: '',
59+
expandable: false,
60+
children: [],
61+
description: (
62+
<BreakpointItem
63+
toggle={() => toggleBreakpointEnable(item.breakpoint)}
64+
breakpointEnabled={enable}
65+
data={item.rawData}
66+
isDebugMode={debugBreakpointsService.inDebugMode}
67+
></BreakpointItem>
68+
),
10169
});
102-
}
103-
});
70+
});
71+
} else {
72+
const toURI = URI.parse(uri);
73+
const parent = roots.filter((root) => root.isEqualOrParent(toURI))[0];
10474

75+
breakpointTreeData.push({
76+
label: parent ? parent.relative(toURI)?.toString() || '' : URI.parse(uri).displayName,
77+
expandable: true,
78+
iconClassName: getIcon('file-text'),
79+
expanded: true,
80+
children: items.map((item) => ({
81+
...item,
82+
label: '',
83+
expandable: false,
84+
description: (
85+
<BreakpointItem
86+
toggle={() => toggleBreakpointEnable(item.breakpoint)}
87+
breakpointEnabled={enable}
88+
data={item.rawData}
89+
isDebugMode={debugBreakpointsService.inDebugMode}
90+
></BreakpointItem>
91+
),
92+
})),
93+
});
94+
}
95+
});
96+
if (!isDisposed.current) {
10597
setTreeData(breakpointTreeData);
98+
}
99+
},
100+
[treeData],
101+
);
102+
103+
useEffect(() => {
104+
const dispose = new Disposable();
105+
updateTreeData(Array.from(debugBreakpointsService.treeNodeMap.entries()));
106+
dispose.addDispose(
107+
debugBreakpointsService.onDidChangeBreakpointsTreeNode((nodes: Map<string, BreakpointsTreeNode[]>) => {
108+
updateTreeData(Array.from(nodes.entries()));
106109
}),
107110
);
108111

109112
return () => {
113+
isDisposed.current = true;
110114
dispose.dispose();
111115
};
112116
}, []);
@@ -120,11 +124,10 @@ export const DebugBreakpointView = observer(({ viewState }: React.PropsWithChild
120124
}, [treeData]);
121125

122126
const getItemClassName = useCallback((item: ICompositeTreeNode) => {
123-
if (!item.children) {
127+
if (!item.children && isUndefined((item as any).expandable)) {
124128
return styles.debug_breakpoints_item_tree_node;
125129
}
126130
}, []);
127-
128131
return (
129132
<div className={cls(styles.debug_breakpoints, !enable && styles.debug_breakpoints_disabled)}>
130133
<BasicRecycleTree treeData={treeData} height={viewState.height} getItemClassName={getItemClassName} />

packages/preferences/src/browser/preference-settings.service.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,11 @@ export const defaultSettingGroup: ISettingGroup[] = [
513513
title: '%settings.group.general%',
514514
iconClass: getIcon('setting'),
515515
},
516+
{
517+
id: PreferenceSettingId.Terminal,
518+
title: '%settings.group.terminal%',
519+
iconClass: getIcon('terminal'),
520+
},
516521
{
517522
id: PreferenceSettingId.Editor,
518523
title: '%settings.group.editor%',
@@ -523,11 +528,6 @@ export const defaultSettingGroup: ISettingGroup[] = [
523528
title: '%settings.group.view%',
524529
iconClass: getIcon('detail'),
525530
},
526-
{
527-
id: PreferenceSettingId.Terminal,
528-
title: '%settings.group.terminal%',
529-
iconClass: getIcon('terminal'),
530-
},
531531
{
532532
id: PreferenceSettingId.Feature,
533533
title: '%settings.group.feature%',

packages/preferences/src/browser/preferences.view.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ const PreferenceIndexes = observer(() => {
233233
data.children = children;
234234
if (children.length > 0) {
235235
data.expandable = true;
236+
} else {
237+
data.expandable = false;
236238
}
237239
basicTreeData.push(data);
238240
}

0 commit comments

Comments
 (0)