You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Due for payment 2026-06-12] [$250] Expense - Colon symbol category cannot be selected as category #91133
Version Number: 9.3.78-0 Reproducible in staging?: Yes Reproducible in production?: No If this was caught during regression testing, add the test name, ID and link from BrowserStack:#85448 Email or phone of affected tester (no customers):sdsdjoijdoisnjodis@gmail.com Issue reported by: Applause Internal Team Bug source: Exploratory - Significant User Experience Deterioration Device used: Mac 26.2 / Chrome App Component: Money Requests
Action Performed:
Go to staging.new.expensify.com
Go to workspace chat.
Click + > Create expense > Manual.
Enter amount > Next.
On confirm page, click Category.
Select any category.
Click Category.
Click + button.
Enter : and save it.
→ Category is cleared after selecting :
Open Category field.
→ : category is missing.
Click + button.
Enter : and save it.
→ It shows that the category exists but it is missing in the list.
Expected Result:
In Step 9, after entering colon symbol, the colon symbol will be the category.
Actual Result:
In Step 9, after entering colon symbol, the category is cleared.
In Step 10, the added colon symbol category is missing in category list.
In Step 12, tt shows that the colon symbol category exists but it is missing in the list.
👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:
Identify the pull request that introduced this issue and revert it.
The new processCategoryNameSegments function (introduced in PR #85448) splits category names on : and filters out empty segments. When the category name is just ":", ":".split(":") produces ["", ""] — both empty strings are filtered out, returning an empty array [].
This empty array causes three cascading failures:
Category disappears from the list — getCategoryOptionTree iterates an empty array, so ":" is never added to the option tree.
Selected category appears cleared — getDecodedLeafCategoryName returns "" for ":", so CategoryField displays a blank title.
sortCategories drops the category — lodashSet(hierarchy, [], value) with an empty path is a no-op, silently losing the entry.
What changes do you think we should make in order to solve the problem?
In processCategoryNameSegments (src/libs/CategoryUtils.ts:163), add an early return when the result array is empty but the original category name is non-empty. If all segments are empty after filtering (meaning the name consists entirely of colons/whitespace), return the original trimmed name as a single-element array instead of []. This preserves the category as a valid leaf node.
What alternative solutions did you explore?
Validation at category creation time to prevent colon-only names — rejected because the backend already accepts these names, and existing data would still be broken.
Possibly related:#82068 (multi-level categories with colons display issues)
Next Steps for Contributor+ team: Reply with @MelvinBot implement this to create a draft PR, @MelvinBot <your feedback> to refine this analysis, or explain why you are rejecting Melvin's proposal.
This behavior is not a regression introduced by PR #85448. I’ve tested the same scenario in OldDot/Classic and confirmed that a colon‑only category : cannot be selected there either – it appears as an empty line in the dropdown and clicking it does nothing (the category field remains empty).
Our PR’s behavior (the category not appearing in the list) is visually different but functionally identical to OldDot: the category : is not selectable.
For a detailed breakdown, please see my comment in the PR: #85448 (comment)
If the team decides that : should be selectable (unlike OldDot), that would be an enhancement request – but it is not a regression caused by this PR. I recommend closing this issue as “not a regression” (consistent with legacy behavior). Please let me know if you’d still like me to change the PR.
This behavior is not a regression introduced by PR #85448. I’ve tested the same scenario in OldDot/Classic and confirmed that a colon‑only category : cannot be selected there either – it appears as an empty line in the dropdown and clicking it does nothing (the category field remains empty).
Our PR’s behavior (the category not appearing in the list) is visually different but functionally identical to OldDot: the category : is not selectable.
For a detailed breakdown, please see my comment in the PR: #85448 (comment)
If the team decides that : should be selectable (unlike OldDot), that would be an enhancement request – but it is not a regression caused by this PR. I recommend closing this issue as “not a regression” (consistent with legacy behavior). Please let me know if you’d still like me to change the PR.
@ZhenjaHorbach – gentle ping. @mallenexpensify asked for your input on payment/regression a week ago. Could you take a look when you get a moment? Happy to provide context if needed. Thanks!
Activity
applause-bot commentedon May 19, 2026
While Applause doesn't embed attachments for this bug, here are the links for quick view:
https://platform.applause.com/services/links/v1/external/7c1830620e44adfbd1af7c449ee4967c51c036b9831bfe913621a2a5c62f08c8
melvin-bot commentedon May 19, 2026
You have been assigned to this deploy blocker because you recently merged this PR: #85448
melvin-bot commentedon May 19, 2026
💬 A slack conversation has been started in #expensify-open-source
github-actions commentedon May 19, 2026
👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:
MelvinBot commentedon May 19, 2026
Proposal
What is the root cause of that problem?
The new
processCategoryNameSegmentsfunction (introduced in PR #85448) splits category names on:and filters out empty segments. When the category name is just":",":".split(":")produces["", ""]— both empty strings are filtered out, returning an empty array[].This empty array causes three cascading failures:
getCategoryOptionTreeiterates an empty array, so":"is never added to the option tree.getDecodedLeafCategoryNamereturns""for":", soCategoryFielddisplays a blank title.lodashSet(hierarchy, [], value)with an empty path is a no-op, silently losing the entry.What changes do you think we should make in order to solve the problem?
In
processCategoryNameSegments(src/libs/CategoryUtils.ts:163), add an early return when the result array is empty but the original category name is non-empty. If all segments are empty after filtering (meaning the name consists entirely of colons/whitespace), return the original trimmed name as a single-element array instead of[]. This preserves the category as a valid leaf node.What alternative solutions did you explore?
Investigation details
Data flow:
":"→ backend stores itsortCategories→processCategoryNameSegments(":")→[]→lodashSet(hierarchy, [], ...)is a no-op → category lostgetCategoryOptionTree→ same empty array → loop never runs → category invisible in pickergetDecodedLeafCategoryName(":")→[]→undefined ?? ""→ CategoryField shows blank title":"→ backend says it exists, but UI can't display itAffected code paths:
src/libs/CategoryUtils.ts:163-185—processCategoryNameSegmentssrc/libs/CategoryUtils.ts:187-191—getDecodedLeafCategoryNamesrc/libs/CategoryOptionListUtils.ts:36-37—getCategoryOptionTreesrc/components/MoneyRequestConfirmationList/sections/CategoryField.tsx:53— displayPossibly related: #82068 (multi-level categories with colons display issues)
Next Steps for Contributor+ team: Reply with
@MelvinBot implement thisto create a draft PR,@MelvinBot <your feedback>to refine this analysis, or explain why you are rejecting Melvin's proposal.ijmalik commentedon May 20, 2026
This behavior is not a regression introduced by PR #85448. I’ve tested the same scenario in OldDot/Classic and confirmed that a colon‑only category : cannot be selected there either – it appears as an empty line in the dropdown and clicking it does nothing (the category field remains empty).
Our PR’s behavior (the category not appearing in the list) is visually different but functionally identical to OldDot: the category : is not selectable.
For a detailed breakdown, please see my comment in the PR: #85448 (comment)
If the team decides that : should be selectable (unlike OldDot), that would be an enhancement request – but it is not a regression caused by this PR. I recommend closing this issue as “not a regression” (consistent with legacy behavior). Please let me know if you’d still like me to change the PR.
Please see OldDot Demo Video
ZhenjaHorbach commentedon May 20, 2026
Thanks for checking!
Plus, I think we can remove the deploy blocker
Since it's a real edge case
yuwenmemon commentedon May 20, 2026
Major edge case, yeah. And as @ijmalik pointed out here: #85448 (comment) this also happens on old dot as well.
49 remaining items
ijmalik commentedon Jun 22, 2026
@ZhenjaHorbach – gentle ping. @mallenexpensify asked for your input on payment/regression a week ago. Could you take a look when you get a moment? Happy to provide context if needed. Thanks!
mallenexpensify commentedon Jun 22, 2026
Apologies for the delay @ijmalik , I made @ZhenjaHorbach the issue owner and will ping them in Slack too.
mallenexpensify commentedon Jun 22, 2026
Payment Summary
Contributor: @ijmalik paid $125 via Upwork
Contributor+: @ZhenjaHorbach due $125 via NewDot
Treating this as a followup, comment/reopen if you disagree. Followup cuz of the breakdown from @ijmalik here
@ijmalik can you please accept the job below? Please reply here and tag me once you have.
https://www.upwork.com/jobs/~022069128613906233002
melvin-bot commentedon Jun 22, 2026
@mallenexpensify Huh... This is 4 days overdue. Who can take care of this?
ijmalik commentedon Jun 23, 2026
@mallenexpensify Done – I've accepted the job here . Thanks!
mallenexpensify commentedon Jun 23, 2026
@ijmalik paid, summary updated above. Thx.
When paying I found a duplicate contract I cancelled too. Apologies for that.
garrettmknight commentedon Jun 29, 2026
$125 approved for @ZhenjaHorbach