Skip to content

MGMT-22505: Stop using deprecated Modal components#3343

Merged
openshift-merge-bot[bot] merged 1 commit intoopenshift-assisted:masterfrom
jgyselov:pf6_cim_modal_component
Jan 21, 2026
Merged

MGMT-22505: Stop using deprecated Modal components#3343
openshift-merge-bot[bot] merged 1 commit intoopenshift-assisted:masterfrom
jgyselov:pf6_cim_modal_component

Conversation

@jgyselov
Copy link
Contributor

@jgyselov jgyselov commented Jan 2, 2026

https://issues.redhat.com/browse/MGMT-22505

Summary by CodeRabbit

  • Refactor

    • Updated modal dialogs to a consistent header/body/footer composition and moved actions into explicit footers for clearer, more predictable dialogs.
    • Environment error UI now renders inline within pages instead of inside modal wrappers.
  • Style

    • Standardized capitalization of nodepool actions to "Add nodepool" / "Remove nodepool".
    • Adjusted form helper text and spacing for improved clarity and layout.

✏️ Tip: You can customize this high-level summary in your review settings.

@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Jan 2, 2026
@openshift-ci-robot
Copy link

openshift-ci-robot commented Jan 2, 2026

@jgyselov: This pull request references MGMT-22505 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the sub-task to target the "4.22.0" version, but no target version was set.

Details

In response to this:

https://issues.redhat.com/browse/MGMT-22505

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci openshift-ci bot requested review from LiorSoffer and jkilzi January 2, 2026 11:34
@openshift-ci openshift-ci bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Jan 2, 2026
@coderabbitai
Copy link

coderabbitai bot commented Jan 2, 2026

📝 Walkthrough

Walkthrough

Replaces deprecated PatternFly modal APIs with composed ModalHeader/ModalBody/ModalFooter across many UI components, removes inModal from EnvironmentErrors, and renames translation key ai:Add Nodepoolai:Add nodepool.

Changes

Cohort / File(s) Summary
Reset & app modal
apps/assisted-disconnected-ui/src/components/ResetSingleClusterModal.tsx
Replaced deprecated Modal usage with ModalHeader/ModalBody/ModalFooter; moved actions into ModalFooter; kept reset logic, loading state, translations, and onClose flow.
Core modal migration
libs/ui-lib/lib/cim/components/modals/*
.../AddBmcHostModal.tsx, .../AddBmcHostYamlModal.tsx, .../AddBmcHostYamlForm.tsx, .../AddHostModal.tsx, .../CimConfiguration/CimConfigurationModal.tsx, .../ManageHostsModal.tsx, etc.
Replaced ModalBox*/deprecated Modal props (title, hasNoBodyWrapper, actions) with ModalHeader, ModalBody, ModalFooter; moved titles to headers and actions to footers; updated imports; preserved internal logic and error handling.
Agent / BMC components
libs/ui-lib/lib/cim/components/Agent/*
.../BMCForm.tsx, .../MinimalHWRequirements.tsx
Switched to ModalHeader/ModalBody/ModalFooter where applicable; adjusted some field props (descriptionhelperText); preserved behavior.
Hypershift / NodePools
libs/ui-lib/lib/cim/components/Hypershift/...
.../modals/*, .../DetailsPage/NodePoolsTable.tsx, .../HostedClusterWizard/HostsStep/HostsForm.tsx
Applied modal composition migration; added horizontalTermWidthModifier to a DescriptionList; updated UI strings/translation key from "Add Nodepool" → "Add nodepool".
InfraEnv error handling
libs/ui-lib/lib/cim/components/InfraEnv/EnvironmentErrors.tsx
Removed inModal?: boolean prop and deprecated ModalBoxBody import; component now returns inline error UI and early-returns when no failing alerts.
Translations
libs/locales/lib/en/translation.json
Renamed translation key ai:Add Nodepoolai:Add nodepool; removed legacy ai:Remove Nodepool key (lowercase retained).

Sequence Diagram(s)

(Skipped — changes are UI-wrapper/component migrations without new multi-component sequential flows that require diagramming.)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested labels

lgtm

Suggested reviewers

  • LiorSoffer
  • jkilzi
  • ammont82

Poem

🐰 I hopped through JSX with nimble paws,
Headers snug, bodies tidy — no deprecated claws.
Footers hold buttons, alerts find their place,
A cleaner modal hop, with a carrot-paced grace. 🥕

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main change: migrating from deprecated PatternFly Modal components to the current Modal API with ModalHeader/ModalBody/ModalFooter across multiple components.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@openshift-ci openshift-ci bot added the size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. label Jan 2, 2026
@jgyselov
Copy link
Contributor Author

jgyselov commented Jan 2, 2026

/cherry-pick releases/v2.17-cim

@openshift-cherrypick-robot
Copy link
Contributor

@jgyselov: once the present PR merges, I will cherry-pick it on top of releases/v2.17-cim in a new PR and assign it to you.

Details

In response to this:

/cherry-pick releases/v2.17-cim

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci-robot
Copy link

openshift-ci-robot commented Jan 2, 2026

@jgyselov: This pull request references MGMT-22505 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the sub-task to target the "4.22.0" version, but no target version was set.

Details

In response to this:

https://issues.redhat.com/browse/MGMT-22505

Summary by CodeRabbit

  • Refactor

  • Updated modal dialog structures across the application to use current component patterns for improved maintainability.

  • Simplified EnvironmentErrors component by removing internal modal wrapper logic.

  • Adjusted form field properties for better accessibility and consistency.

  • Style

  • Standardized button text capitalization from "Add Nodepool" to "Add nodepool" across the UI.

  • Enhanced form layout spacing in node pool configuration views.

✏️ Tip: You can customize this high-level summary in your review settings.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

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

🧹 Nitpick comments (4)
libs/ui-lib/lib/cim/components/Agent/MinimalHWRequirements.tsx (1)

110-120: Migration to modal composition pattern is correct.

The modal structure properly implements the PatternFly v6 composition pattern with ModalHeader, ModalBody, and ModalFooter. The functionality and accessibility are preserved.

Optional: Remove unnecessary key prop

The key="close" prop on line 116 is unnecessary since the button is not part of a list. In React, keys are only needed when rendering arrays of elements.

-      <Button key="close" variant={ButtonVariant.primary} onClick={onClose}>
+      <Button variant={ButtonVariant.primary} onClick={onClose}>
apps/assisted-disconnected-ui/src/components/ResetSingleClusterModal.tsx (1)

65-73: Consider simplifying Content nesting.

The outer <Content> wrapper (line 65) without a component prop may be unnecessary since each paragraph is already wrapped in <Content component="p">. PatternFly's Content component is primarily for semantic HTML elements, so the extra wrapper doesn't add semantic value.

🔎 Suggested simplification
         <StackItem>
-          <Content>
-            <Content component="p">
-              {t(
-                'ai:This will remove all current configurations and will revert to the defaults.',
-              )}
-            </Content>
-
-            <Content component="p">{t('ai:Are you sure you want to reset the cluster?')}</Content>
-          </Content>
+          <Content component="p">
+            {t(
+              'ai:This will remove all current configurations and will revert to the defaults.',
+            )}
+          </Content>
+        </StackItem>
+        <StackItem>
+          <Content component="p">{t('ai:Are you sure you want to reset the cluster?')}</Content>
         </StackItem>

Note: If the outer <Content> serves a specific styling purpose in your design system, this suggestion can be disregarded.

libs/ui-lib/lib/cim/components/Hypershift/modals/AddNodePoolModal.tsx (1)

84-86: Consider using getRandomString for better uniqueness.

The current approach with Math.floor(Math.random() * 100) has limited entropy (only 100 possible values), which could lead to name collisions. The HostsForm.tsx in this codebase uses getRandomString(5) for the same purpose, providing much better uniqueness.

🔎 Proposed fix
+import { getRandomString } from '../../../../common/utils';
...
 initialValues={{
-  nodePoolName: `nodepool-${hostedCluster.metadata?.name || ''}-${Math.floor(
-    Math.random() * 100,
-  )}`,
+  nodePoolName: `nodepool-${hostedCluster.metadata?.name || ''}-${getRandomString(5)}`,
   agentLabels: [],
libs/ui-lib/lib/cim/components/Hypershift/modals/ManageHostsModal.tsx (1)

132-132: Note: isInitialValid is deprecated in Formik.

While not introduced by this PR, isInitialValid={false} is deprecated. Consider using validateOnMount combined with appropriate initial values validation in a future cleanup.

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7b9ba48 and 456c375.

📒 Files selected for processing (23)
  • apps/assisted-disconnected-ui/src/components/ResetSingleClusterModal.tsx
  • libs/locales/lib/en/translation.json
  • libs/ui-lib/lib/cim/components/Agent/BMCForm.tsx
  • libs/ui-lib/lib/cim/components/Agent/MinimalHWRequirements.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/DetailsPage/NodePoolsTable.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/modals/AddNodePoolModal.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/modals/ManageHostsModal.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/modals/NodePoolForm.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/modals/RemoveNodePoolModal.tsx
  • libs/ui-lib/lib/cim/components/InfraEnv/EnvironmentErrors.tsx
  • libs/ui-lib/lib/cim/components/modals/AddBmcHostModal.tsx
  • libs/ui-lib/lib/cim/components/modals/AddBmcHostYamlForm.tsx
  • libs/ui-lib/lib/cim/components/modals/AddBmcHostYamlModal.tsx
  • libs/ui-lib/lib/cim/components/modals/AddHostModal.tsx
  • libs/ui-lib/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx
  • libs/ui-lib/lib/cim/components/modals/EditBMHModal.tsx
  • libs/ui-lib/lib/cim/components/modals/EditNtpSourcesModal.tsx
  • libs/ui-lib/lib/cim/components/modals/EditProxyModal.tsx
  • libs/ui-lib/lib/cim/components/modals/EditPullSecretModal.tsx
  • libs/ui-lib/lib/cim/components/modals/EditSSHKeyModal.tsx
  • libs/ui-lib/lib/cim/components/modals/MassApproveAgentModal.tsx
  • libs/ui-lib/lib/cim/components/modals/ScaleUpModal.tsx
🧰 Additional context used
🧠 Learnings (3)
📓 Common learnings
Learnt from: linoyaslan
Repo: openshift-assisted/assisted-installer-ui PR: 3190
File: libs/ui-lib/lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts:69-69
Timestamp: 2025-10-19T17:22:52.502Z
Learning: CIM UI changes in the repository openshift-assisted/assisted-installer-ui (e.g., files under libs/ui-lib/lib/cim/) are handled separately by the CIM team and should be tracked via separate issues rather than being included in PRs for other UI components.
📚 Learning: 2025-12-17T09:08:18.279Z
Learnt from: jgyselov
Repo: openshift-assisted/assisted-installer-ui PR: 3319
File: libs/ui-lib/lib/cim/components/helpers/toAssisted.ts:199-201
Timestamp: 2025-12-17T09:08:18.279Z
Learning: In libs/ui-lib/lib/cim/components/helpers/toAssisted.ts, the platformType field on agentClusterInstall.spec is guaranteed to always contain a valid PlatformType value (when lowercased), making the type assertion safe without additional runtime validation.

Applied to files:

  • libs/ui-lib/lib/cim/components/Agent/BMCForm.tsx
  • libs/ui-lib/lib/cim/components/Agent/MinimalHWRequirements.tsx
📚 Learning: 2025-12-17T09:16:41.439Z
Learnt from: jgyselov
Repo: openshift-assisted/assisted-installer-ui PR: 3319
File: libs/ui-lib/lib/common/components/hosts/utils.ts:208-210
Timestamp: 2025-12-17T09:16:41.439Z
Learning: In libs/ui-lib/lib/common/components/hosts/utils.ts, the nodeLabels field on Host objects is guaranteed to be valid JSON because it's always constructed using JSON.stringify in libs/ui-lib/lib/cim/components/helpers/toAssisted.ts, making direct JSON.parse safe without additional error handling.

Applied to files:

  • libs/ui-lib/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.tsx
🧬 Code graph analysis (5)
libs/ui-lib/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx (3)
libs/ui-lib-tests/cypress/views/reusableComponents/Alert.ts (1)
  • Alert (1-20)
libs/ui-lib/lib/cim/components/modals/CimConfiguration/CimConfigDisconnectedAlert.tsx (1)
  • CimConfigDisconnectedAlert (8-27)
libs/ui-lib/lib/cim/components/modals/CimConfiguration/CimConfigurationFormFields.tsx (1)
  • CimConfigurationFormFields (26-259)
libs/ui-lib/lib/cim/components/modals/AddHostModal.tsx (2)
libs/ui-lib/lib/cim/components/InfraEnv/EnvironmentErrors.tsx (1)
  • EnvironmentErrors (16-53)
libs/ui-lib/lib/common/components/clusterConfiguration/DiscoveryImageConfigForm.tsx (1)
  • DiscoveryImageConfigForm (83-165)
libs/ui-lib/lib/cim/components/modals/AddBmcHostYamlModal.tsx (1)
libs/ui-lib/lib/cim/components/InfraEnv/EnvironmentErrors.tsx (1)
  • EnvironmentErrors (16-53)
apps/assisted-disconnected-ui/src/components/ResetSingleClusterModal.tsx (1)
libs/ui-lib-tests/cypress/views/reusableComponents/Alert.ts (1)
  • Alert (1-20)
libs/ui-lib/lib/cim/components/modals/AddBmcHostModal.tsx (1)
libs/ui-lib/lib/cim/components/InfraEnv/EnvironmentErrors.tsx (1)
  • EnvironmentErrors (16-53)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: circular-deps
  • GitHub Check: tests
  • GitHub Check: translation-files
  • GitHub Check: format
  • GitHub Check: unit-tests
  • GitHub Check: lint
🔇 Additional comments (31)
libs/ui-lib/lib/cim/components/Agent/MinimalHWRequirements.tsx (1)

2-10: LGTM! Imports correctly updated for new modal composition pattern.

The added imports (ModalBody, ModalFooter, ModalHeader) properly support the migration from deprecated Modal API to the PatternFly v6 composition pattern.

libs/ui-lib/lib/cim/components/modals/EditPullSecretModal.tsx (3)

4-15: LGTM! Imports correctly updated for modern PatternFly modal composition.

The new imports (ModalBody, ModalFooter, ModalHeader) replace the deprecated modal components and are correctly sourced from @patternfly/react-core.


80-101: LGTM! Modal body and footer correctly migrated.

The migration from ModalBoxBody → ModalBody and ModalBoxFooter → ModalFooter follows the modern PatternFly composition pattern while preserving all existing functionality and logic.


132-132: LGTM! ModalHeader correctly added.

The ModalHeader is properly positioned as a direct child of Modal with the title prop, completing the migration to the modern PatternFly modal composition pattern.

apps/assisted-disconnected-ui/src/components/ResetSingleClusterModal.tsx (4)

2-14: LGTM! Imports correctly updated for PatternFly v6 modal composition.

The import additions (Content, ModalHeader, ModalBody, ModalFooter) are all necessary for the new modal composition pattern and properly support the migration from deprecated Modal APIs.


60-61: LGTM! Modal structure correctly migrated to PatternFly v6 composition pattern.

The Modal props are properly scoped to structural concerns (isOpen, variant, onClose), while the title and icon are correctly moved to ModalHeader. The titleIconVariant="warning" is appropriate for this destructive action confirmation.


75-81: LGTM! Error Alert correctly implemented.

The conditional error Alert is properly configured with isInline, variant="danger", and dynamic title/message. The StackItem wrapper ensures proper spacing within the modal body.


84-102: LGTM! ModalFooter and buttons correctly migrated.

The action buttons are properly moved from the deprecated actions prop to ModalFooter. Button variants, states, and event handlers are all correctly configured:

  • Reset button uses danger variant with proper loading/disabled states
  • Cancel button correctly uses link variant and is disabled during loading
  • The void operator on the async handler is appropriate
libs/ui-lib/lib/cim/components/Hypershift/modals/NodePoolForm.tsx (1)

97-97: LGTM! Appropriate use of horizontal term width modifier.

The addition of horizontalTermWidthModifier={{ default: '17ch' }} improves the visual alignment of the description list by setting a consistent term width for the "OpenShift version" label.

libs/ui-lib/lib/cim/components/modals/EditBMHModal.tsx (1)

2-2: LGTM! Proper migration to current PatternFly Modal API.

The migration correctly:

  • Updates imports from the deprecated path to @patternfly/react-core
  • Adds ModalHeader with the title instead of using the deprecated title prop on Modal
  • Preserves all existing functionality and accessibility attributes

Also applies to: 60-60

libs/ui-lib/lib/cim/components/modals/EditSSHKeyModal.tsx (1)

4-14: LGTM! Clean migration to PatternFly composition pattern.

The modal structure has been correctly updated to use:

  • ModalHeader for the title (line 59)
  • ModalBody wrapper for the form content (lines 78-92)
  • ModalFooter wrapper for action buttons (lines 93-101)

All existing form validation, submission logic, and content structure are properly preserved.

Also applies to: 59-59, 78-78, 92-101

libs/ui-lib/lib/cim/components/Agent/BMCForm.tsx (2)

16-17: LGTM! Proper migration to ModalBody and ModalFooter.

The component correctly wraps:

  • Form content in ModalBody (lines 278-346)
  • Action buttons in ModalFooter (lines 347-355)

This aligns with the current PatternFly modal composition pattern.

Also applies to: 278-278, 346-347, 355-355


304-306: LGTM! Correct prop migration from description to helperText.

The change from description to helperText aligns with PatternFly's current API for form fields. Both InputField and CodeField now use helperText instead of the deprecated description prop.

Also applies to: 328-330

libs/ui-lib/lib/cim/components/modals/EditProxyModal.tsx (2)

4-15: LGTM! Proper migration to current PatternFly Modal API.

The imports have been updated and ModalHeader is correctly used to render the modal title (line 86).

Also applies to: 86-86


49-60: LGTM! Correct modal composition structure.

The modal content is properly structured with:

  • ModalFooter wrapper in the Footer component (lines 49-60)
  • ModalBody wrapper for the form content (lines 106-122)

All form validation, submission logic, and error handling are preserved.

Also applies to: 106-106, 122-122

libs/ui-lib/lib/cim/components/Hypershift/modals/AddNodePoolModal.tsx (1)

2-13: LGTM - Modal migration follows PF6 composition pattern correctly.

The import updates and modal structure with ModalHeader, ModalBody, and ModalFooter are correctly implemented according to PatternFly 6 patterns.

Also applies to: 80-81

libs/ui-lib/lib/cim/components/modals/MassApproveAgentModal.tsx (1)

140-179: LGTM - Clean migration to PF6 Modal composition.

The modal structure correctly separates header, body, and footer. The existing logic for mass approval with progress tracking and error handling is preserved.

libs/ui-lib/lib/cim/components/modals/ScaleUpModal.tsx (1)

128-184: LGTM - Modal migration correctly preserves Formik integration.

The ModalHeader is appropriately placed outside the Formik render prop (since the title is static), while ModalBody and ModalFooter remain inside to access form state (isSubmitting, isValid, submitForm). The nested EditAgentModal pattern is preserved.

libs/ui-lib/lib/cim/components/Hypershift/modals/RemoveNodePoolModal.tsx (1)

29-78: LGTM - Proper use of warning modal pattern.

The migration correctly uses titleIconVariant="warning" on ModalHeader for the destructive action modal, and the danger button variant is appropriate. The async removal logic with loading spinner and error handling is preserved.

libs/ui-lib/lib/cim/components/Hypershift/modals/ManageHostsModal.tsx (1)

116-170: LGTM - Modal composition correctly integrated with Formik.

The migration properly separates header, body, and footer while maintaining access to Formik's form state for button disabling and submission.

libs/ui-lib/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx (1)

127-220: LGTM - Complex modal correctly migrated with conditional footer.

The migration handles the conditional footer logic well - showing Configure/Cancel buttons when isConfigure is true, otherwise a single Close button. The body content is well-organized with Stack and StackItem components, and the Formik integration is preserved.

libs/ui-lib/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.tsx (1)

204-204: LGTM - Text capitalization normalized.

The change from "Add Nodepool" to "Add nodepool" aligns with sentence case convention and is consistent with similar updates elsewhere in the PR (e.g., NodePoolsTable.tsx).

libs/ui-lib/lib/cim/components/Hypershift/DetailsPage/NodePoolsTable.tsx (1)

231-231: LGTM! Capitalization update aligned with translation changes.

The button label change from "Add Nodepool" to "Add nodepool" is consistent with the updated translation key in translation.json.

libs/ui-lib/lib/cim/components/modals/AddBmcHostYamlForm.tsx (1)

11-12: LGTM! Correct migration to PatternFly v6 modal composition.

The changes properly replace deprecated ModalBoxBody and ModalBoxFooter with the current ModalBody and ModalFooter components. The imports and usage are correctly updated, and the component structure is preserved.

Also applies to: 130-130, 215-216, 228-228

libs/locales/lib/en/translation.json (1)

66-66: LGTM! Translation key properly aligned with UI changes.

The translation key update from "ai:Add Nodepool" to "ai:Add nodepool" maintains consistency with the button label changes in the UI components.

libs/ui-lib/lib/cim/components/modals/AddBmcHostYamlModal.tsx (1)

2-2: LGTM! Consistent modal migration pattern.

The modal migration properly follows the PatternFly v6 composition pattern with ModalHeader and ModalBody. This implementation is consistent with the changes in AddBmcHostModal.tsx.

Note: The inModal prop passed to EnvironmentErrors (line 27) should be verified as mentioned in the review comment for AddBmcHostModal.tsx.

Also applies to: 25-31

libs/ui-lib/lib/cim/components/modals/AddHostModal.tsx (2)

3-11: LGTM: Imports updated correctly for PatternFly modal composition.

The imports now include ModalBody and ModalHeader to support the new modal structure, following the PF6 composition pattern.


69-69: LGTM: Modal header correctly extracted.

The title is now handled by the dedicated ModalHeader component, and the pluralization from "Add host" to "Add hosts" aligns with the modal's purpose.

libs/ui-lib/lib/cim/components/modals/EditNtpSourcesModal.tsx (1)

2-14: LGTM: Clean migration to PatternFly modal composition.

The modal has been correctly updated to use ModalHeader, ModalBody, and ModalFooter components, replacing the deprecated PatternFly modal structure. The Formik form logic and validation flow are preserved without changes.

Also applies to: 48-48, 72-114, 115-123

libs/ui-lib/lib/cim/components/InfraEnv/EnvironmentErrors.tsx (2)

16-52: LGTM: Component correctly simplified for inline rendering.

The removal of the inModal conditional wrapper logic aligns with the PatternFly modal composition pattern, where parent modals now provide the ModalBody wrapper. This makes the component simpler and more reusable.


9-14: The type definition is correct as-is. While the EnvironmentErrors component doesn't destructure the inModal prop in its implementation, all three callers (AddHostModal.tsx, AddBmcHostModal.tsx, and AddBmcHostYamlModal.tsx) still pass this prop. Removing it from the type definition would break these existing usages. This is valid React code—components are not required to use all props they receive.

@jgyselov jgyselov force-pushed the pf6_cim_modal_component branch from 456c375 to ad9898c Compare January 2, 2026 11:40
@openshift-ci-robot
Copy link

openshift-ci-robot commented Jan 2, 2026

@jgyselov: This pull request references MGMT-22505 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the sub-task to target the "4.22.0" version, but no target version was set.

Details

In response to this:

https://issues.redhat.com/browse/MGMT-22505

Summary by CodeRabbit

  • Refactor

  • Updated modal dialogs across the app to the current header/body/footer composition for consistency and maintainability.

  • Simplified EnvironmentErrors by removing its internal modal wrapper and streamlining inline rendering.

  • Adjusted certain form field text to use helper text for improved clarity and accessibility.

  • Style

  • Standardized button text from "Add Nodepool" to "Add nodepool".

  • Improved spacing and layout in node pool and related forms.

✏️ Tip: You can customize this high-level summary in your review settings.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@jgyselov
Copy link
Contributor Author

jgyselov commented Jan 2, 2026

/retest

@jgyselov jgyselov added this to the v2.17-cim milestone Jan 7, 2026
@jgyselov jgyselov force-pushed the pf6_cim_modal_component branch from ad9898c to 383ddfa Compare January 12, 2026 09:28
@openshift-ci-robot
Copy link

openshift-ci-robot commented Jan 12, 2026

@jgyselov: This pull request references MGMT-22505 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the sub-task to target the "4.22.0" version, but no target version was set.

Details

In response to this:

https://issues.redhat.com/browse/MGMT-22505

Summary by CodeRabbit

  • Refactor

  • Updated modal dialogs across the app to a consistent header/body/footer composition for improved accessibility and predictable closing behavior.

  • Simplified EnvironmentErrors to render inline instead of an internal modal wrapper.

  • Moved modal actions into explicit footers for clearer action placement.

  • Style

  • Standardized button text from "Add Nodepool" to "Add nodepool".

  • Adjusted form helper text and spacing for improved clarity and layout.

✏️ Tip: You can customize this high-level summary in your review settings.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

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

🤖 Fix all issues with AI agents
In @libs/ui-lib/lib/cim/components/modals/AddHostModal.tsx:
- Around line 69-110: The AddHostModal currently wraps children including
DiscoveryImageConfigForm (which itself renders ModalBody/ModalFooter) with an
outer ModalBody, creating nested ModalBody components; remove the outer
ModalBody wrapper in AddHostModal (keep EnvironmentErrors but render its
children directly) and instead conditionally wrap only the download branches
(GeneratingIsoDownload / GeneratingIPXEDownload) in a ModalBody when those
components do not render their own ModalBody, or refactor
DiscoveryImageConfigForm to not output ModalBody/ModalFooter and keep a single
ModalBody in AddHostModal so ModalBody is rendered exactly once per modal.
🧹 Nitpick comments (1)
libs/ui-lib/lib/cim/components/modals/EditNtpSourcesModal.tsx (1)

107-111: Consider adding isInline to the error Alert for consistency.

Other modals in this PR (e.g., EditProxyModal, MassApproveAgentModal) use isInline on their Alert components. Consider adding it here for visual consistency.

Suggested change
                     {error && (
                       <StackItem>
-                        <Alert variant="danger" title={error} />
+                        <Alert variant="danger" title={error} isInline />
                       </StackItem>
                     )}
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ad9898c and 383ddfa.

📒 Files selected for processing (23)
  • apps/assisted-disconnected-ui/src/components/ResetSingleClusterModal.tsx
  • libs/locales/lib/en/translation.json
  • libs/ui-lib/lib/cim/components/Agent/BMCForm.tsx
  • libs/ui-lib/lib/cim/components/Agent/MinimalHWRequirements.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/DetailsPage/NodePoolsTable.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/modals/AddNodePoolModal.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/modals/ManageHostsModal.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/modals/NodePoolForm.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/modals/RemoveNodePoolModal.tsx
  • libs/ui-lib/lib/cim/components/InfraEnv/EnvironmentErrors.tsx
  • libs/ui-lib/lib/cim/components/modals/AddBmcHostModal.tsx
  • libs/ui-lib/lib/cim/components/modals/AddBmcHostYamlForm.tsx
  • libs/ui-lib/lib/cim/components/modals/AddBmcHostYamlModal.tsx
  • libs/ui-lib/lib/cim/components/modals/AddHostModal.tsx
  • libs/ui-lib/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx
  • libs/ui-lib/lib/cim/components/modals/EditBMHModal.tsx
  • libs/ui-lib/lib/cim/components/modals/EditNtpSourcesModal.tsx
  • libs/ui-lib/lib/cim/components/modals/EditProxyModal.tsx
  • libs/ui-lib/lib/cim/components/modals/EditPullSecretModal.tsx
  • libs/ui-lib/lib/cim/components/modals/EditSSHKeyModal.tsx
  • libs/ui-lib/lib/cim/components/modals/MassApproveAgentModal.tsx
  • libs/ui-lib/lib/cim/components/modals/ScaleUpModal.tsx
🚧 Files skipped from review as they are similar to previous changes (15)
  • libs/ui-lib/lib/cim/components/modals/EditBMHModal.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/modals/ManageHostsModal.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/DetailsPage/NodePoolsTable.tsx
  • libs/ui-lib/lib/cim/components/modals/AddBmcHostYamlModal.tsx
  • libs/ui-lib/lib/cim/components/Agent/BMCForm.tsx
  • libs/ui-lib/lib/cim/components/Agent/MinimalHWRequirements.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/modals/AddNodePoolModal.tsx
  • libs/ui-lib/lib/cim/components/modals/ScaleUpModal.tsx
  • libs/ui-lib/lib/cim/components/modals/AddBmcHostYamlForm.tsx
  • libs/ui-lib/lib/cim/components/Hypershift/modals/RemoveNodePoolModal.tsx
  • libs/ui-lib/lib/cim/components/modals/EditPullSecretModal.tsx
  • libs/ui-lib/lib/cim/components/modals/EditSSHKeyModal.tsx
  • libs/locales/lib/en/translation.json
  • libs/ui-lib/lib/cim/components/Hypershift/modals/NodePoolForm.tsx
  • libs/ui-lib/lib/cim/components/modals/AddBmcHostModal.tsx
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: linoyaslan
Repo: openshift-assisted/assisted-installer-ui PR: 3190
File: libs/ui-lib/lib/ocm/components/clusterConfiguration/networkConfiguration/networkConfigurationValidation.ts:69-69
Timestamp: 2025-10-19T17:22:52.502Z
Learning: CIM UI changes in the repository openshift-assisted/assisted-installer-ui (e.g., files under libs/ui-lib/lib/cim/) are handled separately by the CIM team and should be tracked via separate issues rather than being included in PRs for other UI components.
📚 Learning: 2025-12-17T09:16:41.439Z
Learnt from: jgyselov
Repo: openshift-assisted/assisted-installer-ui PR: 3319
File: libs/ui-lib/lib/common/components/hosts/utils.ts:208-210
Timestamp: 2025-12-17T09:16:41.439Z
Learning: In libs/ui-lib/lib/common/components/hosts/utils.ts, the nodeLabels field on Host objects is guaranteed to be valid JSON because it's always constructed using JSON.stringify in libs/ui-lib/lib/cim/components/helpers/toAssisted.ts, making direct JSON.parse safe without additional error handling.

Applied to files:

  • libs/ui-lib/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.tsx
🧬 Code graph analysis (1)
libs/ui-lib/lib/cim/components/modals/AddHostModal.tsx (2)
libs/ui-lib/lib/cim/components/InfraEnv/EnvironmentErrors.tsx (1)
  • EnvironmentErrors (15-52)
libs/ui-lib/lib/common/components/clusterConfiguration/DiscoveryImageConfigForm.tsx (1)
  • DiscoveryImageConfigForm (83-165)
🔇 Additional comments (11)
libs/ui-lib/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.tsx (1)

204-204: LGTM!

The capitalization standardization from "Add Nodepool" to "Add nodepool" is consistent with the parallel changes in NodePoolsTable.tsx and the translation file. This improves UI text consistency across the application.

libs/ui-lib/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx (4)

11-15: LGTM!

The imports correctly use the non-deprecated PatternFly modal components (Modal, ModalHeader, ModalBody, ModalFooter). This aligns with the PR objective of stopping usage of deprecated Modal components.


134-141: LGTM!

The modal structure correctly follows the PatternFly 6 composed pattern with ModalHeader containing the title, while aria-label remains on the Modal for accessibility. The migration from deprecated props to composed children is properly implemented.


191-217: LGTM!

The footer correctly implements conditional rendering based on isConfigure state, showing Configure/Cancel buttons for the configuration flow and a Close button otherwise. The void handleSubmit() pattern on line 204 properly handles the async form submission.


142-189: LGTM!

The modal body content is well-structured using Stack and StackItem for consistent spacing. The error alert (lines 152-162) is properly guarded by isError, and the storage size warning (lines 180-188) is appropriately shown only during configuration mode. All child component props are correctly preserved.

apps/assisted-disconnected-ui/src/components/ResetSingleClusterModal.tsx (1)

59-103: LGTM! Clean migration to composed Modal structure.

The modal correctly uses the modern PatternFly composition pattern with ModalHeader, ModalBody, and ModalFooter. The warning icon variant is appropriate for this destructive reset action, and button states are properly managed.

libs/ui-lib/lib/cim/components/modals/EditNtpSourcesModal.tsx (1)

40-128: LGTM! Modal structure correctly migrated.

The migration properly places ModalHeader before the Formik component and wraps the form content in ModalBody with actions in ModalFooter.

libs/ui-lib/lib/cim/components/modals/EditProxyModal.tsx (2)

45-62: Nice extraction of the Footer component.

The Footer component cleanly encapsulates the form submission logic using useFormikContext, making the code more modular while maintaining proper access to Formik's state.


79-127: LGTM! Modal structure correctly migrated.

The modal properly uses the composed structure with ModalHeader outside Formik and the Footer component correctly positioned to access Formik context.

libs/ui-lib/lib/cim/components/InfraEnv/EnvironmentErrors.tsx (1)

23-51: Verify: Errors now block children rendering.

When infraEnv.status is falsy or there are failing alerts, the component returns only the error UI without rendering children. This appears intentional as a blocking error state, but confirm this matches the expected UX—users won't see the form/content when there are infrastructure environment errors.

libs/ui-lib/lib/cim/components/modals/MassApproveAgentModal.tsx (1)

140-180: LGTM! Modal structure correctly migrated.

The migration properly separates header, body, and footer. The progress-based button disabling logic is preserved correctly.

@jgyselov jgyselov force-pushed the pf6_cim_modal_component branch 2 times, most recently from ea0b867 to 345bfbb Compare January 12, 2026 09:52
@openshift-merge-robot openshift-merge-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jan 19, 2026
@jgyselov jgyselov force-pushed the pf6_cim_modal_component branch from 345bfbb to 8b6ec92 Compare January 20, 2026 07:55
@openshift-merge-robot openshift-merge-robot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jan 20, 2026
@openshift-ci-robot
Copy link

openshift-ci-robot commented Jan 20, 2026

@jgyselov: This pull request references MGMT-22505 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the sub-task to target the "4.22.0" version, but no target version was set.

Details

In response to this:

https://issues.redhat.com/browse/MGMT-22505

Summary by CodeRabbit

  • Refactor

  • Updated modal dialogs to a consistent header/body/footer composition for improved accessibility and predictable closing behavior.

  • Simplified environment error display to render inline instead of using an internal modal wrapper.

  • Moved modal actions into explicit footers for clearer, consistent action placement.

  • Style

  • Standardized button text from "Add Nodepool" to "Add nodepool".

  • Adjusted form helper text and spacing for improved clarity and layout.

✏️ Tip: You can customize this high-level summary in your review settings.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

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

🤖 Fix all issues with AI agents
In `@libs/ui-lib/lib/cim/components/Hypershift/DetailsPage/NodePoolsTable.tsx`:
- Line 231: Update the inconsistent translation key casing so both buttons
match: change the usage of t('ai:Remove Nodepool') to t('ai:Remove nodepool')
(matching the existing t('ai:Add nodepool') casing). Locate the occurrences of
the translation keys in NodePoolsTable.tsx (references to t('ai:Add nodepool')
and t('ai:Remove Nodepool')), update the latter to use the lowercase "nodepool"
key, and run a quick build or i18n check to ensure the translation lookup still
resolves.
🧹 Nitpick comments (2)
libs/ui-lib/lib/cim/components/modals/EditPullSecretModal.tsx (1)

80-101: Keep the submit error inside the Stack for consistent gutter spacing.
Line 84-Line 88 renders a StackItem outside a Stack, so it won’t receive the stack’s spacing rules. Consider nesting it inside the existing Stack to keep layout consistent.

♻️ Proposed tweak
       <ModalBody>
         <Stack hasGutter>
           <StackItem>{body}</StackItem>
-        </Stack>
-        {submitError && (
-          <StackItem>
-            <Alert title={submitError} variant="danger" isInline />
-          </StackItem>
-        )}
+          {submitError && (
+            <StackItem>
+              <Alert title={submitError} variant="danger" isInline />
+            </StackItem>
+          )}
+        </Stack>
       </ModalBody>
libs/ui-lib/lib/cim/components/Hypershift/modals/AddNodePoolModal.tsx (1)

84-86: Consider improving nodepool name uniqueness.

Using Math.floor(Math.random() * 100) for the nodepool name suffix provides only 100 possible values, which could lead to naming collisions in environments with many nodepools. Consider using a more robust approach such as a UUID fragment or timestamp.

♻️ Optional: Use more unique suffix
 initialValues={{
-  nodePoolName: `nodepool-${hostedCluster.metadata?.name || ''}-${Math.floor(
-    Math.random() * 100,
-  )}`,
+  nodePoolName: `nodepool-${hostedCluster.metadata?.name || ''}-${Date.now().toString(36).slice(-4)}`,
   agentLabels: [],

Or use a larger random range:

-  nodePoolName: `nodepool-${hostedCluster.metadata?.name || ''}-${Math.floor(
-    Math.random() * 100,
-  )}`,
+  nodePoolName: `nodepool-${hostedCluster.metadata?.name || ''}-${Math.random().toString(36).slice(2, 7)}`,

@jgyselov jgyselov force-pushed the pf6_cim_modal_component branch from 8b6ec92 to d3b9b0e Compare January 20, 2026 08:44
@openshift-ci-robot
Copy link

openshift-ci-robot commented Jan 20, 2026

@jgyselov: This pull request references MGMT-22505 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the sub-task to target the "4.22.0" version, but no target version was set.

Details

In response to this:

https://issues.redhat.com/browse/MGMT-22505

Summary by CodeRabbit

  • Refactor

  • Updated modal dialogs to a consistent header/body/footer composition and moved actions into explicit footers for clearer, more predictable dialogs.

  • Environment error UI now renders inline within pages instead of inside modal wrappers.

  • Style

  • Standardized capitalization of nodepool actions to "Add nodepool" / "Remove nodepool".

  • Adjusted form helper text and spacing for improved clarity and layout.

✏️ Tip: You can customize this high-level summary in your review settings.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
libs/ui-lib/lib/cim/components/modals/AddHostModal.tsx (1)

69-108: Alerts rendered without ModalBody wrapper when errors occur.

When EnvironmentErrors detects errors (e.g., !infraEnv.status), it renders alerts directly and does not render children. Since there's no ModalBody wrapper around EnvironmentErrors here, the error alerts will render directly inside the Modal without proper body styling.

This differs from AddBmcHostModal.tsx and AddBmcHostYamlModal.tsx where EnvironmentErrors is wrapped in ModalBody.

Suggested fix - Wrap EnvironmentErrors in ModalBody for error states

One option is to have EnvironmentErrors wrap its error output in ModalBody when used in this context, or add conditional wrapping here. However, since DiscoveryImageConfigForm already provides its own ModalBody, you may need to refactor EnvironmentErrors to accept a wrapper prop or handle this at the call site.

A simpler approach if acceptable:

       <ModalHeader title={t('ai:Add hosts')} />
+      <ModalBody>
-      <EnvironmentErrors infraEnv={infraEnv} docVersion={docVersion}>
+        {(!infraEnv.status || getFailingResourceConditions(infraEnv, ['ImageCreated']).length > 0) ? (
+          <EnvironmentErrors infraEnv={infraEnv} docVersion={docVersion} />
+        ) : (
         {dialogType === 'config' && (
-          <DiscoveryImageConfigForm
+          // Note: DiscoveryImageConfigForm has internal ModalBody - may need refactoring

Consider verifying that the current error state layout is acceptable or aligning the structure with other modals.

🧹 Nitpick comments (2)
libs/ui-lib/lib/cim/components/Agent/MinimalHWRequirements.tsx (1)

110-119: Confirm close icon behavior in composed ModalHeader.
Please verify that PatternFly 6’s composed modal still renders the standard header close control with onClose on Modal, or add the appropriate prop to ModalHeader if required. This keeps expected UX/accessibility even with the footer Close button.

libs/ui-lib/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx (1)

192-212: LGTM!

Footer correctly implements the conditional action pattern:

  • Configure/Cancel buttons when isConfigure is true
  • Close button when in view-only mode
  • Form submission properly wired through handleSubmit

Minor: The double negation on line 198 is unnecessary since the expression already evaluates to a boolean:

♻️ Optional simplification
-                  isDisabled={!!(isSubmitting || !isValid)}
+                  isDisabled={isSubmitting || !isValid}

@openshift-ci openshift-ci bot added the lgtm Indicates that a PR is ready to be merged. label Jan 21, 2026
@openshift-ci
Copy link

openshift-ci bot commented Jan 21, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: jgyselov, LiorSoffer

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-merge-bot openshift-merge-bot bot merged commit 81ef26a into openshift-assisted:master Jan 21, 2026
12 checks passed
@openshift-cherrypick-robot
Copy link
Contributor

@jgyselov: #3343 failed to apply on top of branch "releases/v2.17-cim":

Applying: Stop using deprecate Modal component in CIM
Using index info to reconstruct a base tree...
M	libs/locales/lib/en/translation.json
M	libs/ui-lib/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.tsx
M	libs/ui-lib/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx
M	libs/ui-lib/lib/cim/components/modals/EditSSHKeyModal.tsx
M	libs/ui-lib/lib/cim/components/modals/MassApproveAgentModal.tsx
Falling back to patching base and 3-way merge...
Auto-merging libs/ui-lib/lib/cim/components/modals/MassApproveAgentModal.tsx
Auto-merging libs/ui-lib/lib/cim/components/modals/EditSSHKeyModal.tsx
CONFLICT (content): Merge conflict in libs/ui-lib/lib/cim/components/modals/EditSSHKeyModal.tsx
Auto-merging libs/ui-lib/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx
CONFLICT (content): Merge conflict in libs/ui-lib/lib/cim/components/modals/CimConfiguration/CimConfigurationModal.tsx
Auto-merging libs/ui-lib/lib/cim/components/Hypershift/HostedClusterWizard/HostsStep/HostsForm.tsx
Auto-merging libs/locales/lib/en/translation.json
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch=diff' to see the failed patch
hint: When you have resolved this problem, run "git am --continue".
hint: If you prefer to skip this patch, run "git am --skip" instead.
hint: To restore the original branch and stop patching, run "git am --abort".
hint: Disable this message with "git config set advice.mergeConflict false"
Patch failed at 0001 Stop using deprecate Modal component in CIM

Details

In response to this:

/cherry-pick releases/v2.17-cim

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged. size/XL Denotes a PR that changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants