Skip to content

fix: improve prompt component #5879

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

Merged
merged 2 commits into from
Apr 6, 2025
Merged

Conversation

mynetfan
Copy link
Collaborator

@mynetfan mynetfan commented Apr 6, 2025

Description

  1. 修复prompt创建的输入组件无法正确绑定值得问题;
  2. prompt支持传入组件插槽
  3. alert、confirm、prompt支持设置按钮对齐方式
  4. 默认情况下,只有prompt会在beforeClose回调期间,在内容区域显示loading遮罩

Type of change

Please delete options that are not relevant.

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update
  • Please, don't make changes to pnpm-lock.yaml unless you introduce a new test example.

Checklist

ℹ️ Check all checkboxes - this will indicate that you have done everything in accordance with the rules in CONTRIBUTING.

  • If you introduce new functionality, document it. You can run documentation with pnpm run docs:dev command.
  • Run the tests with pnpm test.
  • Changes in changelog are generated from PR name. Please, make sure that it explains your changes in an understandable manner. Please, prefix changeset messages with feat:, fix:, perf:, docs:, or chore:.
  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

Summary by CodeRabbit

  • New Features

    • Enhanced alert dialogs now offer customizable button alignment and conditional loading indications during processing.
    • Interactive prompt dialogs have been improved with flexible input components and asynchronous confirmation, providing smoother user interaction.
  • Documentation

    • Demos and usage instructions have been updated to showcase these refined alert and prompt capabilities.

@mynetfan mynetfan requested review from anncwb, vince292007, jinmao88 and a team as code owners April 6, 2025 17:07
Copy link
Contributor

coderabbitai bot commented Apr 6, 2025

Walkthrough

The pull request introduces enhancements to the alert system across documentation, demo components, and core UI-kit modules. It updates the type definitions by adding properties (buttonAlign and contentMasking) to the alert configuration and introduces a new prompt type (PromptProps) with extended options for user input. Additionally, demo components are modified to use updated UI components (switching from Empty to Result and from VbenSelect to Input), while asynchronous prompt handling and dynamic content rendering with improved focus management are implemented in the core builder and alert component.

Changes

Affected Files Summary of Changes
docs/.../common-ui/vben-alert.md
packages/@core/ui-kit/popup-ui/src/alert/alert.ts
Updated type definitions: Added optional properties buttonAlign (`'center'
docs/.../vben-alert/alert/index.vue Replaced the imported Empty component with Result. Modified the alert rendering to include buttonAlign: 'center' and a detailed content structure using Result with updated success message and order creation details.
docs/.../vben-alert/prompt/index.vue Changed prompt dialogs: Replaced VbenSelect with the Input component and added properties like placeholder, prefix, and type. Introduced componentSlots for rendering an icon. Added a new function showAsyncPrompt with an asynchronous beforeClose hook that verifies user input before closing the prompt, along with updated alert messages and button labels.
packages/@core/ui-kit/popup-ui/src/alert/AlertBuilder.ts Updated the vbenPrompt function by changing its parameter type to PromptProps<T>. Introduced a dynamic contentRenderer function for flexible content rendering. Enhanced focus management in the onOpened lifecycle method to correctly set focus on input elements using the new componentSlots mechanism.
packages/@core/ui-kit/popup-ui/src/alert/alert.vue Added a new buttonAlign prop with a default value of 'end'. Adjusted conditional rendering of the VbenLoading component to check both loading and contentMasking. Updated the class binding for the button container to reflect the dynamic alignment based on the buttonAlign property.

Sequence Diagram(s)

sequenceDiagram
    participant U as User
    participant P as PromptComponent
    participant F as showAsyncPrompt Function
    participant B as beforeClose Hook
    participant S as Async Operation

    U->>P: Click "Async Prompt" button
    P->>F: Trigger showAsyncPrompt()
    F->>B: Execute beforeClose hook with user input
    alt Valid value provided
        B-->>F: Return with valid input
        F->>S: Simulate async delay
        S-->>F: Async process complete
        F->>P: Close prompt successfully
    else No value provided
        B-->>F: Return without valid input
        F->>U: Alert "Select an option"
        F->>P: Keep prompt open
    end
Loading
sequenceDiagram
    participant U as User
    participant V as vbenPrompt Function
    participant R as ContentRenderer
    participant M as Focus Manager

    U->>V: Request prompt display
    V->>R: Call dynamic contentRenderer
    R-->>V: Render input component and content
    V->>M: Invoke onOpened to set focus
    M-->>V: Focus applied
    V->>U: Display updated alert/prompt view
Loading

Poem

I'm a little rabbit with code in my paws,
Hopping through change logs without any flaws.
Alerts aligned neatly, prompts now so smart,
Async and dynamic, a true work of art.
In every line and function, our code leaps high—
A joyful dance of updates under a techy sky!
🐇🌟

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.

Scope: all 5 workspace projects
 WARN  GET http://10.0.0.28:4873/turbo error (503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/prettier error (503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/vite/-/vite-6.2.4.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/vitest/-/vitest-2.1.9.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/vue/-/vue-3.5.13.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/typescript error (503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/unbuild/-/unbuild-3.5.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/eslint-config-turbo/-/eslint-config-turbo-2.4.4.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/@types/eslint/-/eslint-9.6.1.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/@typescript-eslint/parser/-/parser-8.29.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/@playwright/test/-/test-1.51.1.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/@eslint/js/-/js-9.23.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/eslint-plugin-import-x/-/eslint-plugin-import-x-4.10.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/eslint-plugin-command/-/eslint-plugin-command-0.2.7.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/eslint/-/eslint-9.23.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/turbo error (503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/prettier error (503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/unbuild/-/unbuild-3.5.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/vite/-/vite-6.2.4.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/vitest/-/vitest-2.1.9.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/vue/-/vue-3.5.13.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/@eslint/js/-/js-9.23.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/@playwright/test/-/test-1.51.1.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/@typescript-eslint/parser/-/parser-8.29.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/@types/eslint/-/eslint-9.6.1.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/typescript error (503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/eslint-plugin-import-x/-/eslint-plugin-import-x-4.10.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/eslint-config-turbo/-/eslint-config-turbo-2.4.4.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/eslint/-/eslint-9.23.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/eslint-plugin-command/-/eslint-plugin-command-0.2.7.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 1 minute. 1 retries left.
 WARN  GET http://10.0.0.28:4873/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.9.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/eslint-plugin-n/-/eslint-plugin-n-17.17.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
 WARN  GET http://10.0.0.28:4873/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz error (ERR_PNPM_FETCH_503). Will retry in 10 seconds. 2 retries left.
/tmp/eslint/internal/lint-configs/eslint-config:
 ERR_PNPM_FETCH_503  GET http://10.0.0.28:4873/prettier: Service Unavailable - 503

This error happened while installing a direct dependency of /tmp/eslint/internal/lint-configs/eslint-config


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cde35e0 and 766ae32.

📒 Files selected for processing (2)
  • packages/@core/ui-kit/popup-ui/src/alert/alert.ts (3 hunks)
  • packages/@core/ui-kit/popup-ui/src/alert/alert.vue (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/@core/ui-kit/popup-ui/src/alert/alert.vue
  • packages/@core/ui-kit/popup-ui/src/alert/alert.ts
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: post-update (ubuntu-latest)
  • GitHub Check: post-update (windows-latest)
  • GitHub Check: Lint (windows-latest)
  • GitHub Check: Check (windows-latest)

🪧 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 generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai plan to trigger planning for file edits and PR creation.
  • @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: 0

🧹 Nitpick comments (2)
packages/@core/ui-kit/popup-ui/src/alert/AlertBuilder.ts (1)

1-7: Update to imports looks good, but could be better organized.

The added imports support the enhanced functionality for the prompt component. Consider organizing imports by sorting alphabetically within each import group for better maintainability.

-import type { Component, VNode } from 'vue';
-import type { Recordable } from '@vben-core/typings';
-import type { AlertProps, BeforeCloseScope, PromptProps } from './alert';
-import { h, nextTick, ref, render } from 'vue';
+import type { Component, VNode } from 'vue';
+import type { Recordable } from '@vben-core/typings';
+import type { AlertProps, BeforeCloseScope, PromptProps } from './alert';
+
+import { h, nextTick, ref, render } from 'vue';
docs/src/demos/vben-alert/prompt/index.vue (1)

40-43: Add JSDoc comment to utility function.

The sleep utility function should have a JSDoc comment explaining its purpose and parameters for better code documentation.

+/**
+ * Creates a promise that resolves after the specified delay
+ * @param ms Delay in milliseconds
+ * @returns Promise that resolves after the delay
+ */
function sleep(ms: number) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d216fdc and cde35e0.

📒 Files selected for processing (6)
  • docs/src/components/common-ui/vben-alert.md (3 hunks)
  • docs/src/demos/vben-alert/alert/index.vue (2 hunks)
  • docs/src/demos/vben-alert/prompt/index.vue (2 hunks)
  • packages/@core/ui-kit/popup-ui/src/alert/AlertBuilder.ts (3 hunks)
  • packages/@core/ui-kit/popup-ui/src/alert/alert.ts (3 hunks)
  • packages/@core/ui-kit/popup-ui/src/alert/alert.vue (2 hunks)
🧰 Additional context used
🧬 Code Definitions (1)
packages/@core/ui-kit/popup-ui/src/alert/AlertBuilder.ts (1)
packages/@core/ui-kit/popup-ui/src/alert/alert.ts (1)
  • PromptProps (43-63)
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: Test (windows-latest)
  • GitHub Check: Lint (windows-latest)
  • GitHub Check: post-update (ubuntu-latest)
  • GitHub Check: post-update (windows-latest)
🔇 Additional comments (24)
docs/src/demos/vben-alert/alert/index.vue (2)

6-6: Import change from Empty to Result component.

The update from importing Empty to Result component from ant-design-vue enhances the alert demo's visual presentation, providing more comprehensive feedback to users.


21-26: Enhancement to alert presentation.

Good improvement to the alert customization by:

  1. Adding button alignment configuration with buttonAlign: 'center'
  2. Using the Result component with success status and descriptive titles
  3. Providing more informative feedback to users with order ID information

This change aligns well with the PR objective to allow configuration of button alignment.

packages/@core/ui-kit/popup-ui/src/alert/alert.vue (3)

33-33: Default button alignment added.

Added default value of 'right' for buttonAlign property, which maintains backward compatibility while introducing the new alignment feature.


158-158: Conditional loading mask.

Modified the loading condition to check for both loading and contentMasking, ensuring the loading overlay is displayed only when explicitly requested. This supports the PR objective to make the loading overlay configurable and only show it for the prompt by default.


160-160: Dynamic button alignment.

Updated the button container class to dynamically use the buttonAlign property, allowing for flexible button positioning within the alert dialog.

packages/@core/ui-kit/popup-ui/src/alert/alert.ts (4)

1-3: Import type additions.

Added import for VNode and VNodeArrayChildren types, which are necessary for the new componentSlots property in PromptProps.


18-19: Button alignment option.

Added buttonAlign property to AlertProps with appropriate type definition, supporting the alignment of buttons as 'center', 'end', or 'start'.


32-33: Content masking configuration.

Added contentMasking property to AlertProps, allowing control over whether a loading mask is displayed in the content area during the execution of the beforeClose callback.


42-63: New PromptProps type.

Created a comprehensive PromptProps type that extends AlertProps with additional properties for handling user input:

  • Enhanced beforeClose callback with value parameter
  • Component selection for user input
  • Component props and slots support
  • Default value configuration
  • Model property name customization

This addresses the PR objective to improve the prompt component and fix value binding issues.

docs/src/components/common-ui/vben-alert.md (4)

46-48: Improved type documentation.

Enhanced the JSDoc comment for AlertProps to improve clarity of the type definition.


56-57: Button alignment documentation.

Added documentation for the new buttonAlign property in AlertProps, clearly defining its purpose and available options.


70-71: Content masking documentation.

Added documentation for the new contentMasking property, explaining its purpose to show a loading mask during the beforeClose callback execution.


80-97: PromptProps documentation.

Added comprehensive documentation for the new PromptProps type, including:

  • Enhanced beforeClose callback with value parameter
  • Component selection for user input
  • Component props and slots support
  • Default value configuration
  • Model property name customization

This documentation aligns with the implementation and provides clear guidance on how to use the enhanced prompt functionality.

packages/@core/ui-kit/popup-ui/src/alert/AlertBuilder.ts (7)

132-134: Good addition of generic type parameter.

Using a generic type parameter <T = any> with PromptProps<T> improves type safety for the function by allowing consumers to specify the expected return type.


136-144: Proper destructuring of new props.

The expanded destructuring now correctly handles the new componentSlots property, which enables slot support in prompt components.


146-147: Good addition of refs for tracking component state.

Using refs to track the input component allows for accessing it later in lifecycle hooks, which is needed for focus management.


159-183: Good implementation of dynamic content rendering.

The content renderer function is a significant improvement that enables:

  1. Reactive updates to the input component
  2. Proper two-way binding via the modelPropName
  3. Support for custom slots through componentSlots
  4. Consistent layout with flex container

This approach is more flexible than the previous static content array.


198-231: Comprehensive focus management improvement.

The enhanced onOpened callback significantly improves accessibility by attempting multiple strategies to focus the input component:

  1. First tries component's exposed focus method
  2. Then attempts element's native focus if it's a standard form element
  3. Falls back to querySelector for finding focusable elements
  4. Finally tries nextElementSibling as a last resort

This ensures better keyboard navigation and accessibility compliance.


196-197:

❓ Verification inconclusive

New contentMasking feature might affect existing behavior.

Setting contentMasking: true by default for prompts means they'll show a loading overlay during async operations. While this is a useful addition, it's a behavior change that could affect existing implementations.

Make sure this behavior change is documented and doesn't negatively impact existing usages:


🌐 Web query:

What is the best practice for displaying loading states during async form submissions?

💡 Result:

To ensure a smooth user experience during async form submissions, follow these best practices for displaying loading states:

Provide Immediate Visual Feedback

  • Use loading spinners/progress bars to indicate ongoing processes[6][9]
  • Disable submit buttons to prevent duplicate submissions[1][3][10]
<button type="submit" disabled={isPending}>
  {isPending ? "Submitting..." : "Submit"}
</button>

Leverage React Hooks for State Management

  • useActionState for tracking submission status[1][2]
const [state, formAction, isPending] = useActionState(async (prevState, formData) => {
  // Submission logic
}, null);
  • useFormStatus in child components for form status[1][2]
function SubmitButton() {
  const { pending } = useFormStatus();
  return <button disabled={pending}>{pending ? "Sending..." : "Send"}</button>;
}

Maintain UI Responsiveness

  • Disable form fields during submission[3][10]
  • Preserve focus for keyboard/screen reader users[3][6]
  • Show skeleton screens for content-heavy forms[6]

Implement Accessible Feedback

  • ARIA live regions for screen readers[6][9]
  • Text status updates alongside visual indicators[3][6]
<div aria-live="polite">
  {isPending && "Processing your submission..."}
</div>

Handle Edge Cases Gracefully

  • Error states with clear recovery options[3][6]
  • Optimistic UI updates for instant feedback[1][2]
  • Request timeouts with retry mechanisms[3][6]

Framework-Specific Solutions

For React applications:

// Combined hook usage example
function Form() {
  const [state, formAction] = useActionState(submitForm);
  const { pending } = useFormStatus();

  return (
    <form action={formAction}>
      <input name="email" />
      <button disabled={pending}>
        {pending ? <LoadingSpinner /> : "Submit"}
      </button>
    </form>
  );
}

These practices balance technical implementation with UX considerations, ensuring forms remain usable and informative during async operations while preventing invalid submissions[1][2][6][10].

Citations:


Documentation & Impact Verification for contentMasking Default

Setting contentMasking: true now causes prompts to display a loading overlay during async operations—providing immediate visual feedback in line with best practices (e.g., using spinners or progress indicators). However, this behavior change may affect existing implementations that rely on the previous behavior.

  • Action Items:
    • Ensure that the new behavior is clearly documented in the component’s documentation.
    • Verify that current usages of AlertBuilder handle the loading overlay appropriately and that the new visual feedback doesn’t inadvertently disrupt the user experience.
  content: contentRenderer,
- contentMasking: false,
+ contentMasking: true,

149-153:

❓ Verification inconclusive

Check whether this preserves existing behavior.

The handling of static content has changed. Make sure that existing prompt usage with string content still renders correctly.


🏁 Script executed:

#!/bin/bash
# Check if the string content rendering is tested in existing tests
rg -A 5 "vbenPrompt.*content: ('|\").*('|\")" --type ts

Length of output: 61


Below is an additional verification step to help confirm that the changes in static content handling (specifically rendering string content as a span node) still behave as expected. The previous automated search produced no output, so we need to manually verify that tests exist—or if none do, that manual testing confirms that prompt usage with plain strings continues to work as intended.

Please run this additional shell script:

If these searches still produce no results, please manually verify that passing a string to the alert (via vbenPrompt or similar usage) indeed renders the string inside a element using the AlertBuilder logic in packages/@core/ui-kit/popup-ui/src/alert/AlertBuilder.ts.

Manual Verification Required:

  • Confirm that the behavior for string content (i.e. h('span', content)) has not changed.
  • Ensure that existing UI prompts that rely on string content still render correctly.

🏁 Script executed:

#!/bin/bash
# Search for test cases referencing AlertBuilder and the specific rendering of string content.
rg -n "AlertBuilder" --type ts --glob "*test*"
rg -n "staticContents.push\\(h\\('span'" --type ts

Length of output: 331


Static Content Rendering Verification

The code change appears to preserve the intended behavior—string content is wrapped in a <span> (via h('span', content)) before being pushed to staticContents. Our search confirms that the updated logic exists in AlertBuilder.ts (line 150). However, we didn't locate clear test cases explicitly verifying how string content is rendered via usage of directives like vbenPrompt.

Action Items:

  • Manual Verification: Please ensure that any prompt using plain string content continues to render correctly (i.e., as a <span> element) in the UI.
  • Test Coverage: If this behavior isn’t already covered, consider adding tests to validate that string-based content is rendered as expected by AlertBuilder.
docs/src/demos/vben-alert/prompt/index.vue (4)

2-8: Good addition of required imports.

The added imports support the new functionality:

  • h function for rendering component slots
  • Input and RadioGroup from ant-design-vue for form components
  • BadgeJapaneseYen icon for visual enhancement

21-38: Component upgrade with slot support demonstrates new capabilities.

The updated showSelectPrompt function showcases the new component slot functionality:

  1. Switched from VbenSelect to Input for better user experience
  2. Added helpful properties like placeholder and prefix
  3. Demonstrates the new componentSlots feature with a currency icon
  4. Provides a descriptive content message explaining the example

This is a good example for documentation purposes.


44-74: Good demonstration of async prompt with loading state.

The showAsyncPrompt function effectively demonstrates:

  1. Async validation in the beforeClose hook
  2. Prevention of dialog closing with return false
  3. Simulated async operation with loading state
  4. User feedback with alerts for validation errors
  5. Usage of the RadioGroup component with custom styling

This comprehensively showcases the new async capabilities of the prompt component.

However, there's a console.log statement that should be removed:

function showAsyncPrompt() {
  prompt({
    async beforeClose(scope) {
-      console.log(scope);
      if (scope.isConfirm) {
        if (scope.value) {
          // 模拟异步操作,如果不成功,可以返回false
          await sleep(2000);
        } else {
          alert('请选择一个选项');
          return false;
        }
      }
    },
    // Rest of the function...

78-79: Clear button labels to demonstrate different prompt types.

The button labels clearly indicate the purpose of each example, making the demo more user-friendly:

  • "Prompt" for basic text input
  • "Prompt With Select" for demonstrating component slots
  • "Prompt With Async" for showcasing async validation

@mynetfan mynetfan merged commit 71e8d12 into vbenjs:main Apr 6, 2025
14 checks passed
@mynetfan mynetfan deleted the fix/prompt-component branch April 6, 2025 17:21
YuchenWell added a commit to YuchenWell/vue-vben-admin that referenced this pull request Apr 19, 2025
Squashed commit of the following:

commit 79de6bc
Author: Netfan <[email protected]>
Date:   Thu Apr 17 22:23:05 2025 +0800

    fix: alert send wrong confirm state to beforeClose (vbenjs#5991)

    * 修复alert在按下Esc或者点击遮罩关闭时,可能发送错误的isConfirm状态

commit 14bd6dd
Author: Netfan <[email protected]>
Date:   Thu Apr 17 20:25:49 2025 +0800

    fix: destroyOnClose works within connectedComponent (vbenjs#5989)

    * 修复destroyOnClose没能销毁connectedComponent自身的问题

commit 7f269e0
Author: PIPEDREA_WZJ <[email protected]>
Date:   Thu Apr 17 14:01:39 2025 +0800

    Update tailwindcss.md (vbenjs#5602)

    tailwindcss最新的版本已经是v4.x,vben中使用的是3.x的tailwindcss。在未进行兼容前,会出现运行失败的问题

commit 4baec83
Author: yuh <[email protected]>
Date:   Thu Apr 17 14:00:46 2025 +0800

    feat: add examples: form-upload (vbenjs#5955)

    * feat: add examples: form-upload

    * fix: upload: accept and label

    * fix: upload: 设置表单值、图片预览

commit f7a4d13
Author: Netfan <[email protected]>
Date:   Wed Apr 16 14:11:04 2025 +0800

    fix: fixed arguments of callbacks in `formApi` (vbenjs#5970)

    * 修复 `handleValuesChange` 传递的参数不是处理后的表单值的问题

    * 修复 `handleReset` 未能传递正确参数的问题

commit 0936861
Author: Netfan <[email protected]>
Date:   Wed Apr 16 11:29:01 2025 +0800

    feat:  pass `fieldsChanged`  into the `handleValuesChange` callback function (vbenjs#5968)

    * fieldsChanged(已被改变值的字段名)将传入handleValuesChange回调函数

commit 3318d76
Author: ming4762 <[email protected]>
Date:   Wed Apr 16 11:28:36 2025 +0800

    perf: improve `destroyOnClose` for VbenModal (vbenjs#5964)

commit 8f3881e
Author: LinaBell <[email protected]>
Date:   Wed Apr 16 11:27:13 2025 +0800

    perf: `beforeClose` of drawer support promise (vbenjs#5932)

    * perf: the beforeClose function of drawer is consistent with that of modal

    * refactor: drawer test update

commit 5252480
Author: zhouda1fu <[email protected]>
Date:   Wed Apr 16 11:22:59 2025 +0800

    fix: missing await in department form(vbenjs#5967)

commit d18f561
Author: Netfan <[email protected]>
Date:   Tue Apr 15 20:52:23 2025 +0800

    docs: update alert and apiComponent docs (vbenjs#5961)

commit 333998b
Author: wyc001122 <[email protected]>
Date:   Tue Apr 15 20:51:38 2025 +0800

    fix: determine if scrollbar has been totally scrolled (vbenjs#5934)

    * 修复在系统屏幕缩放比例不为100%的情况下,滚动组件对是否已滚动到边界的判断可能不正确的问题

commit 3fb4fba
Author: ming4762 <[email protected]>
Date:   Tue Apr 15 18:49:57 2025 +0800

    fix: modal closing animation (vbenjs#5960)

commit c7e6210
Author: ming4762 <[email protected]>
Date:   Tue Apr 15 16:04:44 2025 +0800

    feat: `modal`&`drawer` support `center-footer` slot (vbenjs#5956)

commit d864085
Author: lztb <[email protected]>
Date:   Tue Apr 15 16:03:20 2025 +0800

    feat: vben-form添加arrayToStringFields属性 (vbenjs#5957)

    * feat: vben-form添加arrayToStringFields属性

    * feat: 修改handleArrayToStringFields和handleStringToArrayFields中嵌套数组格式的处理不一致

    ---------

    Co-authored-by: 米山 <[email protected]>

commit fcdc1a1
Author: Netfan <[email protected]>
Date:   Tue Apr 15 15:32:30 2025 +0800

    feat: add more expose methods for `apiComponent` (vbenjs#5958)

    * 为ApiComponent组件添加getOptions和getValue导出方法。

commit bf7496f
Author: Netfan <[email protected]>
Date:   Tue Apr 15 00:00:05 2025 +0800

    feat: add `useAlertContext` for Alert component (vbenjs#5947)

    * 新增Alert的子组件中获取弹窗上下文的能力

commit 9700150
Author: Netfan <[email protected]>
Date:   Mon Apr 14 19:56:52 2025 +0800

    fix: table actions in fixed column (vbenjs#5945)

commit f0e9e55
Author: Netfan <[email protected]>
Date:   Mon Apr 14 11:48:21 2025 +0800

    feat: alert support customize `footer` (vbenjs#5940)

    * Alert组件支持自定义footer

commit ff88274
Author: Netfan <[email protected]>
Date:   Mon Apr 14 11:18:33 2025 +0800

    fix: long navigation menu can be scrolled (vbenjs#5939)

    * 修复超长的导航菜单无法纵向滚动的问题

commit afce9dc
Author: ming4762 <[email protected]>
Date:   Sun Apr 13 23:02:07 2025 +0800

    perf: improve `destroyOnClose` for `VbenModal` (vbenjs#5935)

    * perf: 优化Vben Modal destroyOnClose,解决destroyOnClose=false,Modal依旧会被销毁的问题

    影响范围(重要):destroyOnClose默认为true,这会导致所有的modal都会默认渲染到body
    radix-vue Dialog组件默认会销毁挂载的组件,所以即使destroyOnClose=false,Modal依旧会被销毁的问题
    对于一些大表单重复渲染导致卡顿,ApiComponent也会频繁的加载数据

    * fix: modal closing animation

    ---------

    Co-authored-by: Netfan <[email protected]>

commit b5700bd
Author: ming4762 <[email protected]>
Date:   Sun Apr 13 20:03:18 2025 +0800

    perf: improve `autoSelect` of  `ApiComponent` (vbenjs#5936)

    * fix: 修复autoSelect不生效的问题,props.valueField已经被omit了

    * feat: ApiComponent autoSelect支持使用函数,可以满足灵活性要求更高的场景

commit a8c4786
Author: Netfan <[email protected]>
Date:   Sat Apr 12 14:02:35 2025 +0800

    feat: api-component support autoSelect prop (vbenjs#5931)

    * feat: api-component support autoSelect prop

    * docs: add version requirement

commit 2971ccc
Author: Netfan <[email protected]>
Date:   Sat Apr 12 13:41:40 2025 +0800

    docs: docs modal z-index fixed, update alert docs (vbenjs#5930)

commit 4a2c7b3
Author: Netfan <[email protected]>
Date:   Sat Apr 12 10:37:47 2025 +0800

    fix: alert animation (vbenjs#5927)

commit 36bf6fc
Author: Netfan <[email protected]>
Date:   Sat Apr 12 01:44:08 2025 +0800

    fix: builtin color change throttled in preference drawer (vbenjs#5924)

    修复偏好设置中的自定义主题色拖动选择颜色时页面会明显卡顿的问题

commit f46ec30
Author: Netfan <[email protected]>
Date:   Sat Apr 12 01:16:57 2025 +0800

    fix: theme mode follow the system only `auto` (vbenjs#5923)

    * 修复主题在未设置为auto时,仍然会跟随系统主题变化的问题。

commit 9bd5a19
Author: Netfan <[email protected]>
Date:   Sat Apr 12 00:59:56 2025 +0800

    fix: alert action button  focus, fixed vbenjs#5921 (vbenjs#5922)

    * 修复Alert组件的按钮焦点切换问题

commit 86da3ce
Author: zhang <[email protected]>
Date:   Wed Apr 9 16:16:56 2025 +0800

    chore: 导出框架自带的组件,方便独立页面使用 (vbenjs#5876)

commit 329a176
Author: Netfan <[email protected]>
Date:   Wed Apr 9 01:05:20 2025 +0800

    perf:  optimize bootstrap modules to speed up first-screen loading (vbenjs#5899)

    优化首屏加载速度

commit 9379093
Author: Netfan <[email protected]>
Date:   Tue Apr 8 20:28:50 2025 +0800

    feat: customizable table separator (vbenjs#5898)

    * 表格的分隔条支持定制背景色或完全移除

commit c9014d0
Author: ming4762 <[email protected]>
Date:   Tue Apr 8 20:27:03 2025 +0800

    perf: 优化关闭页面切换动画的tab切换性能 (vbenjs#5883)

commit ed26dca
Author: Netfan <[email protected]>
Date:   Tue Apr 8 16:31:41 2025 +0800

    chore: update pnpm-lock.yaml

commit 08c6496
Author: Netfan <[email protected]>
Date:   Tue Apr 8 14:56:40 2025 +0800

    chore: update deps

commit a8c5df3
Author: Netfan <[email protected]>
Date:   Tue Apr 8 14:50:05 2025 +0800

    fix: possible circular reference issue during build (vbenjs#5894)

    * 修复构建期间出现的循环引用警告

commit 71e8d12
Author: Netfan <[email protected]>
Date:   Mon Apr 7 01:21:30 2025 +0800

    fix: improve prompt component (vbenjs#5879)

    * fix: prompt component render fixed

    * fix: alert buttonAlign default value

commit d216fdc
Author: Netfan <[email protected]>
Date:   Sat Apr 5 13:07:52 2025 +0800

    feat: support logo text slot (vbenjs#5872)

    * 基础布局中的LOGO的文字区域允许通过插槽logo-text定制

commit 384c5d7
Author: wyc001122 <[email protected]>
Date:   Sat Apr 5 11:04:59 2025 +0800

    fix: 布局为双列菜单或者水平模式下, 一级菜单高亮问题 (vbenjs#5870)

    Co-authored-by: 王泳超 <[email protected]>

commit b0ad08d
Author: Netfan <[email protected]>
Date:   Fri Apr 4 15:21:09 2025 +0800

    feat: use the not-found component instead of the invalid route component in the backend mode (vbenjs#5871)

    * 后端菜单模式下,使用not-found组件代替无效的路由组件
YuchenWell added a commit to YuchenWell/vue-vben-admin that referenced this pull request Apr 23, 2025
Squashed commit of the following:

commit 1437770
Author: Netfan <[email protected]>
Date:   Wed Apr 23 12:20:52 2025 +0800

    fix: alert confirm state in beforeClose callback (vbenjs#6019)

commit b985ff0
Author: pangyajun123 <[email protected]>
Date:   Mon Apr 21 19:15:05 2025 +0800

    fix: vxe-table theme token follow primary color (vbenjs#6007)

commit b148b8e
Author: wyc001122 <[email protected]>
Date:   Sat Apr 19 14:35:33 2025 +0800

    fix: fix geader menu activation path (vbenjs#5997)

    Co-authored-by: 王泳超 <[email protected]>

commit 79de6bc
Author: Netfan <[email protected]>
Date:   Thu Apr 17 22:23:05 2025 +0800

    fix: alert send wrong confirm state to beforeClose (vbenjs#5991)

    * 修复alert在按下Esc或者点击遮罩关闭时,可能发送错误的isConfirm状态

commit 14bd6dd
Author: Netfan <[email protected]>
Date:   Thu Apr 17 20:25:49 2025 +0800

    fix: destroyOnClose works within connectedComponent (vbenjs#5989)

    * 修复destroyOnClose没能销毁connectedComponent自身的问题

commit 7f269e0
Author: PIPEDREA_WZJ <[email protected]>
Date:   Thu Apr 17 14:01:39 2025 +0800

    Update tailwindcss.md (vbenjs#5602)

    tailwindcss最新的版本已经是v4.x,vben中使用的是3.x的tailwindcss。在未进行兼容前,会出现运行失败的问题

commit 4baec83
Author: yuh <[email protected]>
Date:   Thu Apr 17 14:00:46 2025 +0800

    feat: add examples: form-upload (vbenjs#5955)

    * feat: add examples: form-upload

    * fix: upload: accept and label

    * fix: upload: 设置表单值、图片预览

commit f7a4d13
Author: Netfan <[email protected]>
Date:   Wed Apr 16 14:11:04 2025 +0800

    fix: fixed arguments of callbacks in `formApi` (vbenjs#5970)

    * 修复 `handleValuesChange` 传递的参数不是处理后的表单值的问题

    * 修复 `handleReset` 未能传递正确参数的问题

commit 0936861
Author: Netfan <[email protected]>
Date:   Wed Apr 16 11:29:01 2025 +0800

    feat:  pass `fieldsChanged`  into the `handleValuesChange` callback function (vbenjs#5968)

    * fieldsChanged(已被改变值的字段名)将传入handleValuesChange回调函数

commit 3318d76
Author: ming4762 <[email protected]>
Date:   Wed Apr 16 11:28:36 2025 +0800

    perf: improve `destroyOnClose` for VbenModal (vbenjs#5964)

commit 8f3881e
Author: LinaBell <[email protected]>
Date:   Wed Apr 16 11:27:13 2025 +0800

    perf: `beforeClose` of drawer support promise (vbenjs#5932)

    * perf: the beforeClose function of drawer is consistent with that of modal

    * refactor: drawer test update

commit 5252480
Author: zhouda1fu <[email protected]>
Date:   Wed Apr 16 11:22:59 2025 +0800

    fix: missing await in department form(vbenjs#5967)

commit d18f561
Author: Netfan <[email protected]>
Date:   Tue Apr 15 20:52:23 2025 +0800

    docs: update alert and apiComponent docs (vbenjs#5961)

commit 333998b
Author: wyc001122 <[email protected]>
Date:   Tue Apr 15 20:51:38 2025 +0800

    fix: determine if scrollbar has been totally scrolled (vbenjs#5934)

    * 修复在系统屏幕缩放比例不为100%的情况下,滚动组件对是否已滚动到边界的判断可能不正确的问题

commit 3fb4fba
Author: ming4762 <[email protected]>
Date:   Tue Apr 15 18:49:57 2025 +0800

    fix: modal closing animation (vbenjs#5960)

commit c7e6210
Author: ming4762 <[email protected]>
Date:   Tue Apr 15 16:04:44 2025 +0800

    feat: `modal`&`drawer` support `center-footer` slot (vbenjs#5956)

commit d864085
Author: lztb <[email protected]>
Date:   Tue Apr 15 16:03:20 2025 +0800

    feat: vben-form添加arrayToStringFields属性 (vbenjs#5957)

    * feat: vben-form添加arrayToStringFields属性

    * feat: 修改handleArrayToStringFields和handleStringToArrayFields中嵌套数组格式的处理不一致

    ---------

    Co-authored-by: 米山 <[email protected]>

commit fcdc1a1
Author: Netfan <[email protected]>
Date:   Tue Apr 15 15:32:30 2025 +0800

    feat: add more expose methods for `apiComponent` (vbenjs#5958)

    * 为ApiComponent组件添加getOptions和getValue导出方法。

commit bf7496f
Author: Netfan <[email protected]>
Date:   Tue Apr 15 00:00:05 2025 +0800

    feat: add `useAlertContext` for Alert component (vbenjs#5947)

    * 新增Alert的子组件中获取弹窗上下文的能力

commit 9700150
Author: Netfan <[email protected]>
Date:   Mon Apr 14 19:56:52 2025 +0800

    fix: table actions in fixed column (vbenjs#5945)

commit f0e9e55
Author: Netfan <[email protected]>
Date:   Mon Apr 14 11:48:21 2025 +0800

    feat: alert support customize `footer` (vbenjs#5940)

    * Alert组件支持自定义footer

commit ff88274
Author: Netfan <[email protected]>
Date:   Mon Apr 14 11:18:33 2025 +0800

    fix: long navigation menu can be scrolled (vbenjs#5939)

    * 修复超长的导航菜单无法纵向滚动的问题

commit afce9dc
Author: ming4762 <[email protected]>
Date:   Sun Apr 13 23:02:07 2025 +0800

    perf: improve `destroyOnClose` for `VbenModal` (vbenjs#5935)

    * perf: 优化Vben Modal destroyOnClose,解决destroyOnClose=false,Modal依旧会被销毁的问题

    影响范围(重要):destroyOnClose默认为true,这会导致所有的modal都会默认渲染到body
    radix-vue Dialog组件默认会销毁挂载的组件,所以即使destroyOnClose=false,Modal依旧会被销毁的问题
    对于一些大表单重复渲染导致卡顿,ApiComponent也会频繁的加载数据

    * fix: modal closing animation

    ---------

    Co-authored-by: Netfan <[email protected]>

commit b5700bd
Author: ming4762 <[email protected]>
Date:   Sun Apr 13 20:03:18 2025 +0800

    perf: improve `autoSelect` of  `ApiComponent` (vbenjs#5936)

    * fix: 修复autoSelect不生效的问题,props.valueField已经被omit了

    * feat: ApiComponent autoSelect支持使用函数,可以满足灵活性要求更高的场景

commit a8c4786
Author: Netfan <[email protected]>
Date:   Sat Apr 12 14:02:35 2025 +0800

    feat: api-component support autoSelect prop (vbenjs#5931)

    * feat: api-component support autoSelect prop

    * docs: add version requirement

commit 2971ccc
Author: Netfan <[email protected]>
Date:   Sat Apr 12 13:41:40 2025 +0800

    docs: docs modal z-index fixed, update alert docs (vbenjs#5930)

commit 4a2c7b3
Author: Netfan <[email protected]>
Date:   Sat Apr 12 10:37:47 2025 +0800

    fix: alert animation (vbenjs#5927)

commit 36bf6fc
Author: Netfan <[email protected]>
Date:   Sat Apr 12 01:44:08 2025 +0800

    fix: builtin color change throttled in preference drawer (vbenjs#5924)

    修复偏好设置中的自定义主题色拖动选择颜色时页面会明显卡顿的问题

commit f46ec30
Author: Netfan <[email protected]>
Date:   Sat Apr 12 01:16:57 2025 +0800

    fix: theme mode follow the system only `auto` (vbenjs#5923)

    * 修复主题在未设置为auto时,仍然会跟随系统主题变化的问题。

commit 9bd5a19
Author: Netfan <[email protected]>
Date:   Sat Apr 12 00:59:56 2025 +0800

    fix: alert action button  focus, fixed vbenjs#5921 (vbenjs#5922)

    * 修复Alert组件的按钮焦点切换问题

commit 86da3ce
Author: zhang <[email protected]>
Date:   Wed Apr 9 16:16:56 2025 +0800

    chore: 导出框架自带的组件,方便独立页面使用 (vbenjs#5876)

commit 329a176
Author: Netfan <[email protected]>
Date:   Wed Apr 9 01:05:20 2025 +0800

    perf:  optimize bootstrap modules to speed up first-screen loading (vbenjs#5899)

    优化首屏加载速度

commit 9379093
Author: Netfan <[email protected]>
Date:   Tue Apr 8 20:28:50 2025 +0800

    feat: customizable table separator (vbenjs#5898)

    * 表格的分隔条支持定制背景色或完全移除

commit c9014d0
Author: ming4762 <[email protected]>
Date:   Tue Apr 8 20:27:03 2025 +0800

    perf: 优化关闭页面切换动画的tab切换性能 (vbenjs#5883)

commit ed26dca
Author: Netfan <[email protected]>
Date:   Tue Apr 8 16:31:41 2025 +0800

    chore: update pnpm-lock.yaml

commit 08c6496
Author: Netfan <[email protected]>
Date:   Tue Apr 8 14:56:40 2025 +0800

    chore: update deps

commit a8c5df3
Author: Netfan <[email protected]>
Date:   Tue Apr 8 14:50:05 2025 +0800

    fix: possible circular reference issue during build (vbenjs#5894)

    * 修复构建期间出现的循环引用警告

commit 71e8d12
Author: Netfan <[email protected]>
Date:   Mon Apr 7 01:21:30 2025 +0800

    fix: improve prompt component (vbenjs#5879)

    * fix: prompt component render fixed

    * fix: alert buttonAlign default value

commit d216fdc
Author: Netfan <[email protected]>
Date:   Sat Apr 5 13:07:52 2025 +0800

    feat: support logo text slot (vbenjs#5872)

    * 基础布局中的LOGO的文字区域允许通过插槽logo-text定制

commit 384c5d7
Author: wyc001122 <[email protected]>
Date:   Sat Apr 5 11:04:59 2025 +0800

    fix: 布局为双列菜单或者水平模式下, 一级菜单高亮问题 (vbenjs#5870)

    Co-authored-by: 王泳超 <[email protected]>

commit b0ad08d
Author: Netfan <[email protected]>
Date:   Fri Apr 4 15:21:09 2025 +0800

    feat: use the not-found component instead of the invalid route component in the backend mode (vbenjs#5871)

    * 后端菜单模式下,使用not-found组件代替无效的路由组件
@github-actions github-actions bot locked and limited conversation to collaborators May 7, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant