Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

feat: three new submissions have been added #5373

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

wingjie
Copy link

@wingjie wingjie commented Jan 13, 2025

Description

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

Release Notes

  • New Features

    • Added a new multipleRequired validation rule for form fields to ensure multiple selections are made
    • Introduced optional autoDefaultValue configuration to automatically set default values for form fields
  • Improvements

    • Enhanced form validation capabilities across multiple UI adapters
    • Improved form field initialization and event handling
  • Documentation

    • Updated form documentation to reflect new validation and configuration options

@wingjie wingjie requested review from anncwb, vince292007, mynetfan and a team as code owners January 13, 2025 08:44
Copy link

changeset-bot bot commented Jan 13, 2025

⚠️ No Changeset found

Latest commit: 2d30a80

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Copy link
Contributor

coderabbitai bot commented Jan 13, 2025

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.

apps/web-antd/src/adapter/form.ts

Oops! Something went wrong! :(

ESLint: 9.17.0

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/node_modules/@vben/eslint-config/dist/index.mjs' imported from /eslint.config.mjs
at finalizeResolution (node:internal/modules/esm/resolve:257:11)
at moduleResolve (node:internal/modules/esm/resolve:914:10)
at defaultResolve (node:internal/modules/esm/resolve:1038:11)
at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:557:12)
at ModuleLoader.resolve (node:internal/modules/esm/loader:525:25)
at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:246:38)
at ModuleJob._link (node:internal/modules/esm/module_job:126:49)

Walkthrough

This pull request introduces a new multipleRequired validation rule across multiple form adapters and components. The rule is designed to validate multiple selections by checking if a value is undefined, null, or an empty array. It provides a localized error message when multiple selections are required but not met. Additionally, a new optional autoDefaultValue property is added to form configurations, enabling automatic default value assignment for form fields. The changes are consistent across different UI library adapters and enhance form validation and initialization capabilities.

Changes

File Change Summary
apps/web-*/src/adapter/form.ts Added multipleRequired validation rule to setupVbenForm function
docs/src/_env/adapter/form.ts Introduced multipleRequired validation rule
docs/src/components/common-ui/vben-form.md Added multipleRequired rule and autoDefaultValue property
packages/@core/ui-kit/form-ui/src/form-render/form-field.vue Added autoDefaultValue prop, updated validation and event handling
packages/@core/ui-kit/form-ui/src/form-render/form.vue Incorporated autoDefaultValue in schema processing
packages/@core/ui-kit/form-ui/src/types.ts Added autoDefaultValue and multipleRequired to interfaces

Sequence Diagram

sequenceDiagram
    participant Form as Form Component
    participant Validator as Form Validator
    participant Field as Form Field

    Form->>Validator: Setup form with multipleRequired rule
    Validator-->>Form: Validation rules configured
    Form->>Field: Initialize field
    Field->>Field: Check autoDefaultValue
    alt autoDefaultValue is true
        Field-->>Form: Set default value
    end
    Form->>Validator: Validate form
    Validator->>Validator: Check multipleRequired rule
    alt Invalid multiple selection
        Validator-->>Form: Return localized error message
    else Valid selection
        Validator-->>Form: Validation passed
    end
Loading

Possibly related PRs

Suggested reviewers

  • vince292007
  • anncwb

Poem

🐰 Validation's new dance, a rabbit's delight,
Multiple choices now shine so bright!
autoDefaultValue springs to life,
Forms now leap without any strife.
A hoppy enhancement, clean and neat! 🌟

Finishing Touches

  • 📝 Generate Docstrings (Beta)

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 generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

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

CodeRabbit Configuration File (.coderabbit.yaml)

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

Documentation and Community

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

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (10)
apps/web-ele/src/adapter/form.ts (1)

31-36: Consider differentiating multipleRequired from required rule

The multipleRequired rule currently uses identical validation logic to the required rule but returns a different error message. This could lead to confusion about which rule to use. Consider:

  1. Documenting the specific use case for this rule
  2. Using a distinct error message key for multiple selection validation
   multipleRequired: (value, _params, ctx) => {
     if (value === undefined || value === null || value.length === 0) {
-      return $t('ui.formRules.selectRequired', [ctx.label]);
+      return $t('ui.formRules.multipleSelectRequired', [ctx.label]);
     }
     return true;
   },
playground/src/adapter/form.ts (1)

24-29: Maintain consistent rule ordering across adapters

The multipleRequired rule is placed before other rules, while in other adapters it's placed after. Consider maintaining consistent ordering across all adapters for better maintainability.

Move the rule after the selectRequired rule to match other adapters.

apps/web-antd/src/adapter/form.ts (2)

39-44: Consider extracting common validation logic

The multipleRequired rule is identical across all adapters. Consider extracting this common validation logic into a shared utility to improve maintainability and ensure consistent behavior.

Consider moving the validation logic to a shared location, such as:

  1. A common validation utility file
  2. The @vben/common-ui package
    This would reduce duplication and make future updates easier to manage.

Line range hint 31-36: Architectural Recommendations for Form Validation

To improve the form validation implementation across adapters:

  1. Create a shared validation utility in @vben/common-ui to eliminate code duplication
  2. Define distinct error message keys for different validation scenarios
  3. Document the specific use cases for each validation rule
  4. Consider creating a validation rule registry to maintain consistent rule ordering

This will improve maintainability, reduce duplication, and provide clearer guidance for developers.

Would you like me to provide a detailed implementation plan for these improvements?

Also applies to: 35-40, 24-29, 39-44

docs/src/_env/adapter/form.ts (1)

27-32: Consider enhancing the multipleRequired validation.

While the implementation is functional, consider these improvements:

  1. Use a more specific translation key for multiple selection scenarios instead of reusing selectRequired.
  2. Add type checking to ensure the value is an array before checking length.
 multipleRequired: (value, _params, ctx) => {
-  if (value === undefined || value === null || value.length === 0) {
+  if (value === undefined || value === null || 
+    (Array.isArray(value) && value.length === 0)) {
-    return $t('ui.formRules.selectRequired', [ctx.label]);
+    return $t('ui.formRules.multipleRequired', [ctx.label]);
   }
   return true;
 },
packages/@core/ui-kit/shadcn-ui/src/components/pin-input/input.vue (1)

17-19: Simplify the handleSendCode implementation.

The function always returns true, making the boolean return value redundant. Consider either:

  1. Removing the return value if it's not needed, or
  2. Implementing actual validation logic if there are conditions where code sending should be prevented.
packages/@core/ui-kit/form-ui/src/types.ts (1)

402-406: Consider enhancing the multipleRequired type definition.

The return type could be more specific to better reflect the actual implementation.

 multipleRequired?: (
   value: any,
   params: any,
   ctx: Record<string, any>,
-) => boolean | string;
+) => true | string;
packages/@core/ui-kit/form-ui/src/form-render/form-field.vue (3)

168-177: Consider consolidating duplicate prop computation logic.

The computedItemProps computed property duplicates logic from computedProps. Consider extracting the common logic into a shared function to improve maintainability.

+function computeComponentProps(values: any, formApi: any) {
+  return isFunction(componentProps)
+    ? componentProps(values, formApi!)
+    : componentProps;
+}

 const computedProps = computed(() => {
-  const finalComponentProps = isFunction(componentProps)
-    ? componentProps(values.value, formApi!)
-    : componentProps;
+  const finalComponentProps = computeComponentProps(values.value, formApi);

   return {
     ...commonComponentProps,
     ...finalComponentProps,
     ...dynamicComponentProps.value,
   };
 });

 const computedItemProps = computed(() => {
-  const finalComponentProps = isFunction(componentProps)
-    ? componentProps(values.value, formApi!)
-    : componentProps;
+  const finalComponentProps = computeComponentProps(values.value, formApi);

   return {
     ...finalComponentProps,
     ...dynamicComponentProps.value,
   };
 });

216-231: Add error handling for the automatic default value assignment.

While the logic is correct, consider adding error handling for cases where formApi is undefined or when the change handler throws an error.

 onMounted(() => {
   if (
     autoDefaultValue &&
     Reflect.has(commonComponentProps, 'change') &&
     defaultValue
   ) {
+    try {
       const value = (formApi && formApi.values[fieldName]) ?? defaultValue;
       commonComponentProps.change(value, {
         e: value,
         ...computedProps.value,
         emptyStateValue,
         formApi,
         name: fieldName,
       });
+    } catch (error) {
+      console.error('Failed to set default value:', error);
+    }
   }
 });

243-254: Add type safety to event handlers.

The event handling logic is comprehensive but could benefit from TypeScript type definitions for the event parameters and handler functions.

+interface ChangeHandlerParams {
+  e: any[];
+  formApi: any;
+  emptyStateValue?: any;
+  [key: string]: any;
+}

+type ChangeHandler = (value: any, params: ChangeHandlerParams) => void;

-const change = (...e: any) => {
+const change = (...e: any[]): void => {
   handler(...e);
   if (Reflect.has(commonComponentProps, 'change')) {
-    commonComponentProps.change(e[0], {
+    (commonComponentProps.change as ChangeHandler)(e[0], {
       e,
       ...slotProps.componentField,
       ...computedProps.value,
       [bindEventField || '']: value === undefined ? emptyStateValue : value,
       formApi,
     });
   }
 };

Also applies to: 294-309, 318-323

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 42e3220 and 2d30a80.

📒 Files selected for processing (10)
  • apps/web-antd/src/adapter/form.ts (1 hunks)
  • apps/web-ele/src/adapter/form.ts (1 hunks)
  • apps/web-naive/src/adapter/form.ts (1 hunks)
  • docs/src/_env/adapter/form.ts (1 hunks)
  • docs/src/components/common-ui/vben-form.md (2 hunks)
  • packages/@core/ui-kit/form-ui/src/form-render/form-field.vue (8 hunks)
  • packages/@core/ui-kit/form-ui/src/form-render/form.vue (2 hunks)
  • packages/@core/ui-kit/form-ui/src/types.ts (2 hunks)
  • packages/@core/ui-kit/shadcn-ui/src/components/pin-input/input.vue (2 hunks)
  • playground/src/adapter/form.ts (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: post-update (windows-latest)
  • GitHub Check: post-update (ubuntu-latest)
🔇 Additional comments (7)
apps/web-naive/src/adapter/form.ts (1)

35-40: Verify null handling for Naive UI components

Given the comment that Naive UI components use null for empty values (not undefined), verify that the multipleRequired validation handles this correctly. Consider adding a test case specifically for Naive UI's null behavior.

✅ Verification successful

Null handling for Naive UI components is correctly implemented

The multipleRequired validation properly handles Naive UI's null-based empty values, and the form configuration ensures consistent behavior during form resets. No changes needed.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for tests related to form validation with null values
rg -l "null.*multipleRequired|multipleRequired.*null" --type ts

Length of output: 65


Script:

#!/bin/bash
# Search for comments and code related to Naive UI form handling
rg -g "*.ts" -g "*.vue" "naive.*form|form.*naive" -A 2 -B 2

# Search for validation rule implementations and usage
ast-grep --pattern 'const $_ = {
  $$$
  multipleRequired: $_,
  $$$
}'

Length of output: 135


Script:

#!/bin/bash
# Look for form validation rules in the codebase
rg -g "*.ts" "formRules|validation.*rules" -A 2 -B 2

# Check the specific adapter file content
cat apps/web-naive/src/adapter/form.ts

Length of output: 6897

packages/@core/ui-kit/shadcn-ui/src/components/pin-input/input.vue (1)

64-65: Verify the necessity of the early return condition.

The early return check if (!bool) will never execute since handleSendCode always returns true.

If early return is needed, consider implementing actual validation in handleSendCode.

packages/@core/ui-kit/form-ui/src/form-render/form.vue (1)

88-88: LGTM! Clean integration of autoDefaultValue.

The new property is properly integrated into both the configuration destructuring and the computed schema, following the established patterns.

Also applies to: 115-115

packages/@core/ui-kit/form-ui/src/types.ts (1)

140-143: LGTM! Well-documented property addition.

The autoDefaultValue property is properly documented and follows the established pattern for form configuration options.

packages/@core/ui-kit/form-ui/src/form-render/form-field.vue (2)

29-34: LGTM! Props are correctly defined.

The new autoDefaultValue prop is properly initialized with a default value of false, and defaultValue is correctly destructured from props.


114-116: LGTM! Validation rule check is properly updated.

The shouldRequired computed property now correctly includes the new 'multipleRequired' validation rule.

docs/src/components/common-ui/vben-form.md (1)

51-56: LGTM! Documentation is clear and comprehensive.

The documentation clearly explains both the new multipleRequired validation rule and the autoDefaultValue property, including their purposes and usage.

Also applies to: 368-371

@wingjie wingjie closed this Jan 13, 2025
@wingjie wingjie changed the title Feat/wing pr feat/wing pr Jan 13, 2025
@wingjie wingjie reopened this Jan 13, 2025
@wingjie wingjie closed this Jan 13, 2025
@wingjie wingjie changed the title feat/wing pr feat/ add judgment to determine whether to trigger the countdown, added mandatory check presets for multiple selections, add a trigger hook function for each item of the form and a global hook function Jan 13, 2025
@wingjie wingjie reopened this Jan 13, 2025
@wingjie wingjie closed this Jan 13, 2025
@wingjie wingjie changed the title feat/ add judgment to determine whether to trigger the countdown, added mandatory check presets for multiple selections, add a trigger hook function for each item of the form and a global hook function feat/ three new submissions have been added Jan 13, 2025
@wingjie
Copy link
Author

wingjie commented Jan 13, 2025

1、添加判断来决定是否触发倒计时,这样可以先校验手机邮箱号,通过后再进行开始计时; 2、增加了多项选择的强制检查预设;3、为表单的每一项添加一个触发钩子函数和一个全局钩子函数,方便开发需要

@wingjie wingjie reopened this Jan 13, 2025
@wingjie wingjie closed this Jan 13, 2025
@wingjie wingjie changed the title feat/ three new submissions have been added feat: three new submissions have been added Jan 13, 2025
@wingjie wingjie reopened this Jan 13, 2025
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.

1 participant