-
Notifications
You must be signed in to change notification settings - Fork 2.8k
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: Added keyboard navigation to Compose Actions Menu #7846
feat: Added keyboard navigation to Compose Actions Menu #7846
Conversation
@parasharrajat @puneetlath PR Raised. Questions:
|
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.
Hmm. I checked Arrow keys, not Tab. So should we also change |
Tab movement automatically works. You just need to adjust the Border UI>
All should focus on the item. Which it does but UI needs to be adjusted. @mananjadhav could you please record a video for all in the above list. So that we can assess UI. cc: @Expensify/design |
Done
It works but is not in sync with Arrow keys. If I am at the second menu item, pressing the Tab should take me to the third menu item, it doesn't. What I'll have to do is update screen-recording-2022-02-20-at-92930-pm_NZ1mw0Ef.mp4 |
Yeah, That as well. Thanks for bringing this up. You can use the OnFocus event. That should suffice. |
It looks like tabbing between menu items causes the items to slightly jump around. Could you please take a look at that? Perhaps it's due to the outline style that's being applied, but it looks like we're getting small 1-2px movements. I think the menu should stay perfectly in place and not move around, and you should only see outline styles being applied to the focused item. |
I agree with @shawnborton 's comment. This is happening as the not-focused item does not have any border but focused has which takes 1px on each edge. To fix this, I think we should use a transparent border for not-focused state so it does not cause a layout shift. |
…eyboard-navigation-actions-menu
cc: @mananjadhav ⬆️ |
@mananjadhav Do you think we can reuse code from #7702? I was hoping to create a generic utility to manage arrow navigation as this is common to a few components but It seems Rory already created it in the linked PR. We can reuse that in this PR. Let's hold it till that PR is merged. |
Was reviewing. Yeah looks like we can reuse. Lets wait for it to get merged. |
Please use HOLD in the title for clear indication. |
@roryabraham @parasharrajat PR is updated by making the keyboard navigation available by default. Also updated the screencasts and QA steps for the additional components. Please take a look. I found one issue, which isn't related to my change afaik, when clicking the menu items in the |
Thanks for adding screenshots and QA steps! However, I'm not able to reproduce the ThreeDotsMenu issue on staging, so I think we need to address it here |
In the current PR, it works fine for all the other components, except for ThreeDotsMenu. Let me check once again. Thanks for pointing it out. |
It looks like what's happening is:
Something like that |
@roryabraham @parasharrajat Fix added for |
Reviewing now. |
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 have verified the author checklist is complete (all boxes are checked off).
- I verified the correct issue is linked in the
### Fixed Issues
section above - I verified testing steps are clear and they cover the changes made in this PR
- I verified the steps for local testing are in the
Tests
section - I verified the steps for Staging and/or Production testing are in the
QA steps
section - I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
- I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
- I verified the steps for local testing are in the
- I checked that screenshots or videos are included for tests on all platforms
- I verified tests pass on all platforms & I tested again on:
- iOS / native
- Android / native
- iOS / Safari
- Android / Chrome
- MacOS / Chrome
- MacOS / Desktop
- I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
- I verified proper code patterns were followed (see Reviewing the code)
- I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e.
toggleReport
and notonIconClick
). - I verified that comments were added to code that is not self explanatory
- I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
- I verified any copy / text shown in the product was added in all
src/languages/*
files - I verified any copy / text that was added to the app is correct English and approved by marketing by tagging the marketing team on the original GH to get the correct copy.
- I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
- I verified the JSDocs style guidelines (in
STYLE.md
) were followed
- I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e.
- If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
- I verified that this PR follows the guidelines as stated in the Review Guidelines
- I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like
Avatar
, I verified the components usingAvatar
have been tested & I retested again) - I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
- I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
- If a new component is created I verified that:
- A similar component doesn't exist in the codebase
- All props are defined accurately and each prop has a
/** comment above it */
- Any functional components have the
displayName
property - The file is named correctly
- The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
- The only data being stored in the state is data necessary for rendering and nothing else
- For Class Components, any internal methods passed to components event handlers are bound to
this
properly so there are no scoping issues (i.e. foronClick={this.submit}
the methodthis.submit
should be bound tothis
in the constructor) - Any internal methods bound to
this
are necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);
ifthis.submit
is never passed to a component event handler likeonClick
) - All JSX used for rendering exists in the render method
- The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
- If a new CSS style is added I verified that:
- A similar style doesn't already exist
- The style can't be created with an existing StyleUtils function (i.e.
StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG
)
- If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like
Avatar
is modified, I verified thatAvatar
is working as expected in all cases) - If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
- I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.
LGTM and tests well |
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.
Code lgtm! Great job @mananjadhav being persistent with this issue!
Merging this because I think the checklist PR checks are not working as expected |
@roryabraham looks like this was merged without passing tests. Please add a note explaining why this was done and remove the |
Not an emergency, see above comment |
Echoing @mountiny's sentiment above, thanks so much for your patience and persistence with this issue. I love how we really applied this solution in a generalized way across the app |
This was using an old checklist, please make sure to use the latest one from |
Ah, my mistake! Thanks @AndrewGable |
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.
Lol, this is merged by my testing is still not completed. The List is very big. But code is looking good.
this.state = { | ||
isPopupMenuVisible: false, | ||
}; | ||
this.button = null; |
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.
NAB: Not needed.
Do ping me if you find anything and I'll try to quickly raise another PR to address any issue/bug. |
🚀 Deployed to staging by @roryabraham in version: 1.1.98-0 🚀
|
I forgot to leave the note here. Everything is looking good. I didn't find any issues caused by this PR. Just for Automation's sake... PR Reviewer Checklist
🎀 👀 🎀 C+ reviewed |
Details
Compose Actions Menu<PopoverMenu />
ArrowKeyFocusManager
andKeyboardShortcuts
lib for keyboard handling.-
ReportActionComposer
, additional actions menu consistingRequest Money
,Split Money
andAdd Attachment
-
FAB Menu/Sidebar Screen
, which pops up when clicking the green floating action Menu-
AvatarImagePicker
, which can be tested with Profile Picture-
Payments List
, which pops up when clicking Add Payment Methods-
ButtonWithMenu
component, which is available when we select the Payment method when settling IOU-
ThreeDotsMenu /Workspace Menu
, which is visible on the workspace RHS headerFixed Issues
$ #7317
Tests
QA Steps
Web and Desktop
A. Report Action Composer
Enter
key it should open the respective menu.a. Request Money, it should Request Money RHS
b. Send Money, should open Send Money RHS
c. Add attachment, should open File Picker
B. Payment Method List
Enter
key it should open the respective menu.a. Debit Card, should open the Add Debit card page
b. Bank Account, should open the Plaid popup
C. Sidebar Screen/FAB Menu
Enter
key it should open the respective menu.a. New Chat, should open New chat search screen
b. New Group, should open Search Member selection screen
c. Send Money, should open IOU Amount screen, with title "Send Money"
d. Request Money, should open IOU Amount screen, with title "Request Money"
c. Split Bill, should open IOU Amount screen, with title "Split Bill"
D. Button with Menu (IOU Payments Settlement options)
E. Avatar Picker / Profile Picture
F. Workspace Menu/Three Dots Menu
Enter
key it should do the following:a. "New Workspace", should create a new Workspace
b. "Delete Workspace", should open the confirm delete popup.
Mobile Web, iOS and Android App
A. Report Action Composer
B. Payment Method List
C. Sidebar Screen/FAB Menu
D. Button with Menu (IOU Payments Settlement options)
E. Avatar Picker / Profile Picture
F. Workspace Menu/Three Dots Menu
Enter
key it should do the following:a. "New Workspace", should create a new Workspace
b. "Delete Workspace", should open the confirm delete popup.
PR Review Checklist
Contributor (PR Author) Checklist
### Fixed Issues
section aboveTests
sectionQA steps
sectiontoggleReport
and notonIconClick
)src/languages/*
filesSTYLE.md
) were followedAvatar
, I verified the components usingAvatar
are working as expected)/** comment above it */
displayName
propertythis
properly so there are no scoping issues (i.e. foronClick={this.submit}
the methodthis.submit
should be bound tothis
in the constructor)this
are necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);
ifthis.submit
is never passed to a component event handler likeonClick
)StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG
)Avatar
is modified, I verified thatAvatar
is working as expected in all cases)Screenshots
Web
Composer Menu
web-compose-menu-keyboard-nav.mp4
Sidebar Screen
web-keyboard-nav-sidebar-screen_WtH8rIlj.mp4
Avatar Image Picker
web-keyboard-nav-avatar-picker_xOlxmbxf.mp4
Button with Menu
web-keyboard-nav-button-with-menu_TRtqcUdP.mp4
Payments Menu
web-keyboard-nav-payments-menu_hVMmGCdR.mp4
Workspace Menu/Three Dots Menu
web-keyboard-nav-threedots-menu.mp4
Mobile Web
mweb-compose-menu-keyboard-nav.mp4
Desktop
Composer Menu
desktop-compose-menu-keyboard-nav.mp4
All Components (mentioned in the Web individually)
desktop-keyboard-nav-all-components_W1LqyYy5.mp4
Workspace/ThreeDots Menu (revised)
desktop-keyboard-nav-threedots-menu.mp4
iOS
ios-compose-menu-keyboard-nav.mp4
Android
android-compose-menu-keyboard-nav.mp4