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

docs(site): fix demos and test e2e #2444

Merged
merged 1 commit into from
Oct 28, 2024
Merged

docs(site): fix demos and test e2e #2444

merged 1 commit into from
Oct 28, 2024

Conversation

gimmyhehe
Copy link
Member

@gimmyhehe gimmyhehe commented Oct 28, 2024

PR

PR Checklist

Please check if your PR fulfills the following requirements:

  • The commit message follows our Commit Message Guidelines
  • Tests for the changes have been added (for bug fixes / features)
  • Docs have been added / updated (for bug fixes / features)

PR Type

What kind of change does this PR introduce?

  • Bugfix
  • Feature
  • Code style update (formatting, local variables)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • CI related changes
  • Documentation content changes
  • Other... Please describe:

What is the current behavior?

Issue Number: N/A

What is the new behavior?

Does this PR introduce a breaking change?

  • Yes
  • No

Other information

Summary by CodeRabbit

Release Notes

  • New Features

    • Updated various components to utilize Tiny versions (e.g., TinyColorPicker, TinyButton, TinySelect, TinyDatePicker, TinyInput, TinySwitch, TinyPopeditor) for improved performance and consistency.
  • Bug Fixes

    • Adjusted test cases to reflect changes in class names for selected rows in dropdowns, ensuring accurate validation of selection mechanisms.
  • Documentation

    • Enhanced debugging capabilities with added logging in the remoteMethod function for better visibility into data processing.
  • Style

    • Updated expected dimensions for UI components in test cases to align with new design specifications.

Copy link

coderabbitai bot commented Oct 28, 2024

Walkthrough

The changes in this pull request involve replacing several components in various Vue files with their corresponding "tiny" versions. Specifically, components such as ColorPicker, Button, Select, DatePicker, and Input have been replaced with tiny-color-picker, tiny-button, TinySelect, TinyDatePicker, and TinyInput, respectively. The modifications primarily affect the template sections of the components, while the underlying logic and functionality remain unchanged. Additionally, some test files have been updated to reflect changes in expected class names and component behaviors.

Changes

File Path Change Summary
examples/sites/demos/pc/app/color-picker/history-composition-api.vue Replaced <ColorPicker> with <tiny-color-picker> and <Button> with <tiny-button>.
examples/sites/demos/pc/app/color-picker/predefine-composition-api.vue Replaced <ColorPicker> with <tiny-color-picker> and <Button> with <tiny-button>.
examples/sites/demos/pc/app/color-select-panel/history-composition-api.vue Replaced <ColorSelectPanel> with <tiny-color-select-panel>.
examples/sites/demos/pc/app/color-select-panel/predefine-composition-api.vue Replaced <ColorSelectPanel> with <tiny-color-select-panel>.
examples/sites/demos/pc/app/grid/editor/custom-editor-select-composition-api.vue Updated editor component from Select to TinySelect for area field.
examples/sites/demos/pc/app/grid/editor/custom-editor-select.vue Updated editor component from Select to TinySelect for area field.
examples/sites/demos/pc/app/grid/editor/mutil-render-composition-api.vue Updated editor component from Select to TinySelect for area field.
examples/sites/demos/pc/app/grid/editor/mutil-render.vue Updated editor component from Select to TinySelect for area field.
examples/sites/demos/pc/app/grid/editor/popeditor-in-grid-remote-search-composition-api.vue Updated editor from Popeditor to TinyPopeditor for id field.
examples/sites/demos/pc/app/grid/editor/popeditor-in-grid-remote-search.vue Updated editor from Popeditor to TinyPopeditor for id field.
examples/sites/demos/pc/app/grid/large-data/grid-large-tree-data-composition-api.vue Replaced DatePicker with TinyDatePicker for multiple columns.
examples/sites/demos/pc/app/grid/large-data/grid-large-tree-data.vue Replaced DatePicker with TinyDatePicker for multiple columns.
examples/sites/demos/pc/app/grid/renderer/async-colunm-render-composition-api.vue Updated editor component from Select to TinySelect for city field.
examples/sites/demos/pc/app/grid/renderer/async-colunm-render.vue Updated editor component from Select to TinySelect for city field.
examples/sites/demos/pc/app/grid/renderer/custom-renderer-composition-api.vue Updated renderer from Switch to TinySwitch for boole field.
examples/sites/demos/pc/app/grid/renderer/custom-renderer.vue Updated renderer from Switch to TinySwitch for boole field.
examples/sites/demos/pc/app/grid/validation/valid-config-composition-api.vue Updated editor from Input to TinyInput for name field.
examples/sites/demos/pc/app/grid/validation/valid-config.vue Updated editor from Input to TinyInput for name field.
examples/sites/demos/pc/app/grid/validation/validation-scroll-to-col-composition-api.vue Updated editor from Input to TinyInput for name field.
examples/sites/demos/pc/app/grid/validation/validation-scroll-to-col.vue Updated editor from Input to TinyInput for name field.
examples/sites/demos/pc/app/select/nest-grid-remote.spec.ts Updated expected class for selected rows from row__selected to row__radio.
examples/sites/demos/pc/app/select/nest-grid-remote.vue Added console.log for debugging in remoteMethod.
examples/sites/demos/pc/app/select/nest-grid.spec.ts Updated expected class for selected rows from row__selected to row__radio.
examples/sites/demos/pc/app/select/nest-radio-grid-much-data.spec.ts Updated expected class for selected rows from row__selected to row__radio.
examples/sites/demos/pc/app/select/size.spec.ts Updated expected height for 'mini' size from 27px to 24px.
examples/sites/demos/pc/app/slider/max-min.spec.ts Updated expected slider tip values at specific positions.

Possibly related PRs

Suggested labels

documentation

Suggested reviewers

  • zzcr

🐰 In the garden where colors bloom,
Tiny pickers chase away the gloom.
Buttons small, yet oh so bright,
Making choices feel just right.
With every click, a new hue found,
In our world, joy knows no bound! 🌈


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

[e2e-test-warn]
The component to be tested is missing.

The title of the Pull request should look like "fix(vue-renderless): [action-menu, alert] fix xxx bug".

Please make sure you've read our contributing guide

Copy link

@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: 9

🧹 Outside diff range and nitpick comments (32)
examples/sites/demos/pc/app/color-picker/history-composition-api.vue (1)

Line range hint 16-21: Consider improving color generation and history management.

The current implementation could benefit from some enhancements:

  1. The randomHex function might generate invalid or duplicate colors
  2. There's no validation for maximum history size or duplicate colors

Consider applying these improvements:

-const randomHex = () =>
-  '#' +
-  Math.floor(Math.random() * 0xffffff)
-    .toString(16)
-    .padEnd(6, '0')
+const MAX_HISTORY = 10
+const randomHex = () => {
+  const hex = '#' + Math.floor(Math.random() * 0xffffff)
+    .toString(16)
+    .padStart(6, '0')
+  return hex.toUpperCase()
+}
 const addHistoryColor = () => {
+  if (history.value.length >= MAX_HISTORY) {
+    history.value.shift()
+  }
   history.value.push(randomHex())
 }
examples/sites/demos/pc/app/slider/max-min.spec.ts (1)

Line range hint 1-24: Consider improving test stability and maintainability.

A few suggestions to enhance the test:

  1. Replace waitForTimeout() with more reliable wait strategies like waitForSelector() or waitForFunction()
  2. Consider translating the test title to English for better maintainability
  3. Add comments explaining the expected behavior and value calculations

Here's a suggested refactor:

 import { test, expect } from '@playwright/test'
 
-test('最大值最小值', async ({ page }) => {
+test('slider max-min values', async ({ page }) => {
   page.on('pageerror', (exception) => expect(exception).toBeNull())
   await page.goto('slider#max-min')
   const slider = page.locator('.tiny-slider-container .tiny-slider')
   const sliderBlock = slider.locator('div').nth(1)
-  // 获取进度条的宽度
+  // Get slider width
   const { width: sliderWidth } = await slider.boundingBox()
   const { x, y } = await sliderBlock.boundingBox()
 
   await sliderBlock.hover()
   await page.mouse.down()
   await page.mouse.move(sliderWidth * -0.3 + x, y)
   const sliderTip = slider.locator('div').nth(2)
+  // Wait for the tip to be visible and contain the expected value
+  await expect(sliderTip).toBeVisible()
   await expect(sliderTip).toHaveText('30')
-  await page.waitForTimeout(1000)
+  
   await page.mouse.move(sliderWidth * 0.81 + x, y)
   const sliderTip1 = slider.locator('div').nth(2)
+  await expect(sliderTip1).toBeVisible()
   await expect(sliderTip1).toHaveText('62')
-  await page.waitForTimeout(1000)
   await page.mouse.up()
 })
examples/sites/demos/pc/app/color-select-panel/history-composition-api.vue (2)

Line range hint 29-35: Consider using i18n for notification messages.

The notification messages are currently hardcoded in Chinese. Consider using an i18n system for better internationalization support.

Example approach:

-    title: '用户点击了选择',
+    title: t('colorSelect.userClickedSelect'),

Line range hint 1-13: Add explanatory comments for demo purposes.

Since this is a demo component, consider adding comments to explain:

  • The purpose of this demo
  • Key features being demonstrated (panel visibility, history management)
  • Usage examples of the component's props and events

Example addition:

+<!--
+  Demo component showcasing TinyColorSelectPanel with history management:
+  - Basic color selection with confirm/cancel actions
+  - Dynamic visibility control
+  - Color history management (add/remove colors)
+  
+  Key props:
+  - v-model: Selected color value
+  - visible: Controls panel visibility
+  - history: Array of historical colors
+-->
 <template>
examples/sites/demos/pc/app/color-select-panel/predefine-composition-api.vue (3)

Line range hint 28-35: Consider adding TypeScript type definitions for event handlers.

The onConfirm handler receives a msg parameter, but its type is not defined. Consider adding TypeScript or JSDoc type definitions for better maintainability and IDE support.

-const onConfirm = (msg) => {
+const onConfirm = (msg: string) => {

Line range hint 44-47: Improve random color generation implementation.

The current random color generation might produce invalid or duplicate colors. Consider using a more robust implementation that ensures valid and unique color values.

-const randomHex = () =>
-  '#' +
-  Math.floor(Math.random() * 0xffffff)
-    .toString(16)
-    .padEnd(6, '0')
+const randomHex = () => {
+  const hex = Math.floor(Math.random() * 0xffffff)
+    .toString(16)
+    .padStart(6, '0')
+  return `#${hex}`
+}

Line range hint 28-35: Consider internationalizing notification messages.

The notification messages are currently in Chinese. Consider using an i18n solution for better internationalization support.

 const onConfirm = (msg) => {
   TinyNotify({
     type: 'success',
     position: 'top-right',
-    title: '用户点击了选择',
+    title: t('colorSelect.userConfirmed'),
     message: msg
   })
   hidden()
 }
examples/sites/demos/pc/app/select/nest-radio-grid-much-data.spec.ts (1)

Line range hint 29-34: Consider optimizing the scroll testing logic.

The current implementation has repetitive scroll and count verification code that could be simplified. Consider using a loop with an array of assertions or implementing a helper function to reduce duplication.

Here's a suggested refactor:

-  await row.nth(5).scrollIntoViewIfNeeded()
-  await expect(row).toHaveCount(6)
-  await row.nth(5).scrollIntoViewIfNeeded()
-  await expect(row).toHaveCount(6)
-  await row.nth(5).scrollIntoViewIfNeeded()
-  await expect(row).toHaveCount(6)
+  // Verify scroll behavior maintains row count
+  for (let i = 0; i < 3; i++) {
+    await row.nth(5).scrollIntoViewIfNeeded()
+    await expect(row).toHaveCount(6)
+  }
examples/sites/demos/pc/app/select/size.spec.ts (1)

Line range hint 1-61: Consider standardizing component size system.

The test suite reveals inconsistencies in component sizing:

  • Default: 32px
  • Medium: 40px (TODO suggests 32px)
  • Small: ~28px
  • Mini: ~24px

Consider implementing a standardized size system across all components to maintain consistency. This could be achieved through:

  1. A shared size token system
  2. Common size mixins/utilities
  3. Documentation of the size system
examples/sites/demos/pc/app/select/nest-grid-remote.vue (2)

Line range hint 121-128: Consider enhancing the remote search implementation.

The current implementation has several potential improvements:

  1. Error handling for the Promise
  2. Debouncing the remote search to prevent excessive API calls
  3. Loading state management

Consider refactoring to:

    remoteMethod(value) {
      const filterData = this.filter(value)
-     console.log(filterData, value)
-     return new Promise((resolve) => {
+     return new Promise((resolve, reject) => {
        setTimeout(() => {
+         try {
            resolve(filterData)
+         } catch (error) {
+           reject(error)
+         }
        }, 500)
      })
    },

Additionally, consider adding these features:

// Add at component level
import { ref } from 'vue'
import { debounce } from 'lodash-es'

// In setup or data
const loading = ref(false)

// Enhanced remote method
const remoteMethod = debounce(async (value) => {
  loading.value = true
  try {
    const filterData = this.filter(value)
    return await new Promise((resolve) => {
      setTimeout(() => resolve(filterData), 500)
    })
  } catch (error) {
    // Handle error appropriately
    console.error('Failed to fetch data:', error)
    return []
  } finally {
    loading.value = false
  }
}, 300)

Line range hint 129-131: Consider adding input validation and error handling to filter method.

The current filter implementation might be susceptible to errors if value is undefined or null.

    filter(value) {
+     if (!value) return this.allData
+     const searchTerm = String(value).toLowerCase()
-     return this.allData.filter((item) => item.city.includes(value))
+     return this.allData.filter((item) => 
+       item.city.toLowerCase().includes(searchTerm)
+     )
    }
examples/sites/demos/pc/app/grid/renderer/custom-renderer-composition-api.vue (1)

Line range hint 95-97: Consider using CSS classes instead of inline styles.

While the custom renderer works correctly, using CSS classes instead of inline styles would be more maintainable and consistent with best practices.

-function renderName(h, { row }) {
-  return <span style="color:goldenrod">{row.name}</span>
+function renderName(h, { row }) {
+  return <span class="golden-text">{row.name}</span>
}

Add this to your component's style section:

<style>
.golden-text {
  color: goldenrod;
}
</style>
examples/sites/demos/pc/app/grid/editor/custom-editor-select-composition-api.vue (1)

14-14: Consider using consistent component referencing style across editors.

While the TinySelect implementation is correct, there's an inconsistency in how components are referenced in editors. Other editors use string references (e.g., 'input'), while TinySelect uses a direct component reference.

Consider applying this change for consistency:

-          component: TinySelect,
+          component: 'tiny-select',

This maintains consistency with other editor configurations in the grid and follows the pattern used for other components.

examples/sites/demos/pc/app/select/nest-grid.spec.ts (1)

24-24: LGTM! Consider enhancing test readability.

The class assertion update correctly reflects the radio-style single selection behavior, consistent with related test files.

Consider extracting the expected class as a constant at the top of the file for better maintainability:

import { test, expect } from '@playwright/test'

+const SELECTED_ROW_CLASS = 'tiny-grid-body__row row__radio'
examples/sites/demos/pc/app/grid/renderer/custom-renderer.vue (2)

10-10: LGTM! Consider adding a comment about the switch behavior.

The change to TinySwitch is correct and aligns with the component modernization effort. However, since this is a demo file, it would be helpful to add a comment explaining how the switch interacts with the boolean values in the data.

Add a comment above the column to explain the behavior:

      <tiny-grid-column
+       <!-- The switch automatically binds to the boolean 'boole' field and toggles its state -->
        field="boole"
        title="Vue 渲染器"
        align="center"
        :renderer="{ component: TinySwitch }"
      ></tiny-grid-column>

Line range hint 21-124: Consider enhancing the demo's educational value.

While the demo effectively shows basic switch usage, it could be more instructive by:

  1. Demonstrating two-way binding with the switch
  2. Showing how to handle switch events
  3. Including comments in the renderName method to explain the JSX usage

Consider adding an event handler to show switch interactions:

      <tiny-grid-column
        field="boole"
        title="Vue 渲染器"
        align="center"
-       :renderer="{ component: TinySwitch }"
+       :renderer="{ 
+         component: TinySwitch,
+         events: {
+           change: handleSwitchChange
+         }
+       }"
      ></tiny-grid-column>

// In methods section:
+ handleSwitchChange(value, row) {
+   console.log(`Switch toggled to ${value} for company: ${row.name}`);
+ }
examples/sites/demos/pc/app/grid/editor/mutil-render-composition-api.vue (1)

Line range hint 14-20: Consider adding a documentation comment.

Since this is a demo file showcasing grid functionality, consider adding a comment to document the multiple selection capability of the editor.

 <tiny-grid-column
   field="area"
   title="区域"
+  <!-- The area field supports multiple selection through TinySelect -->
   :editor="{
     component: TinySelect,
     attrs: {
       multiple: true,
       options,
       textField: 'name',
       valueField: 'id'
     }
   }"
   :format-text="formatMulti"
 ></tiny-grid-column>
examples/sites/demos/pc/app/grid/renderer/async-colunm-render-composition-api.vue (1)

Line range hint 134-152: Consider enhancing error handling and configurability.

The fetchMethod implementation could benefit from the following improvements:

  1. Add error handling for the Promise
  2. Make the timeout duration configurable
  3. Add TypeScript interfaces for the data structure

Consider applying these improvements:

+ interface CityOption {
+   text: string
+   value: string
+ }

+ const FETCH_TIMEOUT = 500 // ms
+
- function fetchMethod() {
+ async function fetchMethod(): Promise<CityOption[]> {
   const randomFN = () => {
     return [
       {
         text: '福州',
         value: 'FZ'
       },
       // ... other options
     ]
   }

   return new Promise((resolve, reject) => {
-    setTimeout(() => {
-      resolve(randomFN())
-    }, 500)
+    try {
+      setTimeout(() => {
+        resolve(randomFN())
+      }, FETCH_TIMEOUT)
+    } catch (error) {
+      reject(new Error(`Failed to fetch city options: ${error.message}`))
+    }
   })
 }
examples/sites/demos/pc/app/grid/editor/custom-editor-select.vue (1)

Line range hint 31-40: Improve component registration pattern.

Currently, TinySelect is added to the data object which is unconventional. Instead, it should be registered in the components object for better maintainability and to follow Vue.js best practices.

Apply this change:

 export default {
   components: {
     TinyGrid,
-    TinyGridColumn
+    TinyGridColumn,
+    TinySelect
   },
   data() {
     return {
-      TinySelect,
       options: [
         { name: '华中区', id: '1' },
examples/sites/demos/pc/app/grid/validation/validation-scroll-to-col-composition-api.vue (1)

Line range hint 14-18: Consider standardizing editor components across columns.

While the "name" column has been updated to use TinyInput, other columns are still using the string literal 'input' as their editor component. Consider standardizing the approach across all columns for consistency.

      <tiny-grid-column field="name" title="名称" width="460" :editor="{ component: TinyInput }"></tiny-grid-column>
-     <tiny-grid-column field="area" title="区域" width="460" :editor="{ component: 'input' }"></tiny-grid-column>
-     <tiny-grid-column field="address" title="地址" width="460" :editor="{ component: 'input' }"></tiny-grid-column>
-     <tiny-grid-column field="introduction" title="公司简介" width="460" :editor="{ component: 'input' }"></tiny-grid-column>
+     <tiny-grid-column field="area" title="区域" width="460" :editor="{ component: TinyInput }"></tiny-grid-column>
+     <tiny-grid-column field="address" title="地址" width="460" :editor="{ component: TinyInput }"></tiny-grid-column>
+     <tiny-grid-column field="introduction" title="公司简介" width="460" :editor="{ component: TinyInput }"></tiny-grid-column>
examples/sites/demos/pc/app/grid/editor/mutil-render.vue (1)

Line range hint 143-150: Improve formatMulti implementation for better readability and safety.

The current implementation uses the ~ operator with indexOf which can be confusing. Consider using a more explicit comparison and add null checks.

 formatMulti({ cellValue }) {
-  if (Array.isArray(cellValue) && cellValue.length) {
-    const selected = this.options.filter((item) => ~cellValue.indexOf(item.id))
+  if (!cellValue) return '';
+  if (Array.isArray(cellValue) && cellValue.length) {
+    const selected = this.options.filter((item) => cellValue.includes(item.id))
     return selected.map((item) => item.name).join(';')
   }
   return ''
 }
examples/sites/demos/pc/app/grid/editor/popeditor-in-grid-remote-search.vue (2)

Line range hint 134-157: Consider enhancing the mock data implementation.

The current implementation of remoteSearch could be improved for better testing and maintainability:

  1. The random company name generation could be more realistic
  2. The artificial delay might slow down testing
  3. The city selection could be more structured

Consider this improved implementation:

    remoteSearch({ page }) {
-     const randomAlphabets = () => {
-       return Array.from({ length: 5 })
-         .map(() => String.fromCharCode(65 + Math.floor(26 * Math.random())))
-         .join('')
-     }
+     const companyPrefixes = ['Tech', 'Digital', 'Smart', 'Cloud', 'Data'];
+     const companySuffixes = ['Solutions', 'Systems', 'Technologies', 'Innovations', 'Services'];
+     const cities = {
+       '福建省': ['福州', '厦门', '龙岩'],
+       '广东省': ['深圳', '中山', '韶关']
+     };
 
      const { currentPage, pageSize } = page
 
      const data = Array.from({ length: page.pageSize }).map((item, i) => {
+       const prefix = companyPrefixes[Math.floor(Math.random() * companyPrefixes.length)];
+       const suffix = companySuffixes[Math.floor(Math.random() * companySuffixes.length)];
+       const province = Object.keys(cities)[Math.floor(Math.random() * Object.keys(cities).length)];
+       const city = cities[province][Math.floor(Math.random() * cities[province].length)];
        return {
          id: pageSize * (currentPage - 1) + i + 1,
-         name: randomAlphabets() + 'YX公司',
-         city: ['福州', '深圳', '中山', '龙岩', '韶关', '黄冈', '赤壁', '厦门'][Math.floor(Math.random() * 8)],
+         name: `${prefix} ${suffix} Co., Ltd.`,
+         city,
+         province,
          employees: Math.ceil(Math.random() * 10000)
        }
      })

      return new Promise((resolve) => {
        setTimeout(() => {
          resolve({ data, total: 200 })
-       }, 500)
+       }, process.env.NODE_ENV === 'test' ? 0 : 500)
      })
    }

Line range hint 171-175: Add error handling for remote operations.

The mounted hook and remote operations should include error handling to improve reliability.

Consider adding error handling:

  mounted() {
-   this.getOptions().then((data) => {
-     this.popeditOptions = data
-   })
+   this.getOptions()
+     .then((data) => {
+       this.popeditOptions = data
+     })
+     .catch((error) => {
+       console.error('Failed to load options:', error)
+       // Consider showing a user-friendly error message
+       this.popeditOptions = []
+     })
  }

Also consider adding similar error handling to the remoteSearch method.

examples/sites/demos/pc/app/grid/renderer/async-colunm-render.vue (3)

Line range hint 39-42: Consider moving TinySelect to components declaration.

Instead of including TinySelect in the data object, it would be more idiomatic to declare it in the components section along with TinyGrid and TinyGridColumn.

 components: {
   TinyGrid,
-  TinyGridColumn
+  TinyGridColumn,
+  TinySelect
 },
 data() {
   return {
-    TinySelect,
     options: [],

Line range hint 156-167: Add error handling to async data fetching.

The fetchMethod simulation should include error handling to better represent real-world scenarios and improve robustness.

 fetchMethod() {
   return new Promise((resolve) => {
     // 模拟发起请求,500毫秒后生效
     setTimeout(() => {
       resolve(randomFN())
       // 模拟请求完成
     }, 500)
-  })
+  }).catch(error => {
+    console.error('Failed to fetch city options:', error)
+    return [] // Provide fallback data
+  })
 }

Line range hint 77-84: Document city code mappings.

The tableData uses city codes (FZ, SZ, etc.) without clear documentation. Consider adding comments or constants to document the mapping between city codes and their full names.

+ // City code mappings:
+ // FZ: 福州, SZ: 深圳, ZS: 中山, LY: 龙岩, SG: 韶关, HG: 黄冈, CB: 赤壁, XM: 厦门
 {
   id: '1',
   name: 'GFD科技YX公司',
   city: 'FZ',  // 福州
examples/sites/demos/pc/app/select/nest-grid-remote.spec.ts (1)

Line range hint 1-146: Consider these test improvements for better maintainability.

While the test coverage is comprehensive, here are some suggestions to enhance maintainability:

  1. Replace hardcoded timeouts with configurable constants:
+ const SEARCH_TIMEOUT = 200;
+ const LOAD_TIMEOUT = 1000;

- await page.waitForTimeout(200)
+ await page.waitForTimeout(SEARCH_TIMEOUT)

- await page.waitForTimeout(1000)
+ await page.waitForTimeout(LOAD_TIMEOUT)
  1. Extract common selectors as constants:
+ const SELECTORS = {
+   dropdown: 'body > .tiny-select-dropdown',
+   suffixSvg: '.tiny-input__suffix .tiny-select__caret',
+   gridBody: '.tiny-grid__body tbody'
+ };
  1. Consider moving common setup to beforeEach:
test.beforeEach(async ({ page }) => {
  page.on('pageerror', (exception) => expect(exception).toBeNull())
  await page.goto('select#nest-grid-remote')
});
examples/sites/demos/pc/app/grid/large-data/grid-large-tree-data-composition-api.vue (3)

46-46: LGTM! Consider adding date constraints and localization.

The TinyDatePicker implementation is consistent across all three columns. However, consider enhancing the implementation with:

  • Date validation constraints (min/max dates)
  • Localization support for different date formats

Example enhancement:

 :editor="{ 
   component: TinyDatePicker, 
   attrs: { 
     format: 'yyyy-MM-dd', 
     valueFormat: 'yyyy-MM-dd',
+    minDate: '2020-01-01',
+    maxDate: '2025-12-31',
+    placeholder: t('selectDate')
   } 
 }"

Also applies to: 51-51, 56-56


Line range hint 1-120: Consider refactoring repeated column definitions.

The grid contains multiple columns with identical structures and duplicated titles (suffixed with numbers). This pattern increases maintenance overhead and the risk of inconsistencies.

Consider generating columns programmatically:

const baseColumns = [
  { field: 'requireSource', title: '需求来源' },
  { field: 'isRequireDev', title: '是否需要开发' },
  // ... other base columns
]

const generateColumns = (count) => {
  return baseColumns.flatMap(col => 
    Array.from({ length: count }, (_, i) => ({
      ...col,
      title: i === 0 ? col.title : `${col.title}${i + 1}`
    }))
  )
}

Then in template:

<template v-for="column in generateColumns(3)" :key="column.field">
  <tiny-grid-column v-bind="column">
    <template #header="{ column }">{{ column.title }}</template>
    <template #default="{ row, column }">{{ row[column.property] }}</template>
  </tiny-grid-column>
</template>

Line range hint 121-185: Enhance data generation with type safety and configuration.

The current implementation uses hard-coded values and lacks type definitions. Consider improving the data generation logic for better maintainability and type safety.

Consider these improvements:

// Define types
interface GridItem {
  id: string
  irId: string
  irTitle: string
  // ... other fields
  children?: GridItem[]
}

// Extract configuration
const CONFIG = {
  COUNT: 120,
  BASE_DATE: '2022-08-27',
  TYPES: {
    IR: { prefix: 'IR', startId: 20220812243395 },
    US: { prefix: 'US', startId: 20220712243395 },
    TASK: { prefix: 'TK', startId: 20220412243395 }
  }
} as const

// Use configuration in buildArr
const buildArr = ({ type, start, idStart }: {
  type: keyof typeof CONFIG.TYPES,
  start: number,
  idStart: number
}): GridItem[] => {
  // ... existing implementation with types
}
examples/sites/demos/pc/app/grid/large-data/grid-large-tree-data.vue (2)

46-46: LGTM! Consider extracting the repeated editor configuration.

The TinyDatePicker implementation is correct across all date columns. However, since the editor configuration is identical for all three columns, consider extracting it to reduce duplication.

You could define the editor configuration once and reuse it:

<script>
export default {
  // ... other code ...
  data() {
    return {
      TinyDatePicker,
+     dateEditorConfig: {
+       component: TinyDatePicker,
+       attrs: { format: 'yyyy-MM-dd', valueFormat: 'yyyy-MM-dd' }
+     },
      tableData: buildDatas()
    }
  }
}
</script>

<!-- In template -->
-      :editor="{ component: TinyDatePicker, attrs: { format: 'yyyy-MM-dd', valueFormat: 'yyyy-MM-dd' } }"
+      :editor="dateEditorConfig"

Also applies to: 51-51, 56-56


Line range hint 3-9: LGTM! Consider documenting the optimization settings.

The grid configuration is well-structured for handling large datasets. However, it would be helpful to document:

  • The purpose of the optimization parameters (rSize, vSize, adaptive)
  • The rationale behind the chosen values

Consider adding a comment block explaining these settings:

// Optimization settings for handling large tree data:
// - scrollX.gt: Enables horizontal virtual scrolling when columns > 15
// - scrollX.rSize: Renders 14 columns at a time
// - scrollY.rSize: Renders 20 rows at a time
// - adaptive: Disabled to maintain consistent rendering size
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 0fb2966 and ae29fbb.

📒 Files selected for processing (26)
  • examples/sites/demos/pc/app/color-picker/history-composition-api.vue (1 hunks)
  • examples/sites/demos/pc/app/color-picker/predefine-composition-api.vue (1 hunks)
  • examples/sites/demos/pc/app/color-select-panel/history-composition-api.vue (1 hunks)
  • examples/sites/demos/pc/app/color-select-panel/predefine-composition-api.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/editor/custom-editor-select-composition-api.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/editor/custom-editor-select.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/editor/mutil-render-composition-api.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/editor/mutil-render.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/editor/popeditor-in-grid-remote-search-composition-api.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/editor/popeditor-in-grid-remote-search.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/large-data/grid-large-tree-data-composition-api.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/large-data/grid-large-tree-data.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/renderer/async-colunm-render-composition-api.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/renderer/async-colunm-render.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/renderer/custom-renderer-composition-api.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/renderer/custom-renderer.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/validation/valid-config-composition-api.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/validation/valid-config.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/validation/validation-scroll-to-col-composition-api.vue (1 hunks)
  • examples/sites/demos/pc/app/grid/validation/validation-scroll-to-col.vue (1 hunks)
  • examples/sites/demos/pc/app/select/nest-grid-remote.spec.ts (1 hunks)
  • examples/sites/demos/pc/app/select/nest-grid-remote.vue (1 hunks)
  • examples/sites/demos/pc/app/select/nest-grid.spec.ts (1 hunks)
  • examples/sites/demos/pc/app/select/nest-radio-grid-much-data.spec.ts (1 hunks)
  • examples/sites/demos/pc/app/select/size.spec.ts (1 hunks)
  • examples/sites/demos/pc/app/slider/max-min.spec.ts (1 hunks)
🔇 Additional comments (29)
examples/sites/demos/pc/app/color-picker/history-composition-api.vue (2)

3-3: LGTM: ColorPicker component replacement is correct.

The migration to tiny-color-picker maintains the same functionality with proper v-model and history prop bindings.


5-6: LGTM: Button components properly migrated.

Both button components have been correctly replaced with tiny-button while maintaining their click event handlers.

examples/sites/demos/pc/app/color-picker/predefine-composition-api.vue (2)

Line range hint 1-29: Component implementation follows Vue best practices.

The component demonstrates good practices:

  • Proper use of composition API with <script setup>
  • Clean separation of template and logic
  • Reactive state management with ref
  • Well-structured utility functions

3-3: LGTM! Component migration looks correct.

The migration from standard components to tiny-prefixed versions (ColorPickertiny-color-picker, Buttontiny-button) has been implemented correctly, maintaining all props and event handlers.

Let's verify that all color picker demos follow the same migration pattern:

Also applies to: 5-6

✅ Verification successful

Migration verification complete - all components consistently using tiny prefix

The verification shows that all color picker demo files are consistently using the migrated components:

  • All instances use tiny-color-picker instead of ColorPicker
  • All instances use tiny-button instead of Button
  • Proper imports from '@opentiny/vue' are used throughout
  • No unmigrated components were found
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify consistent component migration across color picker demos
# Expect: All color picker demos should use tiny-color-picker and tiny-button

# Check for any remaining unmigrated components
rg -g '*/color-picker/*.vue' '<(ColorPicker|Button)\b'

# Verify the usage of migrated components
rg -g '*/color-picker/*.vue' '<tiny-(color-picker|button)\b'

Length of output: 417


Script:

#!/bin/bash
# Let's try a different approach using fd to find the files first
# and then use ripgrep on those files

# Find all color picker demo files
echo "Color picker demo files:"
fd -e vue color-picker

# Check for any remaining unmigrated components
echo -e "\nChecking for unmigrated components:"
fd -e vue color-picker --exec rg -l '<(ColorPicker|Button)\b' {}

# Verify the usage of migrated components
echo -e "\nChecking for migrated components:"
fd -e vue color-picker --exec rg -l '<tiny-(color-picker|button)\b' {}

Length of output: 397


Script:

#!/bin/bash
# Let's try searching from the examples directory specifically
# and use more relaxed patterns

echo "Finding Vue files in color-picker directory:"
cd examples || exit
find . -type f -name "*.vue" | grep "color-picker"

echo -e "\nChecking content of these files:"
find . -type f -name "*.vue" | grep "color-picker" | while read -r file; do
    echo -e "\n=== $file ==="
    cat "$file" | grep -E "(ColorPicker|Button|tiny-color-picker|tiny-button)"
done

Length of output: 8840

examples/sites/demos/pc/app/slider/max-min.spec.ts (1)

16-16: Verify the new slider value calculations.

The changes to the expected values (30 and 62) represent a significant change in how the slider calculates or displays values. Please ensure these new values align with the updated slider component's behavior.

Also applies to: 20-20

✅ Verification successful

Let me gather more information about the slider component and its test implementation.


The slider value assertions are correct and match the component configuration

The test assertions align perfectly with the slider component's configuration in max-min.vue:

  • The slider has a min value of 30 and max value of 70
  • When moved 30% left, showing '30' is correct as it's the minimum value
  • When moved 81% right, showing '62' is correct as it's within the configured range (30-70)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for related slider component changes that might explain the new value calculations

# Test: Look for slider component configuration or value calculation changes
rg -A 5 "slider.*props" examples/sites/demos/pc/app/slider/
rg -A 5 "min.*max.*value" examples/sites/demos/pc/app/slider/

Length of output: 626


Script:

#!/bin/bash
# Check the slider component test file and related component
cat examples/sites/demos/pc/app/slider/max-min.spec.ts
cat examples/sites/demos/pc/app/slider/max-min.vue

Length of output: 1312

examples/sites/demos/pc/app/color-select-panel/history-composition-api.vue (1)

7-13: LGTM! Component migration looks correct.

The migration from ColorSelectPanel to tiny-color-select-panel maintains all necessary props and event bindings.

Let's verify the component registration and props:

✅ Verification successful

Let me verify the component registration by checking the actual exports and component definition.


Component migration is correctly implemented

The verification confirms that:

  • The component is properly exported as ColorSelectPanel with the correct prefix in the source
  • The import in the demo file correctly uses TinyColorSelectPanel from @opentiny/vue
  • All props used in the template (modelValue, visible, alpha, history, predefine) are properly defined in the component
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Verify the component is properly exported from @opentiny/vue
rg -l "export.*TinyColorSelectPanel" 

# Check for any remaining old ColorSelectPanel usage
rg -l "ColorSelectPanel"

Length of output: 1597


Script:

#!/bin/bash
# Check the component export in the main index file
cat packages/vue/src/color-select-panel/index.ts

# Check the component implementation
cat packages/vue/src/color-select-panel/src/index.ts

# Verify if there are any references to the old component name in the template
rg "ColorSelectPanel" examples/sites/demos/pc/app/color-select-panel/history-composition-api.vue

Length of output: 1332

examples/sites/demos/pc/app/color-select-panel/predefine-composition-api.vue (2)

Line range hint 7-13: LGTM! Component tag updated correctly.

The migration to tiny-color-select-panel is implemented correctly with all necessary props and event bindings preserved.


Line range hint 17-18: Verify component registration in the consuming application.

The imports are correctly updated to use the standardized Tiny components. However, since this is part of a documentation update, ensure that the consuming application has these components registered and available.

✅ Verification successful

Component registration and imports are correctly updated and consistent

Based on the search results, the component is properly registered and imported across the codebase:

  • All demo files consistently use TinyColorSelectPanel from @opentiny/vue
  • The component is properly defined in the core packages with correct naming
  • Template usage consistently uses tiny-color-select-panel kebab-case naming
  • No legacy/outdated component references were found that need updating
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the component registration and imports across the codebase
# Look for any remaining old component references that might need updating

# Check for any remaining old ColorSelectPanel references
rg -l "ColorSelectPanel" --type vue

# Verify consistent usage of tiny-color-select-panel
rg -l "tiny-color-select-panel" --type vue

Length of output: 134


Script:

#!/bin/bash
# Let's try a different approach without relying on file type detection
# Search for ColorSelectPanel references
echo "=== Searching for ColorSelectPanel references ==="
rg "ColorSelectPanel"

# Search for tiny-color-select-panel references
echo -e "\n=== Searching for tiny-color-select-panel references ==="
rg "tiny-color-select-panel"

# Look for import statements related to color select panel
echo -e "\n=== Searching for related imports ==="
rg "import.*color.*select.*panel" -i

Length of output: 18429

examples/sites/demos/pc/app/select/nest-radio-grid-much-data.spec.ts (1)

26-26: LGTM: Class name change aligns with the new radio selection mechanism.

The update to check for row__radio class instead of row__selected correctly reflects the change in the selection mechanism for the grid rows.

examples/sites/demos/pc/app/select/size.spec.ts (2)

60-60: LGTM! Height assertion aligns with TODO comment.

The changed assertion correctly matches the expected height of 24px for mini size as indicated in the TODO comment.


Line range hint 24-26: Verify medium size height inconsistency.

The TODO comment indicates the height should be 32px, but the test expects 40px. This inconsistency should be resolved.

Let's verify the expected height for medium size inputs across the codebase:

examples/sites/demos/pc/app/grid/renderer/custom-renderer-composition-api.vue (2)

Line range hint 20-22: LGTM! Component setup follows best practices.

The component is properly configured with Vue 3 Composition API and includes the necessary imports from @opentiny/vue.


9-11: Verify consistent component usage across the codebase.

The change from Switch to TinySwitch aligns with the PR's standardization efforts. Let's verify this pattern is consistently applied across other grid renderers.

✅ Verification successful

Component usage is consistent with standardization

The verification shows that:

  • The grid renderer files consistently use TinySwitch component
  • No legacy Switch component usage found in grid renderers
  • Both custom-renderer.vue and custom-renderer-composition-api.vue use the standardized TinySwitch component
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for any remaining non-tiny switch components in grid renderers
# to ensure consistent migration

# Search for any remaining Switch components in grid renderer files
echo "Checking for non-migrated Switch components in grid renderers:"
rg -l 'component:\s*Switch' --type vue

# Search for TinySwitch usage to confirm the migration pattern
echo -e "\nVerifying TinySwitch usage pattern:"
rg -l 'component:\s*TinySwitch' --type vue

Length of output: 363


Script:

#!/bin/bash
# Let's try a different approach without file type filtering
# Search for any remaining Switch components in renderer contexts
echo "Checking for non-migrated Switch components in renderers:"
rg 'renderer.*component:\s*Switch'

# Search for TinySwitch usage to confirm the migration pattern
echo -e "\nVerifying TinySwitch usage pattern:"
rg 'renderer.*component:\s*TinySwitch'

# Also search for any import statements related to Switch components
echo -e "\nChecking Switch component imports:"
rg "import.*Switch.*from"

Length of output: 10794

examples/sites/demos/pc/app/grid/editor/custom-editor-select-composition-api.vue (1)

13-17: LGTM! The editor configuration is well-integrated.

The TinySelect editor is properly configured with:

  • Correct data binding through options
  • Proper field mappings (textField, valueField)
  • Consistent format configuration for enum display
examples/sites/demos/pc/app/grid/validation/valid-config.vue (1)

18-18: Verify TinyInput compatibility with validation rules.

The name field has specific validation rules (required and length constraints). Please ensure that TinyInput component properly triggers these validations.

✅ Verification successful

Based on the code analysis, I can now provide a definitive response about the TinyInput validation compatibility:

TinyInput component properly handles validation rules in grid context

The validation setup in the file is correctly configured:

  • The grid has proper validation configuration with valid-config and edit-rules
  • The name field has validation rules for required and length constraints
  • TinyInput is properly integrated as an editor component and will trigger these validations

This is verified by:

  • The validation rules are properly defined in the component's data:
validRules: {
  name: [
    { required: true, message: '名称必填' },
    { min: 3, max: 50, message: '名称长度在 3 到 50 个字符' }
  ]
}
  • The grid is configured with validation settings:
<tiny-grid
  :edit-config="{ trigger: 'click', mode: 'cell', showStatus: true }"
  :valid-config="{ message: 'inline' }"
  :edit-rules="validRules"
>
  • TinyInput is properly integrated as the editor component:
<tiny-grid-column field="name" title="名称" :editor="{ component: TinyInput }">
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for TinyInput validation tests or documentation
rg -A 5 "TinyInput.*validation|validation.*TinyInput" 

# Search for similar validation usage patterns
ast-grep --pattern 'tiny-grid-column :editor="{ component: TinyInput }" :valid-config="$_"'

Length of output: 149


Script:

#!/bin/bash
# Let's first check the validation configuration in the file
cat examples/sites/demos/pc/app/grid/validation/valid-config.vue

# Search for TinyInput implementation and validation handling
rg -g "*.{vue,js,ts}" "TinyInput" -B 2 -A 5

# Look for grid validation examples and documentation
rg -g "*.{vue,js,ts,md}" "grid.*validation|validation.*grid" -B 2 -A 5

Length of output: 281827

examples/sites/demos/pc/app/grid/editor/mutil-render-composition-api.vue (1)

Line range hint 14-20: LGTM! Verify e2e test coverage.

The change from Select to TinySelect is correct and maintains all necessary functionality. Since this is a demo file, ensure that any associated e2e tests have been updated to use the new component selectors.

✅ Verification successful

LGTM! No e2e test updates needed.

The found test file custom-service.spec.ts is for a different component (Area component) and not related to our grid editor demo. The test uses different selectors (.tiny-area) and tests different functionality. The change from Select to TinySelect in the grid editor demo is safe and doesn't impact any existing e2e tests.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for e2e tests that might need updating
rg -g "*.{spec,test}.{js,ts}" -l "Select.*area"

Length of output: 105


Script:

#!/bin/bash
# Check the content of the test file to see if it's related to our component
rg -A 5 -B 5 "Select.*area" examples/sites/demos/pc/app/area/custom-service.spec.ts

Length of output: 1207


Script:

#!/bin/bash
# Let's verify if this test file is actually related to our component by checking its imports and context
cat examples/sites/demos/pc/app/area/custom-service.spec.ts

Length of output: 1719

examples/sites/demos/pc/app/grid/renderer/async-colunm-render-composition-api.vue (3)

21-23: LGTM! Component migration looks correct.

The migration from Select to TinySelect is properly implemented with the necessary attributes maintained.


Line range hint 31-33: LGTM! Modern Vue 3 patterns are well implemented.

The script setup and imports are properly structured using Vue 3's composition API.


Line range hint 1-29: Verify the demo's effectiveness for async column rendering.

While the implementation is correct, ensure that this demo effectively demonstrates:

  1. Async data loading behavior
  2. Error states during data fetching
  3. Loading states for the select dropdown

Let's check for other async column render demos for consistency:

✅ Verification successful

Let me search for the component usage and related files to verify the async column rendering implementation. I'll also check for the presence of necessary props and handlers.


Based on the search results, I can now verify the async column rendering implementation. The code shows:

  1. The demo correctly implements async column rendering with:

    • is-async-column prop on TinyGrid component
    • format-config with async property on the city column
    • TinySelect component properly configured as the editor
    • Proper data fetching setup with options
  2. The implementation is consistent with other async column demos in the codebase, following the same pattern in:

    • async-colunm-render.vue
    • async-colunm-render-composition-api.vue
    • column-asyn-rendering.vue
    • column-asyn-rendering-composition-api.vue
  3. The demo effectively demonstrates:

    • Async data loading through format-config
    • Integration with TinySelect for editing
    • Proper state handling (loading, error states)

The demo implementation is correct and effectively showcases the async column rendering feature.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for other async column render examples
rg -l "is-async-column" --type vue

Length of output: 62


Script:

#!/bin/bash
# Search for files containing "is-async-column" without file type restriction
rg -l "is-async-column"

# Also search for similar async column demos
rg -l "async.*column" --type-list
rg -l "async.*column"

Length of output: 1625


Script:

#!/bin/bash
# Search for TinySelect component definition and usage
rg "TinySelect" -A 5 -B 5

# Look for format-config with async property
rg "format-config.*async" -A 5 -B 5

Length of output: 279393

examples/sites/demos/pc/app/grid/editor/custom-editor-select.vue (1)

14-15: LGTM! Verify component registration.

The TinySelect configuration is correctly implemented with proper options binding and field mappings.

Let's verify the component is properly registered across the codebase:

✅ Verification successful

The previous command failed because the file type wasn't recognized. Let's try these alternative approaches to verify the component registration and usage across the codebase. This will help us understand:

  1. Where TinySelect is being used
  2. What Vue files exist in the project
  3. How TinySelect is being imported

LGTM! TinySelect component is properly registered and used

The verification shows that:

  1. TinySelect is correctly imported from '@opentiny/vue'
  2. It is properly registered in the components section
  3. The component is used correctly in the template with appropriate props (options, textField, valueField)
  4. The format-config aligns with the editor configuration
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Verify TinySelect usage and registration
rg -l "TinySelect" --type vue

Length of output: 57


Script:

#!/bin/bash
# Let's try different approaches to find TinySelect usage
# 1. Search for TinySelect in all files
rg "TinySelect"

# 2. Find all Vue files first, then we can analyze them
fd -e vue

# 3. Look for import statements of TinySelect
rg "import.*TinySelect"

Length of output: 343597


Script:

#!/bin/bash
# Let's verify if TinySelect is imported and used in the file under review
rg -A 5 "TinySelect" examples/sites/demos/pc/app/grid/editor/custom-editor-select.vue

# Also check if there are any other files importing TinySelect from the same package
rg "from '@opentiny/vue-select'" 

Length of output: 1970

examples/sites/demos/pc/app/grid/validation/validation-scroll-to-col-composition-api.vue (2)

14-14: LGTM: Validation integration is properly maintained.

The change to TinyInput maintains compatibility with the existing validation system. The validation rules for the name field are well-defined and the integration looks solid.

Also applies to: 28-35


Line range hint 1-24: LGTM: Well-structured component implementation.

The component follows Vue Composition API best practices, with clean separation of concerns and proper implementation of the grid system. The integration of TinyInput maintains the component's structural integrity.

examples/sites/demos/pc/app/grid/editor/mutil-render.vue (2)

Line range hint 1-33: Grid implementation looks good!

The grid is well-structured with:

  • Proper cell editing configuration
  • Consistent editor implementations
  • Appropriate overflow handling
  • Clear column definitions

14-14: Verify consistent component migration across demos.

Let's ensure all Select components have been migrated to TinySelect in the demo files.

✅ Verification successful

Based on the results, I can generate the final response since we have clear evidence that:

  1. No instances of component: Select were found in the demos directory
  2. All files using component: TinySelect properly import it from '@opentiny/vue'

Component migration to TinySelect is complete and consistent

All Select components in the demo files have been properly migrated to TinySelect with correct imports from '@opentiny/vue'. No remaining non-migrated Select components were found.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for any remaining non-tiny Select components in demo files
echo "Checking for non-migrated Select components in demos..."
rg -l "component: Select" "examples/sites/demos"

# Verify TinySelect is properly imported where used
echo "Verifying TinySelect imports..."
rg -l "component: TinySelect" "examples/sites/demos" | xargs rg "import.*TinySelect.*from '@opentiny/vue'"

Length of output: 1215

examples/sites/demos/pc/app/grid/editor/popeditor-in-grid-remote-search.vue (1)

11-11: LGTM! Verify TinyPopeditor integration.

The migration from Popeditor to TinyPopeditor looks correct. The component is properly imported and configured with the necessary props for remote search and formatting.

Let's verify the component's integration and usage:

✅ Verification successful

Migration to TinyPopeditor is consistent and properly integrated

The verification shows that:

  1. The component is correctly imported from @opentiny/vue across all usage locations
  2. The migration from Popeditor to TinyPopeditor is consistent in both regular and composition API files
  3. The component is properly integrated in the grid editor with the correct props and configuration
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify TinyPopeditor usage and imports across the codebase
# Test 1: Check if there are any remaining references to the old Popeditor
rg -l 'Popeditor[^Tiny]' --type vue

# Test 2: Verify consistent usage of TinyPopeditor
rg -A 3 'TinyPopeditor' --type vue

Length of output: 128


Script:

#!/bin/bash
# Let's try without file type filtering since 'vue' type is not recognized
# Check for any remaining references to the old Popeditor
rg -l 'Popeditor[^Tiny]'

# Verify consistent usage of TinyPopeditor
rg -A 3 'TinyPopeditor'

# Check imports of TinyPopeditor
rg -l "import.*TinyPopeditor.*from.*@opentiny/vue"

Length of output: 47611

examples/sites/demos/pc/app/grid/renderer/async-colunm-render.vue (1)

21-23: LGTM! Verify TinySelect integration with async data loading.

The migration to TinySelect is properly configured with the required attributes and integrates correctly with the async format-config.

✅ Verification successful

TinySelect integration is consistent across grid components

The search results confirm that TinySelect is consistently used across the grid components, particularly in editor configurations. The component is properly imported from '@opentiny/vue' and used in similar editor configurations in multiple files, including async-column-render, custom-editor-select, and mutil-render variants. The implementation aligns with the migration to Tiny components.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Verify consistent usage of TinySelect across grid components
rg -l "component:\s*Select" "examples/sites/demos/pc/app/grid"

Length of output: 62


Script:

#!/bin/bash
# Let's try a broader search for Select components in grid-related files
rg -i "select.*component" "examples/sites/demos/pc/app/grid"

# Also search for TinySelect specifically
rg "TinySelect" "examples/sites/demos/pc/app/grid"

# Check imports related to Select components
rg "import.*Select" "examples/sites/demos/pc/app/grid"

Length of output: 4730

examples/sites/demos/pc/app/grid/validation/validation-scroll-to-col.vue (2)

14-14: LGTM! Component migration looks good.

The change from Input to TinyInput aligns with the component migration pattern and is properly imported.


14-14: Verify the validation behavior with TinyInput.

Since this is a validation demo, ensure that the TinyInput component properly triggers the validation rules defined for the name field.

✅ Verification successful

Let me search for test files and validation-related code to verify the behavior.


Let me search for validation-related code and test cases to verify the behavior.


Let me check the actual implementation to verify the validation configuration.


TinyInput validation configuration is properly implemented.

The code shows that TinyInput is correctly integrated with the grid's validation system:

  1. The name field using TinyInput has proper validation rules:
    • Required field validation
    • Length validation (3-50 characters)
  2. The validation is triggered through the grid's validate method
  3. The component is properly bound to the grid's edit-config and edit-rules system
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for any e2e tests that verify the validation behavior
rg -l "validation-scroll-to-col" --type=spec

Length of output: 193


Script:

#!/bin/bash
# Search for test files with a broader pattern
fd "test|spec|e2e" --type f

# Search for validation-related files
rg -l "validation.*scroll"

# Look for the component implementation
ast-grep --pattern 'const TinyInput = $_'

Length of output: 78611


Script:

#!/bin/bash
# Let's check the validation-scroll-to-col test and implementation
rg -A 10 "validation-scroll-to-col" examples/sites/demos/pc/app/grid/validation/validation-scroll-to-col.spec.js

# Look for TinyInput component usage in validation context
rg -A 5 "TinyInput.*validation" 

# Check the grid validation documentation
rg -A 10 "validation" examples/sites/demos/pc/app/grid/webdoc/grid-validation.js

Length of output: 7946


Script:

#!/bin/bash
# Let's check the actual implementation of validation-scroll-to-col demo
cat examples/sites/demos/pc/app/grid/validation/validation-scroll-to-col.vue

# Look for edit-rules configuration
rg -A 5 "edit-rules" examples/sites/demos/pc/app/grid/validation/validation-scroll-to-col.vue

Length of output: 5427

examples/sites/demos/pc/app/grid/large-data/grid-large-tree-data.vue (1)

Line range hint 134-147: Consider adding input validation for date fields in the template.

The template object contains hardcoded dates. While the format matches the editor's valueFormat, it would be safer to validate these dates or generate them dynamically.

Let's check if these date fields are used consistently across the codebase:

Comment on lines +3 to +6
<tiny-color-picker v-model="color" :history="history" />
<br />
<Button @click="addHistoryColor">Append history color</Button>
<Button @click="popHistoryColor">Pop history color</Button>
<tiny-button @click="addHistoryColor">Append history color</tiny-button>
<tiny-button @click="popHistoryColor">Pop history color</tiny-button>
Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

Tests need to be updated to cover history functionality

The current test file packages/vue/src/color-picker/__tests__/color-picker.spec.ts does not include any test cases for the history feature. The tests only cover basic functionality like color selection, visibility, and v-model handling. Since the component now supports history functionality with methods like addHistoryColor and popHistoryColor, corresponding test cases should be added.

  • Add test cases in packages/vue/src/color-picker/__tests__/color-picker.spec.ts to verify:
    • History prop functionality
    • addHistoryColor method behavior
    • popHistoryColor method behavior
    • History color selection interaction
🔗 Analysis chain

Verify e2e test coverage for the updated components.

Since this PR involves e2e test updates, ensure that the tests are updated to reflect the new component names and selectors.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for related e2e tests
rg -t js -t ts "color-picker.*history.*test" test/ -A 5

Length of output: 103


Script:

#!/bin/bash
# First, let's find the test directory location since it might not be under 'test/'
fd -t d -i "test|specs|e2e"

# Then search for any color picker related test files
fd -t f -e js -e ts -e vue ".*color.*picker.*" 

Length of output: 2983


Script:

#!/bin/bash
# Let's examine the color picker test file content to check for history-related tests
cat packages/vue/src/color-picker/__tests__/color-picker.spec.ts

Length of output: 2127

@@ -119,7 +119,7 @@ export default {
methods: {
remoteMethod(value) {
const filterData = this.filter(value)

console.log(filterData, value)
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Remove console.log statement from production code.

The added console.log statement appears to be for debugging purposes. Since this is a documentation demo, it should maintain clean console output for better developer experience.

- console.log(filterData, value)
📝 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
console.log(filterData, value)

Comment on lines 19 to 21
<tiny-grid-column field="area" title="区域" :editor="{ component: 'input' }"></tiny-grid-column>
<tiny-grid-column field="address" title="地址" :editor="{ component: 'input' }"></tiny-grid-column>
<tiny-grid-column field="introduction" title="公司简介" :editor="{ component: 'input' }"></tiny-grid-column>
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Consider using TinyInput consistently across all editable columns.

Currently, there's an inconsistency in how editor components are specified:

  • The 'name' column uses the TinyInput component reference
  • Other columns use the string 'input'

For better maintainability and consistency, consider using TinyInput for all editable columns.

      <tiny-grid-column field="name" title="名称" :editor="{ component: TinyInput }"></tiny-grid-column>
-     <tiny-grid-column field="area" title="区域" :editor="{ component: 'input' }"></tiny-grid-column>
-     <tiny-grid-column field="address" title="地址" :editor="{ component: 'input' }"></tiny-grid-column>
-     <tiny-grid-column field="introduction" title="公司简介" :editor="{ component: 'input' }"></tiny-grid-column>
+     <tiny-grid-column field="area" title="区域" :editor="{ component: TinyInput }"></tiny-grid-column>
+     <tiny-grid-column field="address" title="地址" :editor="{ component: TinyInput }"></tiny-grid-column>
+     <tiny-grid-column field="introduction" title="公司简介" :editor="{ component: TinyInput }"></tiny-grid-column>

Committable suggestion was skipped due to low confidence.

@@ -15,7 +15,7 @@
show-overflow="tooltip"
>
<tiny-grid-column type="index" width="60"></tiny-grid-column>
<tiny-grid-column field="name" title="名称" :editor="{ component: Input }"></tiny-grid-column>
<tiny-grid-column field="name" title="名称" :editor="{ component: TinyInput }"></tiny-grid-column>
Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

Inconsistent editor component usage across grid validation demos

The change to use TinyInput is only present in a few validation demos (valid-config and validation-scroll-to-col variants), while most other validation demos are using the string literal 'input' as the editor component. This inconsistency should be addressed:

  • valid-config.vue and valid-config-composition-api.vue: Uses TinyInput
  • validation-scroll-to-col.vue and its composition API variant: Uses TinyInput
  • All other validation demos use 'input':
    • before-submit-validation*.vue
    • editing-isvalidalways-validation*.vue
    • editing-validation*.vue
    • select-validation*.vue
    • custcomp*.vue
🔗 Analysis chain

LGTM! Verify validation behavior with TinyInput.

The change from Input to TinyInput aligns with the standardization effort. The validation rules for the name field are properly configured to work with the editor component.

Let's verify that other grid validation demos are consistently using TinyInput:


Let me analyze the results from the grid validation demos:

  1. valid-config-composition-api.vue and valid-config.vue consistently use TinyInput for the name field
  2. validation-scroll-to-col.vue and validation-scroll-to-col-composition-api.vue also use TinyInput for the name field
  3. However, custcomp.vue and custcomp-composition-api.vue use 'input' for the name field

Let me verify if these are all the grid validation demos and check their specific purposes:


Let me check the content of other validation demos to understand if they also use TinyInput:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for consistent usage of TinyInput in grid validation demos
# Expected: All grid validation demos should use TinyInput for consistency

rg -l "grid/validation" | xargs rg "editor.*Input" -A 1 -B 1

Length of output: 7089


Script:

#!/bin/bash
# List all grid validation demo files to ensure we haven't missed any
fd "validation.*vue" examples/sites/demos/pc/app/grid/validation/

# Check the purpose of custcomp demos by looking at their descriptions/comments
rg -B 5 -A 5 "title|description" examples/sites/demos/pc/app/grid/validation/custcomp*.vue

Length of output: 4793


Script:

#!/bin/bash
# Check editor components used in other validation demos
rg -A 1 -B 1 "editor.*component" examples/sites/demos/pc/app/grid/validation/before-submit-validation*.vue examples/sites/demos/pc/app/grid/validation/editing-isvalidalways-validation*.vue examples/sites/demos/pc/app/grid/validation/editing-validation*.vue examples/sites/demos/pc/app/grid/validation/select-validation*.vue

Length of output: 8645

Comment on lines +18 to 21
<tiny-grid-column field="name" title="名称" :editor="{ component: TinyInput }"></tiny-grid-column>
<tiny-grid-column field="area" title="区域" :editor="{ component: 'input' }"></tiny-grid-column>
<tiny-grid-column field="address" title="地址" :editor="{ component: 'input' }"></tiny-grid-column>
<tiny-grid-column field="introduction" title="公司简介" :editor="{ component: 'input' }"></tiny-grid-column>
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Maintain consistency in editor component declarations.

While the name field uses TinyInput component, other fields still use the string literal 'input'. Consider updating all editor components consistently.

Apply this change to maintain consistency:

      <tiny-grid-column field="name" title="名称" :editor="{ component: TinyInput }"></tiny-grid-column>
-     <tiny-grid-column field="area" title="区域" :editor="{ component: 'input' }"></tiny-grid-column>
-     <tiny-grid-column field="address" title="地址" :editor="{ component: 'input' }"></tiny-grid-column>
-     <tiny-grid-column field="introduction" title="公司简介" :editor="{ component: 'input' }"></tiny-grid-column>
+     <tiny-grid-column field="area" title="区域" :editor="{ component: TinyInput }"></tiny-grid-column>
+     <tiny-grid-column field="address" title="地址" :editor="{ component: TinyInput }"></tiny-grid-column>
+     <tiny-grid-column field="introduction" title="公司简介" :editor="{ component: TinyInput }"></tiny-grid-column>
📝 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
<tiny-grid-column field="name" title="名称" :editor="{ component: TinyInput }"></tiny-grid-column>
<tiny-grid-column field="area" title="区域" :editor="{ component: 'input' }"></tiny-grid-column>
<tiny-grid-column field="address" title="地址" :editor="{ component: 'input' }"></tiny-grid-column>
<tiny-grid-column field="introduction" title="公司简介" :editor="{ component: 'input' }"></tiny-grid-column>
<tiny-grid-column field="name" title="名称" :editor="{ component: TinyInput }"></tiny-grid-column>
<tiny-grid-column field="area" title="区域" :editor="{ component: TinyInput }"></tiny-grid-column>
<tiny-grid-column field="address" title="地址" :editor="{ component: TinyInput }"></tiny-grid-column>
<tiny-grid-column field="introduction" title="公司简介" :editor="{ component: TinyInput }"></tiny-grid-column>

@@ -8,7 +8,7 @@
<tiny-grid-column
field="id"
title="名称(Popeditor)"
:editor="{ component: Popeditor, attrs: getPopEditorOp }"
:editor="{ component: TinyPopeditor, attrs: getPopEditorOp }"
Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

Both demo files need to be updated for consistency

The regular version (popeditor-in-grid-remote-search.vue) is still using TinyPopeditor but in a different way - it's stored in the component's data. For consistency with the composition API version and modern Vue practices, it should be imported and used directly like in the composition API version.

  • examples/sites/demos/pc/app/grid/editor/popeditor-in-grid-remote-search.vue: Remove TinyPopeditor from data and use it directly in the template like the composition API version.
🔗 Analysis chain

LGTM! Please verify the demo functionality.

The change to use TinyPopeditor aligns with the component modernization effort. The integration looks correct with proper imports and maintained configuration.

Let's verify if any documentation updates are needed:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for any remaining references to the old "Popeditor" in documentation
rg -i "popeditor" --type=md --type=vue

# Check if there are any related demo files that might need similar updates
fd -e vue "popeditor.*\.vue$"

Length of output: 266


Script:

#!/bin/bash
# Let's check the content of both files to see if they are consistent
echo "=== Content of composition API file ==="
cat examples/sites/demos/pc/app/grid/editor/popeditor-in-grid-remote-search-composition-api.vue

echo -e "\n=== Content of regular file ==="
cat examples/sites/demos/pc/app/grid/editor/popeditor-in-grid-remote-search.vue

# Also check for any documentation references
rg -i "popeditor" --type=markdown

Length of output: 10621

@@ -11,7 +11,7 @@
field="area"
title="区域"
:editor="{
component: Select,
component: TinySelect,
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Move TinySelect to components registration.

The current implementation exposes TinySelect through data(), which is an unconventional pattern. Instead, register it in the components section for consistency and better maintainability.

export default {
  components: {
    TinyGrid,
-   TinyGridColumn
+   TinyGridColumn,
+   TinySelect
  },
  data() {
    return {
-     TinySelect,
      options: [
        { name: '华中区', id: '1' },
        // ...
      ],

Also applies to: 37-52

Comment on lines +14 to 16
<tiny-grid-column field="name" title="名称" width="460" :editor="{ component: TinyInput }"></tiny-grid-column>
<tiny-grid-column field="area" title="区域" width="460" :editor="{ component: 'input' }"></tiny-grid-column>
<tiny-grid-column field="address" title="地址" width="460" :editor="{ component: 'input' }"></tiny-grid-column>
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Consider standardizing editor components across columns.

While the name column uses the TinyInput component directly, other columns use the string literal 'input'. Consider standardizing this approach across all columns for consistency.

Apply this pattern to other columns:

-      <tiny-grid-column field="area" title="区域" width="460" :editor="{ component: 'input' }"></tiny-grid-column>
-      <tiny-grid-column field="address" title="地址" width="460" :editor="{ component: 'input' }"></tiny-grid-column>
-      <tiny-grid-column field="introduction" title="公司简介" width="460" :editor="{ component: 'input' }"></tiny-grid-column>
+      <tiny-grid-column field="area" title="区域" width="460" :editor="{ component: TinyInput }"></tiny-grid-column>
+      <tiny-grid-column field="address" title="地址" width="460" :editor="{ component: TinyInput }"></tiny-grid-column>
+      <tiny-grid-column field="introduction" title="公司简介" width="460" :editor="{ component: TinyInput }"></tiny-grid-column>

Committable suggestion was skipped due to low confidence.

@@ -28,7 +28,7 @@ test.describe('下拉表格远程搜索', () => {
const row2 = page.getByRole('row', { name: '省份2 城市2 区域2' })
await expect(row2).not.toBeVisible()
await row1.getByRole('cell').first().click()
await expect(row1).toHaveClass(/tiny-grid-body__row row__selected/)
await expect(row1).toHaveClass(/tiny-grid-body__row row__radio/)
Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

Inconsistent class names found in related test files

The verification reveals inconsistencies in the class naming across test files:

  • Files still using row__selected:
    • examples/sites/demos/pc/app/select/map-field.spec.ts
    • examples/sites/demos/pc/app/select/nest-grid.spec.ts (uses both old and new class names)
🔗 Analysis chain

LGTM! Verify similar class name changes across related tests.

The class name change from row__selected to row__radio is consistent with the component updates mentioned in the AI summary.

Let's verify if all related test files have been updated consistently:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for any remaining instances of the old class name in test files
rg -g "*.spec.ts" "row__selected"

# Search for the new class name pattern to ensure consistent usage
rg -g "*.spec.ts" "row__radio"

Length of output: 723

@zzcr zzcr merged commit c5a67e6 into release-3.19.0 Oct 28, 2024
10 of 16 checks passed
zzcr added a commit that referenced this pull request Oct 28, 2024
* fix(build): fix build error

* fix(docs): 增加上传文件类型说明 (#2439)

* fix(tag): update tag's size when only icon, update one place of  button's icon size (#2440)

* fix(date-picker): [date-picker,select] fix radius bugs for month-table (#2442)

* docs(site): fix demos and test e2e (#2444)

* test(site): fix icon not correct test e2e (#2445)

---------

Co-authored-by: chenxi-20 <2465950588@qq.com>
Co-authored-by: 申君健 <40288193@qq.com>
Co-authored-by: MomoPoppy <125256456+MomoPoppy@users.noreply.github.com>
Co-authored-by: gimmyhehe <975402925@qq.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants