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

fix: custom fields subscription #1329

Merged
merged 3 commits into from
Nov 13, 2024
Merged

fix: custom fields subscription #1329

merged 3 commits into from
Nov 13, 2024

Conversation

cpvalente
Copy link
Owner

A few issues here

  • if a custom field contained upper case letters, the subscription did not work
  • if a custom field contained spaces, it would break the parsing of multiple fields
  • adding a chevron to the menu to symbolise that the item is a combobox

Copy link
Contributor

coderabbitai bot commented Nov 13, 2024

Caution

Review failed

The pull request is closed.

Walkthrough

The pull request introduces modifications to several components, enhancing the handling of multi-option parameters and improving the user interface. Key changes include the addition of a new utility function for processing parameter values, updates to how parameters are retrieved from search parameters as arrays instead of strings, and the inclusion of an icon to improve the dropdown menu's visual representation.

Changes

File Change Summary
apps/client/src/common/components/view-params-editor/ParamInput.tsx - Added import for IoChevronDown icon.
- Updated MultiOption to retrieve selected options as an array.
- Simplified state management for multi-option selections.
apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx - Introduced handleValueString function for managing parameter values in newSearchParams.
- Modularized value handling within getURLSearchParamsFromObj.
apps/client/src/features/operator/Operator.tsx - Modified subscription retrieval from search parameters to use searchParams.getAll('subscribe'), allowing for direct handling of multiple values.

Possibly related PRs

  • fix: rare case of old customFields as part of subscriptions #1163: This PR modifies the Operator component to retrieve multiple subscription values using searchParams.getAll('subscribe'), similar to the main PR's change in ParamInput.tsx where searchParams.getAll(id) is used for multi-option parameters.
  • make custom fields case sensitive #1242: While this PR focuses on custom fields and their case sensitivity, it indirectly relates to the handling of parameters in the main PR, as both involve managing data integrity and uniqueness in user inputs.

Suggested reviewers

  • alex-Arc

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/client/src/common/components/view-params-editor/ParamInput.tsx

Oops! Something went wrong! :(

ESLint: 8.56.0

ESLint couldn't find the plugin "eslint-plugin-react".

(The package "eslint-plugin-react" was not found when loaded as a Node module from the directory "/apps/client".)

It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:

npm install eslint-plugin-react@latest --save-dev

The plugin "eslint-plugin-react" was referenced from the config file in "apps/client/.eslintrc".

If you still can't figure out the problem, please stop by https://eslint.org/chat/help to chat with the team.


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.

@cpvalente
Copy link
Owner Author

@coderabbitai review

Copy link
Contributor

coderabbitai bot commented Nov 13, 2024

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@cpvalente
Copy link
Owner Author

@coderabbitai full review

Copy link
Contributor

coderabbitai bot commented Nov 13, 2024

✅ Actions performed

Full review triggered.

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: 1

🧹 Outside diff range and nitpick comments (2)
apps/client/src/common/components/view-params-editor/ParamInput.tsx (1)

120-120: Consider using Chakra UI's built-in icon handling

While the chevron addition improves UX, consider these enhancements:

-{paramField.title} <IoChevronDown style={{ display: 'inline' }} />
+{paramField.title} <IoChevronDown aria-label="toggle menu" display="inline" />
apps/client/src/features/operator/Operator.tsx (1)

117-118: LGTM! The changes effectively resolve the subscription parsing issues.

The switch to searchParams.getAll() elegantly handles both uppercase letters and spaces in custom fields by avoiding string manipulation.

Consider these improvements for better clarity and type safety:

-  // subscriptions is a MultiSelect and may have multiple values
-  const subscriptions = searchParams.getAll('subscribe').filter((value) => Object.hasOwn(customFields, value));
+  // Get selected custom field IDs from the URL parameters
+  const selectedCustomFieldIds = searchParams.getAll('subscribe').filter((fieldId: string): fieldId is keyof typeof customFields => 
+    Object.hasOwn(customFields, fieldId)
+  );
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between b55724a and baf26ab.

📒 Files selected for processing (3)
  • apps/client/src/common/components/view-params-editor/ParamInput.tsx (2 hunks)
  • apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx (1 hunks)
  • apps/client/src/features/operator/Operator.tsx (1 hunks)
🔇 Additional comments (5)
apps/client/src/common/components/view-params-editor/ParamInput.tsx (3)

16-16: LGTM: Icon import for enhanced UI

The addition of the chevron icon aligns with the PR objective to improve the visual indication of the combobox functionality.


125-126: LGTM: Robust value handling

The improved onChange handler correctly manages both single and multiple selections while maintaining type safety. The direct use of paramState ensures consistent value handling.


112-113: LGTM: Improved parameter handling

The switch to searchParams.getAll() resolves the issues with uppercase letters and spaces in custom fields by preserving the original values without case manipulation.

Let's verify the fix handles problematic cases:

✅ Verification successful

Parameter handling change is safe and correctly implemented

The verification confirms that:

  • The switch from searchParams.get() to searchParams.getAll() in ParamInput.tsx is appropriate for handling multiple values
  • No case transformations (.toLowerCase()) are used in URL parameter handling in the view components
  • String splits that could affect space handling are not used for URL parameters in the view components
  • Other parameter handling in viewer components uses searchParams.get() appropriately for single-value parameters
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for any remaining lowercase transformations in parameter handling
rg -i "\.toLowerCase\(\)" --type tsx --type ts

# Search for potential string splits that might affect space handling
rg "\.split\(['\"]" --type tsx --type ts

Length of output: 149


Script:

#!/bin/bash
# Search for any remaining lowercase transformations in parameter handling
rg -i "\.toLowerCase\(\)"

# Search for potential string splits that might affect space handling
rg "\.split\(['\"]"

# Look for other parameter handling patterns
ast-grep --pattern 'searchParams.get($$$)'

Length of output: 11677

apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx (2)

58-58: LGTM! Good refactoring of value handling logic.

The extraction of value handling logic into a separate function improves code organization and maintainability.


63-79: Verify case sensitivity requirements across the application.

Before implementing the suggested case normalization, we should verify that no other components depend on case-sensitive values.

Comment on lines +63 to +79
/** Utility function contains logic to add a value into the searchParams object */
function handleValueString(id: string, value: string) {
const maybeMultipleValues = value.split(',');

// we need to check if the value contains comma separated list, for the case of the multi-select data
if (Array.isArray(maybeMultipleValues) && maybeMultipleValues.length > 1) {
const added = new Set();
maybeMultipleValues.forEach((v) => {
if (!added.has(v)) {
added.add(v);
newSearchParams.append(id, v);
}
});
} else {
newSearchParams.set(id, value);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add value sanitization to fully address the PR objectives.

The new utility function handles multiple values well, but it's missing some critical sanitization steps mentioned in the PR objectives:

  1. Handling of uppercase letters in custom fields
  2. Proper handling of spaces in multiple fields

Consider applying this improvement:

 function handleValueString(id: string, value: string) {
-  const maybeMultipleValues = value.split(',');
+  const maybeMultipleValues = value.split(',').map(v => v.trim().toLowerCase());
 
   if (Array.isArray(maybeMultipleValues) && maybeMultipleValues.length > 1) {
     const added = new Set();
     maybeMultipleValues.forEach((v) => {
-      if (!added.has(v)) {
+      if (v && !added.has(v)) {  // Skip empty values
         added.add(v);
         newSearchParams.append(id, v);
       }
     });
   } else {
-    newSearchParams.set(id, value);
+    const sanitizedValue = value.trim().toLowerCase();
+    if (sanitizedValue) {
+      newSearchParams.set(id, sanitizedValue);
+    }
   }
 }

These changes will:

  • Trim whitespace from values
  • Convert values to lowercase for consistency
  • Skip empty values after splitting
📝 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
/** Utility function contains logic to add a value into the searchParams object */
function handleValueString(id: string, value: string) {
const maybeMultipleValues = value.split(',');
// we need to check if the value contains comma separated list, for the case of the multi-select data
if (Array.isArray(maybeMultipleValues) && maybeMultipleValues.length > 1) {
const added = new Set();
maybeMultipleValues.forEach((v) => {
if (!added.has(v)) {
added.add(v);
newSearchParams.append(id, v);
}
});
} else {
newSearchParams.set(id, value);
}
}
/** Utility function contains logic to add a value into the searchParams object */
function handleValueString(id: string, value: string) {
const maybeMultipleValues = value.split(',').map(v => v.trim().toLowerCase());
// we need to check if the value contains comma separated list, for the case of the multi-select data
if (Array.isArray(maybeMultipleValues) && maybeMultipleValues.length > 1) {
const added = new Set();
maybeMultipleValues.forEach((v) => {
if (v && !added.has(v)) { // Skip empty values
added.add(v);
newSearchParams.append(id, v);
}
});
} else {
const sanitizedValue = value.trim().toLowerCase();
if (sanitizedValue) {
newSearchParams.set(id, sanitizedValue);
}
}
}

@cpvalente cpvalente merged commit 18575fc into master Nov 13, 2024
4 checks passed
@cpvalente cpvalente deleted the fix-cf branch November 13, 2024 19:23
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