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

Update RequestStepCategory to add Empty and Loading states for category list #41344

Conversation

ZhenjaHorbach
Copy link
Contributor

@ZhenjaHorbach ZhenjaHorbach commented Apr 30, 2024

Details

Not here page is briefly displayed when selecting a workspace

Fixed Issues

$ #40999
$ #41143
PROPOSAL: #40999 (comment)

Tests

  1. Sing up with a new account
  2. Create manual expense in Self DM
  3. Create workspace
  4. Navigate to the self DM
  5. Click on 'Categorize it' under the new expense
  6. Select the new workspace
  7. Verify that the loader or list of elements are shown instead of Not here
  8. Open workspace setting and open categories
  9. Remove all items
  10. Navigate to the self DM
  11. Click on 'Categorize it'
  12. Select the workspace with removed categories
  13. Verify that the component is displayed indicating an empty list
  • Verify that no errors appear in the JS console

Offline tests

  1. Sing up with a new account
  2. Create manual expense in Self DM
  3. Create workspace
  4. Navigate to the self DM
  5. Click on 'Categorize it' under the new expense
  6. Select the new workspace
  7. Verify that the loader or list of elements are shown instead of Not here
  8. Open workspace setting and open categories
  9. Remove all items
  10. Navigate to the self DM
  11. Click on 'Categorize it'
  12. Select the workspace with removed categories
  13. Verify that the component is displayed indicating an empty list

QA Steps

  1. Sing up with a new account
  2. Create manual expense in Self DM
  3. Create workspace
  4. Navigate to the self DM
  5. Click on 'Categorize it' under the new expense
  6. Select the new workspace
  7. Verify that the loader or list of elements are shown instead of Not here
  8. Open workspace setting and open categories
  9. Remove all items
  10. Navigate to the self DM
  11. Click on 'Categorize it'
  12. Select the workspace with removed categories
  13. Verify that the component is displayed indicating an empty list
  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover 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 tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
    • 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 followed proper code patterns (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 not onIconClick)
    • I verified that the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
    • 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 is localized by adding it to src/languages/* files and using the translation method
      • If any non-english text was added/modified, I verified the translation was requested/reviewed in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • 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
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • 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
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • 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(theme.componentBG))
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • 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 that Avatar 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.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
2024-05-08.21.25.42.mov
Android: mWeb Chrome
2024-05-08.21.25.42.mov
iOS: Native
2024-05-08.21.22.23.mov
iOS: mWeb Safari
ios.mov
MacOS: Chrome / Safari
2024-05-08.21.26.17.mov
MacOS: Desktop
2024-05-08.21.35.23.mov

@ZhenjaHorbach ZhenjaHorbach requested a review from a team as a code owner April 30, 2024 15:56
@melvin-bot melvin-bot bot requested review from mananjadhav and removed request for a team April 30, 2024 15:56
Copy link

melvin-bot bot commented Apr 30, 2024

@mananjadhav Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

@ZhenjaHorbach
Copy link
Contributor Author

ZhenjaHorbach commented Apr 30, 2024

@mananjadhav

Hello )
PR is ready

@dannymcclain @shawnborton @dubielzyk-expensify

The only thing that needs to be clarified is designs
Can you help with this or confirm current changes?

Loader (Current version in my PR):
Снимок экрана 2024-04-30 в 18 01 09

Empty list (Current version in my PR):
Снимок экрана 2024-04-30 в 18 01 26

@shawnborton
Copy link
Contributor

Should the empty list link to your workspace editor somehow? Otherwise it's not very helpful - it's just a dead end:
CleanShot 2024-04-30 at 12 40 58@2x

I would think we'd have a big green button at the bottom that might say "Edit categories" and it would navigate you to your workspace categories?

@ZhenjaHorbach
Copy link
Contributor Author

Should the empty list link to your workspace editor somehow? Otherwise it's not very helpful - it's just a dead end: CleanShot 2024-04-30 at 12 40 58@2x

I would think we'd have a big green button at the bottom that might say "Edit categories" and it would navigate you to your workspace categories?

Something like this ?

2024-04-30.22.49.40.mov

@dubielzyk-expensify
Copy link
Contributor

I like that, though I'd suggest we should use the label Add categories or Edit categories. But maybe my English is failling here? Edit category seems like an odd label when you don't have any of them

@ZhenjaHorbach
Copy link
Contributor Author

ZhenjaHorbach commented May 1, 2024

I like that, though I'd suggest we should use the label Add categories or Edit categories. But maybe my English is failling here? Edit category seems like an odd label when you don't have any of them

I agree with you )
When I rewatched the video I didn't like it either
d5994c9#diff-2a9066512656fa29b1565e362127de5cc11ba95b28f143a9db26f76dc3750785R2019
And I updated the text to plural

@shawnborton
Copy link
Contributor

Nice, I like it! And agree about making it Edit categories instead.

@dannymcclain
Copy link
Contributor

I'm into it as well!

@ZhenjaHorbach
Copy link
Contributor Author

@mananjadhav
Hello )
Since we no longer have design problems
PR is ready )

@mananjadhav
Copy link
Collaborator

Thanks @ZhenjaHorbach. Will finish the review by tomorrow.

@@ -28,9 +28,12 @@ type CategoryFormProps = {

/** Function to validate the edited values of the form */
validateEdit?: (values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_CATEGORY_FORM>) => FormInputErrors<typeof ONYXKEYS.FORMS.WORKSPACE_CATEGORY_FORM>;

/** Should go back after submitting the form */
isShouldGoBackOnSubmit?: boolean;
Copy link
Collaborator

Choose a reason for hiding this comment

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

Prefixing should is enough to understand it's a boolean.

Suggested change
isShouldGoBackOnSubmit?: boolean;
shouldGoBackOnSubmit?: boolean;

@@ -60,9 +63,13 @@ function CategoryForm({onSubmit, policyCategories, categoryName, validateEdit}:
(values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_CATEGORY_FORM>) => {
onSubmit(values);
Keyboard.dismiss();
if (isShouldGoBackOnSubmit) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

in which scenarios would we not go back?

Copy link
Contributor Author

@ZhenjaHorbach ZhenjaHorbach May 5, 2024

Choose a reason for hiding this comment

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

Actually these changes are not necessary
I added other changes related to navigation
Because categories are tied to workspace screen
And after reloading the page with open categories we always navigate to workspace screen

[SCREENS.WORKSPACE.CATEGORIES]: [SCREENS.WORKSPACE.CATEGORY_CREATE, SCREENS.WORKSPACE.CATEGORY_SETTINGS, SCREENS.WORKSPACE.CATEGORIES_SETTINGS, SCREENS.WORKSPACE.CATEGORY_EDIT],

@@ -39,6 +39,7 @@ function CategorySettingsPage({route, policyCategories}: CategorySettingsPagePro
const {translate} = useLocalize();
const {windowWidth} = useWindowDimensions();
const [deleteCategoryConfirmModalVisible, setDeleteCategoryConfirmModalVisible] = useState(false);
const backTo = route.params?.backTo ?? '';
Copy link
Collaborator

Choose a reason for hiding this comment

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

do we need a fallback string?

Copy link
Contributor Author

@ZhenjaHorbach ZhenjaHorbach May 6, 2024

Choose a reason for hiding this comment

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

It doesn't really affect anything
So I think not)
I'll remove it now

Copy link
Collaborator

@mananjadhav mananjadhav left a comment

Choose a reason for hiding this comment

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

Just finished with the review, overall code changes look fine. I'll need a day to test this.

@mananjadhav
Copy link
Collaborator

@ZhenjaHorbach Can you please resolve conflicts? I'll get started on the checklist right after.

@ZhenjaHorbach
Copy link
Contributor Author

ZhenjaHorbach commented May 7, 2024

@ZhenjaHorbach Can you please resolve conflicts? I'll get started on the checklist right after.

Hello )
I resolved conflicts

@Beamanator
Copy link
Contributor

@ZhenjaHorbach thanks for pulling main, can 1 or both of y'all please confirm this is still looking good after pulling main? 🙏 We should be able to get this merged early this week if so! (since the freeze is melting)

@ZhenjaHorbach
Copy link
Contributor Author

@ZhenjaHorbach thanks for pulling main, can 1 or both of y'all please confirm this is still looking good after pulling main? 🙏 We should be able to get this merged early this week if so! (since the freeze is melting)

Just checked
Found a specific bug that we didn't notice
And fixed it
Everything works fine now)

@Beamanator
Copy link
Contributor

@ZhenjaHorbach do you mind letting us know what the bug was & making sure it's in the test steps? 🙏

@mananjadhav can you please re-review? We're ready to merge this once it's all approved, no more freeze for this PR!

@ZhenjaHorbach
Copy link
Contributor Author

ZhenjaHorbach commented May 28, 2024

@ZhenjaHorbach do you mind letting us know what the bug was & making sure it's in the test steps? 🙏

@mananjadhav can you please re-review? We're ready to merge this once it's all approved, no more freeze for this PR!

If we create category with non-Latin characters(ЙЦУКЕ) or special symbols and then we'll try to edit the category name we get not found page
Because we need add parser for new routers and decode URI with non-Latin or special symbols

475d2bd#diff-d959b56c2ea536627740ef206f2a473588b85ea215fa5ebf1b5ae628e9ce722aR542

Like here

[SCREENS.WORKSPACE.CATEGORY_EDIT]: {
path: ROUTES.WORKSPACE_CATEGORY_EDIT.route,
parse: {
categoryName: (categoryName: string) => decodeURIComponent(categoryName),
},
},

@mananjadhav
Copy link
Collaborator

I'll do another round of review + testing today.

@ZhenjaHorbach
Copy link
Contributor Author

@mananjadhav
Friendly bump )

@mananjadhav
Copy link
Collaborator

I could only test on Web yesterday. I need to test on mobile atleast once. Please give me a few hours, I'll post an update once done.

@mananjadhav
Copy link
Collaborator

Apologies for the delay. Tested in Web, 1 mWeb and 1 native. Attached videos for Web and Android.

android-categories.mov
web-categories-1.mov
web-categories-2.mov

@melvin-bot melvin-bot bot requested a review from Beamanator June 2, 2024 06:14
Copy link
Contributor

@Beamanator Beamanator left a comment

Choose a reason for hiding this comment

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

LGTM! Merging cuz this has been pending for too long, but i think we should clean up the small comment i mentioned

Comment on lines +126 to 130
if (backTo) {
Navigation.navigate(ROUTES.SETTINGS_CATEGORY_SETTINGS.getRoute(policyId, category.keyForList, backTo));
return;
}
Navigation.navigate(ROUTES.WORKSPACE_CATEGORY_SETTINGS.getRoute(policyId, category.keyForList));
Copy link
Contributor

Choose a reason for hiding this comment

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

NAB - maybe in a follow-up we can clean this up by passing backTo always? so we don't have so many "if backTo exists, pass it, otherwise don't" checks? I also think it looks like ROUTES.WORKSPACE_CATEGORY_SETTINGS.getRoute already handles backTo existing or not, right?

Copy link
Contributor Author

@ZhenjaHorbach ZhenjaHorbach Jun 3, 2024

Choose a reason for hiding this comment

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

WORKSPACE_CATEGORY_SETTINGS does not handle backTo
Because it doesn't make sense
Since in the case of WORKSPACE_CATEGORY_SETTINGS the previous screen (WORKSPACE_CATEGORIES) will take up fullScreen

And it will be always previous (even when we copy link and open in new tab)

[SCREENS.WORKSPACE.CATEGORIES]: [SCREENS.WORKSPACE.CATEGORY_CREATE, SCREENS.WORKSPACE.CATEGORY_SETTINGS, SCREENS.WORKSPACE.CATEGORIES_SETTINGS, SCREENS.WORKSPACE.CATEGORY_EDIT],

But the idea behind my changes was
What if we have backTo
This means that we opened CATEGORY_SETTINGS not from Workspace Screen
And from another place
What does it mean to use new routes and save history using backTo

Copy link
Contributor

Choose a reason for hiding this comment

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

Oh geez i missed that one is SETTINGS_CATEGORY_SETTINGS, one is WORKSPACE_CATEGORY_SETTINGS. Please forgive me 😅

@Beamanator Beamanator merged commit ae12459 into Expensify:main Jun 3, 2024
17 checks passed
@OSBotify
Copy link
Contributor

OSBotify commented Jun 3, 2024

✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

@OSBotify
Copy link
Contributor

OSBotify commented Jun 6, 2024

🚀 Deployed to production by https://github.com/Julesssss in version: 1.4.79-11 🚀

platform result
🤖 android 🤖 success ✅
🖥 desktop 🖥 success ✅
🍎 iOS 🍎 success ✅
🕸 web 🕸 success ✅

<View style={[styles.flex1]}>
<BlockingView
icon={Illustrations.EmptyStateExpenses}
iconWidth={variables.modalTopIconWidth}
Copy link
Contributor

Choose a reason for hiding this comment

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

Coming from #43064. This caused a regression where the empty folder icon was not centred. This is because the width and height values used here are incorrect for the icon used.

/>
</View>
);
};

const isLoading = !isOffline && policyCategories === undefined;
const isLoading = !isOffline && policyCategories === null;
Copy link
Contributor

Choose a reason for hiding this comment

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

@ZhenjaHorbach why did you change it? Right now loading state is not working properly. See here. Reverting this change fixes the issue

Copy link
Contributor Author

@ZhenjaHorbach ZhenjaHorbach Jul 2, 2024

Choose a reason for hiding this comment

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

This is a known issue
But yes, I may have tested some functionality
But then I forgot to remove these changes 😅

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Coming from #44224. This caused a regression that a loader is not displayed
To fix this we need to use undefined in case of an empty onyx state as in other places

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.

9 participants