Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support VSCode API TreeItem.checkboxState #4197

Closed

Conversation

zhiyudangchu
Copy link
Contributor

@zhiyudangchu zhiyudangchu commented Dec 6, 2024

Types

  • 🎉 New Features

Background or solution

Support VSCode API TreeItem.checkboxState

Changelog

Summary by CodeRabbit

发布说明

  • 新功能

    • 引入了 checkboxInfo 属性,提供树节点的复选框相关信息。
    • 增加了 ViewBadge 类型,允许在树视图和 Webview 视图中显示徽章。
    • 新增 $setBadge 方法,支持为树视图和 Webview 视图设置徽章。
    • 增加了复选框状态管理的功能,允许手动控制复选框状态。
  • 文档

    • 更新了接口文档,增加了对新功能的说明和示例。

@opensumi opensumi bot added the 🎨 feature feature required label Dec 6, 2024
Copy link
Contributor

coderabbitai bot commented Dec 6, 2024

Warning

There were issues while running some tools. Please review the errors and either fix the tool’s configuration or disable the tool if it’s a critical failure.

🔧 eslint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

warning eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.
warning eslint > @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
warning eslint > @humanwhocodes/config-array > @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
warning eslint > file-entry-cache > flat-cache > rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported
warning eslint > file-entry-cache > flat-cache > rimraf > glob@7.2.3: Glob versions prior to v9 are no longer supported
warning eslint > file-entry-cache > flat-cache > rimraf > glob > inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
warning eslint-import-resolver-typescript > glob@7.2.3: Glob versions prior to v9 are no longer supported
error Couldn't find any versions for "@opensumi/ide-dev-tool" that matches "workspace:*"

Walkthrough

该拉取请求引入了一系列更改,主要集中在树视图相关的功能增强上。新增的 checkboxInfo 属性和 TreeViewItemCheckboxInfo 接口为树节点提供了复选框相关的信息。同时,多个接口和类(如 ViewExtViewContainerOptionsMainThreadLayout)的 badge 属性的类型被更新为支持 ViewBadge 类型,从而增强了视觉指示的灵活性。此外,多个组件和服务(如 AccordionServiceTabbarService)也进行了相应的修改,以支持新的徽章和复选框状态管理功能。

Changes

文件路径 更改摘要
packages/components/src/recycle-tree/tree/TreeNode.ts 添加 checkboxInfo 属性,返回复选框相关的默认值;引入 TreeViewItemCheckboxInfo 类型。
packages/components/src/recycle-tree/types/tree-node.ts 新增 TreeViewItemCheckboxInfo 接口,修改 ITreeNode 接口以包含 checkboxInfo 属性。
packages/core-browser/src/layout/layout.interface.ts 更新 ViewExtViewContainerOptions 接口中的 badge 属性类型为 `string
packages/extension/src/browser/components/extension-tree-view-node.tsx 添加 onCheck 属性到 ITreeViewNodeProps 接口,并在 TreeViewNode 组件中实现复选框渲染。
packages/extension/src/browser/components/extension-tree-view.tsx 新增 handleItemChecked 方法,更新 TreeViewProps 接口以包含该方法。
packages/extension/src/browser/sumi/main.thread.layout.ts 更新 $setBadge 方法以接受 `string
packages/extension/src/browser/vscode/api/main.thread.api.webview.ts 新增 ViewBadge 类型,更新 WebviewView 类以包含 badge 属性;新增 $setBadge 方法。
packages/extension/src/browser/vscode/api/main.thread.treeview.ts 新增 $setBadge 方法,修改 createFoldNodecreateNormalNode 方法以包含 checkboxInfo 参数。
packages/extension/src/browser/vscode/api/tree-view/tree-view.model.service.ts 添加 handleItemCheck 方法和 onDidUpdate 事件发射器以管理复选框状态变化。
packages/extension/src/browser/vscode/api/tree-view/tree-view.node.defined.ts 修改 ExtensionCompositeTreeNodeExtensionTreeNode 构造函数以接受 _checkboxInfo 参数。
packages/extension/src/common/sumi/layout.ts 更新 ITabbarHandlerIMainThreadLayout 接口中的 setBadge 方法以接受 `string
packages/extension/src/common/vscode/treeview.ts 新增 $setBadge$checkStateChanged 方法,更新 TreeViewItem 类以包含 checkboxInfo 属性。
packages/extension/src/common/vscode/webview.ts 更新 IMainThreadWebviewView 接口以包含 setBadge 方法和 badge 属性。
packages/extension/src/hosted/api/sumi/ext.host.layout.ts 更新 TabbarHandler 类中的 setBadge 方法以接受 `string
packages/extension/src/hosted/api/vscode/ext.host.api.webview.ts 添加 #badge 属性到 ExtHostWebviewView 类,并实现其 getter 和 setter 方法。
packages/extension/src/hosted/api/vscode/ext.host.treeview.ts 新增 $checkStateChanged 方法,更新 ExtHostTreeView 类以支持复选框状态变化的事件发射器。
packages/main-layout/__tests__/browser/layout.service.test.tsx 更新测试以适应新的徽章结构,确保在测试中正确使用和验证新的徽章数据。
packages/main-layout/src/browser/accordion/accordion.service.ts 更新 AccordionViewChangeEvent 接口中的 badge 属性类型为 `string
packages/main-layout/src/browser/accordion/section.view.tsx 更新 CollapsePanelProps 接口中的 badge 属性类型为 `string
packages/main-layout/src/browser/tabbar-handler.ts 更新 setBadge 方法以接受 `ViewBadge
packages/main-layout/src/browser/tabbar/bar.view.tsx 添加 getBadgeValue 函数以标准化徽章值的处理,更新 IconTabViewTextTabView 组件以使用该函数。
packages/main-layout/src/browser/tabbar/tabbar.service.ts 更新 updateBadge 方法以接受 `ViewBadge
packages/markers/src/browser/markers-service.ts 更新 getBadge 方法的返回类型为 `string
packages/markers/src/common/types.ts 更新 IMarkerService 接口中的 getBadge 方法的返回类型为 `string
packages/types/sumi.d.ts 标记 kaitian 模块为已弃用,更新 ITabbarHandle 接口中的 setBadge 方法以接受 `string
packages/types/vscode/typings/vscode.d.ts 更新 TreeViewOptionsTreeView 接口,新增 ViewBadge 接口及相关属性。
packages/types/vscode/typings/vscode.window.d.ts 更新 WebviewView 接口以包含可选的 badge 属性。

Possibly related PRs

  • feat: support VSCode API TreeView.badge #4185: 该 PR 引入了对 VSCode API 的 TreeView.badge 功能的支持,与主 PR 中增强 TreeNode 类以包含复选框相关信息的更改直接相关,因为两者都涉及树视图中视觉指示(徽章)的管理。

Suggested labels

🎨 feature

Suggested reviewers

  • erha19
  • Ricbet

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Outside diff range and nitpick comments (14)
packages/extension/src/common/vscode/treeview.ts (2)

81-85: 建议将 'checked' 属性声明为必需

TreeViewItemCheckboxInfo 接口中,checked 属性目前的类型为 boolean | undefined。考虑到复选框状态需要明确的布尔值,建议将其类型改为 boolean,并将其设为必需属性。

建议应用以下修改:

 export interface TreeViewItemCheckboxInfo {
-  checked: boolean | undefined;
+  checked: boolean;
   tooltip?: string;
   accessibilityInformation?: IAccessibilityInformation;
 }

197-201: 建议改进属性名称以提高可读性

属性 manageCheckboxStateManually 的命名较为冗长,建议更改为 manualCheckboxStatecheckboxStateManual,以简化名称并保持与其他属性的一致性。

packages/types/vscode/typings/vscode.d.ts (1)

1624-1661: 简化 manageCheckboxStateManually 属性的注释

TreeViewOptions 接口中添加的 manageCheckboxStateManually?: boolean 属性,其注释过于详细,可能影响可读性。建议简化注释,使其更加简洁明了。

建议修改为:

/**
 * 当设置为 `true` 时,扩展将手动管理复选框的选中状态,包括子项和父项的同步。
 * 默认为 `false`,使用默认的自动管理逻辑。
 */
manageCheckboxStateManually?: boolean;
packages/extension/src/browser/sumi/main.thread.layout.ts (1)

11-12: 更新 $setBadge 方法以支持 ViewBadge

方法签名的更新符合接口变更,现在支持可选的 badge 参数,类型为 string | ViewBadge。建议添加相关的单元测试以验证新增的 ViewBadge 支持。

是否需要我帮助生成相关的单元测试代码?

Also applies to: 57-59

packages/extension/src/hosted/api/sumi/ext.host.layout.ts (1)

6-6: TabbarHandler 中的 setBadge 实现符合接口规范

更新了 setBadge 方法以支持 ViewBadge 类型,实现与接口定义保持一致。建议考虑添加以下改进:

  1. 为新的 ViewBadge 类型添加类型守卫
  2. 添加参数验证逻辑

建议添加类型守卫和参数验证:

  setBadge(badge?: string | ViewBadge) {
+   if (badge && typeof badge === 'object') {
+     // 验证 ViewBadge 对象的必要属性
+     if (!('value' in badge)) {
+       console.warn('Invalid ViewBadge object');
+       return;
+     }
+   }
    this.proxy.$setBadge(this.id, badge);
  }

Also applies to: 41-43

packages/markers/src/browser/markers-service.ts (1)

Line range hint 112-124: 建议利用 ViewBadge 类型的特性

当前实现仍然只返回字符串类型的徽章。建议利用 ViewBadge 类型来提供更丰富的徽章展示,比如可以为错误使用不同的样式。

 public getBadge(): string | ViewBadge | undefined {
   const stats = this.markerManager.getStats();
   if (stats) {
     const total = stats.errors + stats.infos + stats.warnings;
     if (total > MAX_DIAGNOSTICS_BADGE) {
-      return '1K+';
+      return { value: '1K+', tooltip: `${total} 个诊断项` };
     } else if (total === MAX_DIAGNOSTICS_BADGE) {
-      return '1K';
+      return { value: '1K', tooltip: '1000 个诊断项' };
     } else if (total > 0) {
-      return String(total);
+      return { value: String(total), tooltip: `${total} 个诊断项` };
     }
   }
   return undefined;
 }
packages/extension/src/browser/vscode/api/tree-view/tree-view.node.defined.ts (2)

96-102: 建议重构重复的 checkboxInfo getter 实现

ExtensionCompositeTreeNodeExtensionTreeNode 类中的 checkboxInfo getter 实现完全相同。建议提取到基类或共享的工具函数中。

+ // 在共享的工具函数文件中
+ export function createCheckboxInfo(info?: TreeViewItemCheckboxInfo) {
+   return {
+     checked: info?.checked,
+     tooltip: info?.tooltip,
+     accessibilityInformation: info?.accessibilityInformation,
+   };
+ }

  // 在两个类中
  get checkboxInfo() {
-   return {
-     checked: this._checkboxInfo?.checked,
-     tooltip: this._checkboxInfo?.tooltip,
-     accessibilityInformation: this._checkboxInfo?.accessibilityInformation,
-   };
+   return createCheckboxInfo(this._checkboxInfo);
  }

Also applies to: 193-199


61-62: 建议增强类型安全性

建议为 _checkboxInfo_accessibilityInformation 参数添加默认值,以确保 getter 始终返回一致的类型。

- private _checkboxInfo?: TreeViewItemCheckboxInfo,
- private _accessibilityInformation?: IAccessibilityInformation,
+ private _checkboxInfo: TreeViewItemCheckboxInfo = { checked: false },
+ private _accessibilityInformation: IAccessibilityInformation = { 
+   role: 'treeitem',
+   label: '' 
+ },
packages/main-layout/__tests__/browser/layout.service.test.tsx (1)

252-252: 建议增加更多的徽章测试用例!

当前测试用例仅覆盖了基本的徽章显示场景。建议添加以下测试场景:

  • 不同格式的徽章值(数字、字符串)
  • 徽章值超过 99 的情况
  • 设置和清除徽章的场景
packages/extension/src/browser/vscode/api/main.thread.treeview.ts (1)

271-277: $setBadge 方法实现完整且健壮

方法实现:

  1. 正确处理了 badge 为空的情况
  2. 同时更新了 handler 和 accordionService 的状态
  3. 包含了必要的空值检查

建议添加对 badge 类型的验证。

 async $setBadge(treeViewId: string, badge?: ViewBadge) {
   const handler = this.mainLayoutService.getTabbarHandler(treeViewId);
   if (handler) {
+    if (badge && typeof badge !== 'string' && !('value' in badge)) {
+      return;
+    }
     handler.setBadge(badge ? badge : '');
     handler.accordionService.updateViewBadge(treeViewId, badge ? badge : '');
   }
 }
packages/extension/src/browser/vscode/api/tree-view/tree-view.model.service.ts (1)

950-954: 建议优化复选框状态切换的实现

当前实现直接修改了 checkboxInfo 的状态。建议添加以下改进:

  1. 在切换状态前进行空值检查
  2. 考虑添加状态切换的防抖处理
  3. 添加状态切换失败的错误处理

建议按如下方式重构:

handleItemCheck = async (item: ExtensionCompositeTreeNode | ExtensionTreeNode, type: TreeNodeType) => {
+ if (!item.checkboxInfo) {
+   return;
+ }
+
+ try {
    item.checkboxInfo.checked = !item.checkboxInfo.checked;
    this.onDidUpdateEmitter.fire([item]);
+ } catch (error) {
+   console.error('Failed to update checkbox state:', error);
+ }
};
packages/components/src/recycle-tree/tree/TreeNode.ts (1)

247-254: 建议增强复选框信息的实现

当前实现提供了基础的复选框状态。建议添加以下增强:

  1. 添加复选框状态的缓存机制
  2. 支持三态复选框(checked、unchecked、indeterminate)
  3. 提供复选框状态变更的验证逻辑

建议按如下方式重构:

+ private _checkboxState: TreeViewItemCheckboxInfo | undefined;

get checkboxInfo(): TreeViewItemCheckboxInfo {
+ if (this._checkboxState) {
+   return this._checkboxState;
+ }
+
+ this._checkboxState = {
    checked: false,
+   indeterminate: false,
    tooltip: '',
    accessibilityInformation: this.accessibilityInformation,
  };
+
+ return this._checkboxState;
}

+ set checkboxInfo(value: TreeViewItemCheckboxInfo) {
+   if (!this.validateCheckboxState(value)) {
+     throw new Error('Invalid checkbox state');
+   }
+   this._checkboxState = value;
+ }
+
+ private validateCheckboxState(state: TreeViewItemCheckboxInfo): boolean {
+   return typeof state.checked === 'boolean';
+ }
packages/extension/src/browser/vscode/api/main.thread.api.webview.ts (1)

783-793: 实现 $setBadge 方法以更新徽章状态

实现逻辑完整,包括:

  1. 正确的空值检查
  2. 适当的状态更新
  3. UI 同步更新

建议添加错误处理以提高健壮性。

 $setBadge(handle: string, badge?: ViewBadge): void {
   const webviewView = this._webviewViews.get(handle);
   if (webviewView) {
     webviewView.badge = badge;
     const handler = this.mainLayout.getTabbarHandler(webviewView.viewType);
     if (handler) {
+      try {
         handler.setBadge(badge ? badge : '');
         handler.accordionService.updateViewBadge(webviewView.viewType, badge ? badge : '');
+      } catch (error) {
+        console.error('Failed to update badge:', error);
+      }
     }
   }
 }
packages/main-layout/src/browser/tabbar/tabbar.service.ts (1)

198-198: 更新 updateBadge 方法以支持 ViewBadge

方法签名的更改合理且保持了向后兼容性。建议添加类型守卫以增强类型安全性。

-  updateBadge(containerId: string, value?: ViewBadge | string) {
+  updateBadge(containerId: string, value?: ViewBadge | string) {
+    const isViewBadge = (val: any): val is ViewBadge => {
+      return val && typeof val === 'object' && 'value' in val;
+    };
     const component = this.getContainer(containerId);
     if (component && component.options) {
-      component.options.badge = value;
+      component.options.badge = isViewBadge(value) ? value : value;
     }
     component?.fireChange(component);
   }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 8bc3604 and b87f676.

📒 Files selected for processing (27)
  • packages/components/src/recycle-tree/tree/TreeNode.ts (2 hunks)
  • packages/components/src/recycle-tree/types/tree-node.ts (2 hunks)
  • packages/core-browser/src/layout/layout.interface.ts (3 hunks)
  • packages/extension/src/browser/components/extension-tree-view-node.tsx (6 hunks)
  • packages/extension/src/browser/components/extension-tree-view.tsx (5 hunks)
  • packages/extension/src/browser/sumi/main.thread.layout.ts (2 hunks)
  • packages/extension/src/browser/vscode/api/main.thread.api.webview.ts (3 hunks)
  • packages/extension/src/browser/vscode/api/main.thread.treeview.ts (4 hunks)
  • packages/extension/src/browser/vscode/api/tree-view/tree-view.model.service.ts (3 hunks)
  • packages/extension/src/browser/vscode/api/tree-view/tree-view.node.defined.ts (5 hunks)
  • packages/extension/src/common/sumi/layout.ts (2 hunks)
  • packages/extension/src/common/vscode/treeview.ts (7 hunks)
  • packages/extension/src/common/vscode/webview.ts (2 hunks)
  • packages/extension/src/hosted/api/sumi/ext.host.layout.ts (2 hunks)
  • packages/extension/src/hosted/api/vscode/ext.host.api.webview.ts (3 hunks)
  • packages/extension/src/hosted/api/vscode/ext.host.treeview.ts (11 hunks)
  • packages/main-layout/__tests__/browser/layout.service.test.tsx (2 hunks)
  • packages/main-layout/src/browser/accordion/accordion.service.ts (3 hunks)
  • packages/main-layout/src/browser/accordion/section.view.tsx (4 hunks)
  • packages/main-layout/src/browser/tabbar-handler.ts (2 hunks)
  • packages/main-layout/src/browser/tabbar/bar.view.tsx (4 hunks)
  • packages/main-layout/src/browser/tabbar/tabbar.service.ts (2 hunks)
  • packages/markers/src/browser/markers-service.ts (2 hunks)
  • packages/markers/src/common/types.ts (2 hunks)
  • packages/types/sumi.d.ts (2 hunks)
  • packages/types/vscode/typings/vscode.d.ts (6 hunks)
  • packages/types/vscode/typings/vscode.window.d.ts (1 hunks)
🔇 Additional comments (50)
packages/extension/src/common/vscode/treeview.ts (6)

42-42: 方法定义正确

$checkStateChanged 方法的定义清晰且符合预期。


87-91: 枚举定义合理

TreeItemCheckboxState 枚举定义了 UncheckedChecked 两个状态,符合预期。


113-114: 新增属性 'checkboxInfo'

TreeViewItem 类中新增了可选属性 checkboxInfo,用于支持复选框信息,符合功能扩展需求。


133-138: 新增事件 'onDidChangeCheckboxState'

TreeView 接口中添加了 onDidChangeCheckboxState 事件,用于监听复选框状态的变化,符合功能需求。


164-168: 新增属性 'badge'

TreeView 接口中添加了可选属性 badge,用于显示视图徽标,符合功能增强需求。


181-195: 新增接口 'ViewBadge'

定义了 ViewBadge 接口,包括 tooltipvalue 属性,支持视图徽标的显示,符合功能需求。

packages/extension/src/hosted/api/vscode/ext.host.treeview.ts (7)

109-111: 添加事件监听器以支持复选框状态变化

新增加的 onDidChangeCheckboxState getter 方法正确地暴露了 treeView 的复选框状态变化事件。


130-135: 实现徽章属性的获取和设置

新增的 badge 属性的 getter 和 setter 方法正确地实现了对 treeView.badge 的访问和修改。


221-234: 添加处理复选框状态变化的方法

新增的 $checkStateChanged 方法正确地处理了复选框状态的更新,并调用了对应的 treeView.checkStateChanged 方法。


326-328: 添加复选框状态变化的事件发射器

onDidChangeCheckboxStateEmitter 事件发射器正确地创建,并暴露了 onDidChangeCheckboxState 事件。


525-531: 为徽章属性添加 getter 和 setter

badge 属性的 getter 和 setter 方法实现正确,同时在 setter 中调用了 proxy.$setBadge 来同步更新。


801-815: 构建 checkboxInfo 的逻辑清晰且正确

根据 treeItem.checkboxState 构建 checkboxInfo 对象的逻辑完善,能够正确处理不同类型的 checkboxState


827-827: checkboxInfo 属性添加到 treeViewItem

在创建 treeViewItem 对象时,正确地包含了 checkboxInfo 属性,确保复选框信息能够在前端显示。

packages/types/vscode/typings/vscode.d.ts (6)

1895-1899: 成功添加 onDidChangeCheckboxState 事件

TreeView<T> 接口中新增的 onDidChangeCheckboxState 事件正确地支持了复选框状态变化的监听。


1918-1923: TreeView 接口新增 badge 属性

TreeView 接口中添加了 badge 属性,有助于在视图中显示徽章信息,提升用户体验。


1975-1988: 新增 TreeItemCheckboxState 枚举

成功定义了 TreeItemCheckboxState 枚举,包含 UncheckedChecked 状态,有助于明确表示复选框的状态。


1989-1998: 添加 TreeCheckboxChangeEvent<T> 接口

正确地添加了 TreeCheckboxChangeEvent<T> 接口,用于描述复选框状态变化事件的数据结构。


2155-2174: TreeItem 中添加 checkboxState 属性

checkboxState 属性的添加允许开发者在树项中设置复选框状态,增强了树视图的交互能力。


1939-1955: 定义 ViewBadge 接口

添加了 ViewBadge 接口,包含 tooltipvalue 属性,为视图提供了灵活的徽章显示功能。

packages/extension/src/common/sumi/layout.ts (3)

3-4: 引入 ViewBadge 类型

vscode 模块中正确地引入了 ViewBadge 类型,以支持新的 badge 属性。


12-12: 更新 setBadge 方法以支持 ViewBadge 类型

ITabbarHandler 接口中的 setBadge 方法参数类型更新为 string | ViewBadge,增强了方法的灵活性。


28-28: 更新 $setBadge 方法以支持 ViewBadge 类型

IMainThreadLayout 接口中的 $setBadge 方法参数类型更新为 string | ViewBadge,确保与前端的 badge 属性保持一致。

packages/components/src/recycle-tree/types/tree-node.ts (2)

6-11: 添加 TreeViewItemCheckboxInfo 接口

成功定义了 TreeViewItemCheckboxInfo 接口,包含 checkedtooltipaccessibilityInformation 属性,用于描述复选框的相关信息。


50-53: ITreeNode 接口中添加 checkboxInfo 属性

ITreeNode 接口中新增了可选的 checkboxInfo 属性,便于在树节点中管理复选框信息,增强了节点的可操作性。

packages/markers/src/common/types.ts (2)

5-5: 引入 ViewBadge 类型

vscode 模块中正确地引入了 ViewBadge 类型,为徽章功能的扩展做好准备。


19-19: 更新 getBadge 方法的返回类型以支持 ViewBadge

IMarkerService 接口中的 getBadge 方法返回类型更新为 string | ViewBadge | undefined,增强了方法的灵活性,支持更多样化的徽章展示。

packages/core-browser/src/layout/layout.interface.ts (2)

8-8: 导入 ViewBadge 类型以支持 VSCode API

从 vscode 模块导入 ViewBadge 类型,为视图组件提供更丰富的徽章展示功能。


40-40: 类型扩展符合 VSCode API 规范

badge 属性的类型从 string 扩展为 string | ViewBadge,使其与 VSCode API 保持一致,同时保持了向后兼容性。

Also applies to: 64-64

✅ Verification successful

Let me verify the usage of ViewBadge type in the codebase to ensure consistency.


ViewBadge 类型扩展验证通过

通过代码库分析确认:

  • ViewBadge 接口定义来自 VSCode API,包含 tooltip 和 value 属性
  • 该类型已在多个相关组件中正确导入和使用
  • badge 属性类型扩展为 string | ViewBadge 的改动与 VSCode API 规范保持一致
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 验证 ViewBadge 类型的使用是否一致

# 检查所有使用 badge 属性的地方
rg "badge.*:.*string" 

Length of output: 1935


Script:

#!/bin/bash
# Check the definition and usage of ViewBadge type
ast-grep --pattern 'interface ViewBadge {
  $$$
}'

# Check imports of ViewBadge
rg "import.*ViewBadge"

Length of output: 2680

packages/main-layout/src/browser/tabbar-handler.ts (1)

113-115: 代码变更合理

参数类型的更新符合 VSCode API 的规范,同时保持了向后兼容性。

packages/extension/src/browser/vscode/api/tree-view/tree-view.node.defined.ts (1)

159-160: 建议在 ExtensionTreeNode 中也应用相同的类型安全性增强

与 ExtensionCompositeTreeNode 保持一致,为参数添加默认值。

packages/main-layout/src/browser/accordion/section.view.tsx (1)

191-195: 徽章渲染逻辑实现正确

ViewBadge 类型的处理逻辑实现正确,能够正确显示字符串或 ViewBadge 类型的徽章值。

packages/extension/src/common/vscode/webview.ts (2)

79-79: 接口变更符合预期!

新增的 $setBadge 方法签名设计合理,与 VSCode API 保持一致。参数类型 vscode.ViewBadge 的使用也恰当。


317-322: 接口定义清晰完整!

WebviewView 接口中新增的 badge 属性定义完整,包含了适当的 JSDoc 注释说明。

packages/main-layout/__tests__/browser/layout.service.test.tsx (1)

309-309: 更新后的徽章设置方法使用正确!

setBadge 方法的调用已正确更新为使用新的对象格式。

packages/main-layout/src/browser/tabbar/bar.view.tsx (1)

243-243: 徽章渲染实现正确!

在 IconTabView 和 TextTabView 中使用 getBadgeValue 函数的方式正确,确保了徽章显示的一致性。

Also applies to: 262-262

packages/extension/src/hosted/api/vscode/ext.host.api.webview.ts (3)

434-434: 私有属性声明正确且符合规范

私有属性 #badge 的声明使用了 TypeScript 的私有字段语法,类型定义正确。


504-507: Getter 实现正确且包含必要的检查

badge 的 getter 实现:

  1. 包含了必要的 disposed 检查
  2. 返回类型符合 ViewBadge 接口定义

509-515: Setter 实现完整且具有防御性编程

badge 的 setter 实现:

  1. 包含了必要的 disposed 检查
  2. 包含了值变化检查,避免不必要的更新
  3. 正确调用代理方法同步状态
packages/extension/src/browser/vscode/api/main.thread.treeview.ts (1)

45-45: 导入声明正确且位置合适

ViewBadge 类型的导入位置正确,与相关类型导入放在一起。

packages/main-layout/src/browser/accordion/accordion.service.ts (3)

48-49: 类型导入声明正确

ViewBadge 类型的导入使用了 type 修饰符,这是正确的做法。


62-62: 接口更新正确且向后兼容

AccordionViewChangeEvent 接口中 badge 属性的类型更新:

  1. 保持了可选性
  2. 支持了新的 ViewBadge 类型
  3. 显式声明了 undefined 类型

221-221: 方法签名更新正确且实现完整

updateViewBadge 方法的更新:

  1. 参数类型正确更新为 string | ViewBadge
  2. 保持了参数的可选性
packages/types/vscode/typings/vscode.window.d.ts (1)

872-877: 代码变更正确且符合规范!

badge 属性的添加符合 VSCode API 的规范,类型定义准确。

packages/extension/src/browser/vscode/api/tree-view/tree-view.model.service.ts (1)

233-233: 事件发射器实现正确!

onDidUpdateEmitteronDidUpdate getter 的实现符合事件处理模式,可以正确通知订阅者树节点的更新。

Also applies to: 269-271

packages/components/src/recycle-tree/tree/TreeNode.ts (1)

28-28: 导入声明正确!

TreeViewItemCheckboxInfo 类型的导入位置正确,符合代码组织规范。

packages/types/sumi.d.ts (2)

30-30: 导入 ViewBadge 类型以支持 VSCode API

从 vscode 模块导入 ViewBadge 类型是合理的,这确保了与 VSCode API 的类型兼容性。


476-481: 更新 setBadge 方法签名以支持 ViewBadge

方法签名的更改适当地支持了 VSCode API 的 badge 功能,同时保持了向后兼容性。

packages/extension/src/browser/vscode/api/main.thread.api.webview.ts (2)

48-48: 导入 ViewBadge 类型用于 Webview 视图

从 vscode 模块导入 ViewBadge 类型,确保了类型系统的一致性。


622-622: 为 WebviewView 类添加 badge 属性

badge 属性的添加符合 VSCode API 的规范,使用可选修饰符是合适的。

packages/main-layout/src/browser/tabbar/tabbar.service.ts (1)

49-50: 导入 ViewBadge 类型用于标签栏服务

从 vscode 模块导入 ViewBadge 类型,保持了类型系统的一致性。

@@ -21,6 +21,7 @@ export interface IMainThreadTreeView {
$reveal(treeViewId: string, treeItemId?: string, options?: ITreeViewRevealOptions): Promise<any>;
$setTitle(treeViewId: string, message: string): Promise<void>;
$setDescription(treeViewId: string, message: string): Promise<void>;
$setBadge(treeViewId: string, badge?: ViewBadge): void;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

建议保持返回类型的一致性

$setBadge 方法的返回类型为 void,而接口中的其他方法通常返回 Promise<void>。为了保持一致性,建议将其修改为返回 Promise<void>

Comment on lines +656 to +671
async checkStateChanged(items: readonly { id: string; checked: boolean }[]): Promise<void> {
const transformed: [T, TreeItemCheckboxState][] = [];
items.forEach((item) => {
const node = this.getTreeItem(item.id);
if (node) {
transformed.push([node, item.checked ? TreeItemCheckboxState.Checked : TreeItemCheckboxState.Unchecked]);
const treeViewItem = this.element2TreeViewItem.get(node);
if (treeViewItem) {
treeViewItem.checkboxInfo!.checked = item.checked;
}
}
});
this.onDidChangeCheckboxStateEmitter.fire({
items: transformed,
});
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

在访问 checkboxInfo 前添加空值检查以避免潜在的空引用错误

在第 664 行,代码使用了非空断言操作符 ! 来访问 treeViewItem.checkboxInfo。为防止可能的空引用错误,建议在访问 checkboxInfo 属性前,添加空值检查,确保其已被初始化。

建议修改如下:

if (treeViewItem) {
+  if (treeViewItem.checkboxInfo) {
     treeViewItem.checkboxInfo.checked = item.checked;
+  }
}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
async checkStateChanged(items: readonly { id: string; checked: boolean }[]): Promise<void> {
const transformed: [T, TreeItemCheckboxState][] = [];
items.forEach((item) => {
const node = this.getTreeItem(item.id);
if (node) {
transformed.push([node, item.checked ? TreeItemCheckboxState.Checked : TreeItemCheckboxState.Unchecked]);
const treeViewItem = this.element2TreeViewItem.get(node);
if (treeViewItem) {
treeViewItem.checkboxInfo!.checked = item.checked;
}
}
});
this.onDidChangeCheckboxStateEmitter.fire({
items: transformed,
});
}
async checkStateChanged(items: readonly { id: string; checked: boolean }[]): Promise<void> {
const transformed: [T, TreeItemCheckboxState][] = [];
items.forEach((item) => {
const node = this.getTreeItem(item.id);
if (node) {
transformed.push([node, item.checked ? TreeItemCheckboxState.Checked : TreeItemCheckboxState.Unchecked]);
const treeViewItem = this.element2TreeViewItem.get(node);
if (treeViewItem) {
if (treeViewItem.checkboxInfo) {
treeViewItem.checkboxInfo.checked = item.checked;
}
}
}
});
this.onDidChangeCheckboxStateEmitter.fire({
items: transformed,
});
}

Comment on lines +4 to +11
import {
CheckBox,
ClasslistComposite,
INodeRendererProps,
Loading,
PromptHandle,
TreeNodeType,
} from '@opensumi/ide-components';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

导入但未使用 CheckBox 组件

导入了 CheckBox 组件但在代码中并未使用,这可能是一个未完成的实现。

建议实现复选框渲染或移除未使用的导入。

Comment on lines +186 to +187
const renderCheckbox = (node: ExtensionCompositeTreeNode | ExtensionTreeNode) => <div></div>;

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

复选框渲染函数未实现

renderCheckbox 函数返回空的 div,没有实际渲染复选框组件。

建议实现如下:

-const renderCheckbox = (node: ExtensionCompositeTreeNode | ExtensionTreeNode) => <div></div>;
+const renderCheckbox = (node: ExtensionCompositeTreeNode | ExtensionTreeNode) => {
+  if (!node.checkboxInfo) {
+    return null;
+  }
+  return (
+    <CheckBox
+      checked={node.checkboxInfo.checked}
+      onChange={hadnleCheck}
+      className={styles.tree_view_node_checkbox}
+    />
+  );
+};

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +120 to +123
const handleItemChecked = useCallback(
(ev: MouseEvent, item: ExtensionTreeNode | ExtensionCompositeTreeNode, type: TreeNodeType) => {},
[canSelectMany, model],
);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

处理复选框事件的回调函数未实现

handleItemChecked 回调函数是空的实现,且依赖数组包含了未使用的变量。

建议实现如下:

-const handleItemChecked = useCallback(
-  (ev: MouseEvent, item: ExtensionTreeNode | ExtensionCompositeTreeNode, type: TreeNodeType) => {},
-  [canSelectMany, model],
-);
+const handleItemChecked = useCallback(
+  (ev: MouseEvent, item: ExtensionTreeNode | ExtensionCompositeTreeNode, type: TreeNodeType) => {
+    ev.stopPropagation();
+    model.handleItemCheck(item);
+  },
+  [model],
+);

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +39 to +47
function getBadgeValue(badge: string | ViewBadge) {
if (typeof badge === 'string') {
return parseInt(badge, 10) > 99 ? '99+' : badge;
}
if (typeof badge === 'object' && badge.value) {
return badge.value > 99 ? '99+' : badge.value;
}
return '';
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

建议优化徽章值处理函数的实现!

当前的 getBadgeValue 函数实现可以改进:

  1. 需要处理 badge.value 为非数字的情况
  2. 建议添加类型守卫

建议如下实现:

-function getBadgeValue(badge: string | ViewBadge) {
+function getBadgeValue(badge: string | ViewBadge): string {
+  if (!badge) {
+    return '';
+  }
   if (typeof badge === 'string') {
-    return parseInt(badge, 10) > 99 ? '99+' : badge;
+    const num = parseInt(badge, 10);
+    return isNaN(num) ? badge : num > 99 ? '99+' : badge;
   }
-  if (typeof badge === 'object' && badge.value) {
-    return badge.value > 99 ? '99+' : badge.value;
+  if (typeof badge === 'object' && badge.value !== undefined) {
+    const value = badge.value;
+    if (typeof value === 'number') {
+      return value > 99 ? '99+' : value.toString();
+    }
+    return value.toString();
   }
   return '';
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function getBadgeValue(badge: string | ViewBadge) {
if (typeof badge === 'string') {
return parseInt(badge, 10) > 99 ? '99+' : badge;
}
if (typeof badge === 'object' && badge.value) {
return badge.value > 99 ? '99+' : badge.value;
}
return '';
}
function getBadgeValue(badge: string | ViewBadge): string {
if (!badge) {
return '';
}
if (typeof badge === 'string') {
const num = parseInt(badge, 10);
return isNaN(num) ? badge : num > 99 ? '99+' : badge;
}
if (typeof badge === 'object' && badge.value !== undefined) {
const value = badge.value;
if (typeof value === 'number') {
return value > 99 ? '99+' : value.toString();
}
return value.toString();
}
return '';
}

Copy link

codecov bot commented Dec 6, 2024

Codecov Report

Attention: Patch coverage is 16.27907% with 72 lines in your changes missing coverage. Please review.

Project coverage is 54.01%. Comparing base (dedba74) to head (b87f676).
Report is 17 commits behind head on main.

Files with missing lines Patch % Lines
...tension/src/hosted/api/vscode/ext.host.treeview.ts 14.28% 25 Missing and 5 partials ⚠️
...ser/vscode/api/tree-view/tree-view.node.defined.ts 0.00% 12 Missing ⚠️
.../src/browser/vscode/api/main.thread.api.webview.ts 0.00% 4 Missing and 4 partials ⚠️
...sion/src/hosted/api/vscode/ext.host.api.webview.ts 11.11% 7 Missing and 1 partial ⚠️
...ion/src/browser/vscode/api/main.thread.treeview.ts 0.00% 2 Missing and 3 partials ⚠️
...er/vscode/api/tree-view/tree-view.model.service.ts 33.33% 4 Missing ⚠️
...kages/components/src/recycle-tree/tree/TreeNode.ts 0.00% 2 Missing ⚠️
...s/extension/src/browser/sumi/main.thread.layout.ts 0.00% 1 Missing ⚠️
...-layout/src/browser/accordion/accordion.service.ts 0.00% 1 Missing ⚠️
packages/markers/src/browser/markers-service.ts 0.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #4197      +/-   ##
==========================================
- Coverage   54.08%   54.01%   -0.07%     
==========================================
  Files        1611     1616       +5     
  Lines       97846    98050     +204     
  Branches    20031    20070      +39     
==========================================
+ Hits        52917    52966      +49     
- Misses      37325    37458     +133     
- Partials     7604     7626      +22     
Flag Coverage Δ
jsdom 49.59% <16.27%> (-0.06%) ⬇️
node 15.55% <0.00%> (-0.03%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@bk1012 bk1012 closed this Dec 6, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🎨 feature feature required
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants