-
Notifications
You must be signed in to change notification settings - Fork 22
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
Migrate deprecated Wizard component to PF5 and fix Wizard's focus issue #1428
base: main
Are you sure you want to change the base?
Migrate deprecated Wizard component to PF5 and fix Wizard's focus issue #1428
Conversation
shouldFocusContent | ||
title={title} | ||
startIndex={startAtStep} | ||
onClose={() => history.goBack()} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this can be a bit problematic sometimes, for example if someone enter directly to wizard URL, onclose will send out of the app - consider navigate to a list page
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I fixed it as follows:
If the wizard is triggered by the provider - vms tab => cancel will navigate back to the provider - vms tab
If the wizard is triggered by the plans list page => cancel will navigate back to the plans list page
If the wizard is triggered by entering the wizard url directly => cancel will navigate back to the plans list page.
This is another bug fix, so added that to main comment as well.
Object.values(state?.validation || []).some( | ||
(validation) => validation === 'error', | ||
) || | ||
state?.validation?.planName === 'default', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
seems like state.validation can be object or array?
also consider extracting it to a isDsiabled func
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
validation
is an object property within the CreateVmMigrationPageState
interface, this huge state object is very complicated to track and debug as is so I prefer to leave it and not extract it to a local env.
But I extract it to separate funcs to make it more readable.
9bfc03d
to
c2c63c6
Compare
Codecov ReportAll modified and coverable lines are covered by tests ✅
❗ Your organization needs to install the Codecov GitHub app to enable full functionality. Additional details and impacted files@@ Coverage Diff @@
## main #1428 +/- ##
==========================================
- Coverage 36.81% 36.20% -0.62%
==========================================
Files 158 159 +1
Lines 2548 2580 +32
Branches 599 616 +17
==========================================
- Hits 938 934 -4
- Misses 1428 1451 +23
- Partials 182 195 +13 ☔ View full report in Codecov by Sentry. |
packages/forklift-console-plugin/src/modules/Plans/views/create/PlanCreatePage.tsx
Outdated
Show resolved
Hide resolved
packages/forklift-console-plugin/src/modules/Plans/views/create/PlanCreatePage.tsx
Show resolved
Hide resolved
title={title} | ||
startIndex={startAtStep} | ||
onClose={() => | ||
window.location.replace(createPlanFromPlansList ? plansListURL : `${providerURL}/vms`) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why touch the direct window location and not use navigate from the useNavigate hook?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The navigate hook is supported by React Router v6: https://reactrouter.com/en/v6.3.0/upgrading/v5#use-usenavigate-instead-of-usehistory.
The kubevirt plugin and console code are still using [email protected]
with react-router-dom-v5-compat
and no usage found for the useNavigate
.
I tried using react-router-dom-v5-compat
here as wel,l just to be aligned, but it doesn't help of course and I'm not sure we can upgrade to 6 before the console does.
Are you aware of a plugin using the useNavigate hook?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
so u have history() form use* hook of react-router lib,
BTW this is also a tech debt as the console will stop supporting router v5
(validation) => validation === 'error', | ||
); | ||
|
||
const planNameValidationDefault = state?.validation?.planName === 'default'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
consider useMemo
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The state is fetched using the useFetchEffects
and I can't really calculate all the dependencies, so there is no real advantage in using useMemo
here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what do u mean by I cant calculate all dependences?
there is only 1 dep which is state , u have many other values in this file that will cause to rerender, that arent related to the state
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The whole State
changed after almost every change so it's not effective (checked). I added useMemo
and changed the dep to use the specific state?.validation?.planName
here...
const anyValidationError = Object.values(state?.validation || []).some( | ||
(validation) => validation === 'error', | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
consider useMemo and extract to a util file
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Extracted to a util file.
Regarding useMemo
- again since it's fetched from the big migration state, see my comment above.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As mentioned in previous comment, state
is changed a lot and as a result, the validations, so there is no point in adding useMemo
here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
other parts in this component are causing rerenders that aren't related to the state - so you will run this even if the state isn't changing.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the useMemo should have only state as a dep
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@metalice I'll change it as you request,
but have a general best practices question:
React's memorization tools make the code less readable and a bit more complicated and therefore if there is no real influence on performance that can be visible or we know in advance that might happen in scaled envs, why using it always?
What are the cases that we can avoid using memo hooks?
packages/forklift-console-plugin/src/modules/Plans/views/create/PlanCreatePage.tsx
Outdated
Show resolved
Hide resolved
packages/forklift-console-plugin/src/modules/Plans/views/create/PlanCreatePage.tsx
Outdated
Show resolved
Hide resolved
c2c63c6
to
c77613c
Compare
c77613c
to
9f8cb80
Compare
References: https://issues.redhat.com/browse/MTV-1051 https://issues.redhat.com/browse/MTV-1863 1. Migrate the deprecated Wizard component to PF5 - see https://v5-archive.patternfly.org/components/wizard/react-deprecated 2. When moving between steps in plan wizard, set the initial focus to the top of the step's page. Signed-off-by: Sharon Gratch <[email protected]>
9f8cb80
to
c2baf0d
Compare
Quality Gate passedIssues Measures |
References:
https://issues.redhat.com/browse/MTV-1051
https://issues.redhat.com/browse/MTV-1863
Wizard
component to PF5 - see https://v5-archive.patternfly.org/components/wizard/react-deprecatedCancel
button within the wizard, instead of always navigating tohistory.goBack()
,the following happens now:
If the wizard is triggered by the provider - vms tab => cancel will navigate back to the provider - vms tab
If the wizard is triggered by the plans list page => cancel will navigate back to the plans list page
If the wizard is triggered by entering the wizard url directly => cancel will navigate back to the plans list page.
Screencasts
Before
Screencast.from.2025-01-06.18-33-35.webm
After
Screencast.from.2025-01-06.18-38-54.webm