Standardize all table empty states#94705
Conversation
…p into jsenyitko-search-empty-states
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index 98b19ec7117..d3f21440a4c 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -515,6 +515,7 @@ const translations: TranslationDeepObject<typeof en> = {
editor: 'Editor',
restrictions: 'Beschränkungen',
off: 'Aus',
+ noResultsFoundSubtitle: 'Keine Ergebnisse. Bitte passen Sie Ihre Filter oder Suchanfrage an',
},
socials: {
podcast: 'Folgen Sie uns auf Podcast',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 0139208063e..940c1a7c8f8 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -466,6 +466,7 @@ const translations: TranslationDeepObject<typeof en> = {
editor: 'Editor',
restrictions: 'Restricciones',
off: 'Desactivado',
+ noResultsFoundSubtitle: 'Sin resultados. Intenta ajustar tus filtros o la búsqueda.',
},
socials: {
podcast: 'Síguenos en Podcast',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index d67b32866ae..b552f3413a5 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -515,6 +515,7 @@ const translations: TranslationDeepObject<typeof en> = {
editor: 'Éditeur',
restrictions: 'Restrictions',
off: 'Désactivé',
+ noResultsFoundSubtitle: 'Aucun résultat. Veuillez essayer de modifier vos filtres ou votre requête de recherche',
},
socials: {
podcast: 'Suivez-nous sur Podcast',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index aba7932fc4d..22f4dcb22a6 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -515,6 +515,7 @@ const translations: TranslationDeepObject<typeof en> = {
editor: 'Editor',
restrictions: 'Restrizioni',
off: 'Disattivato',
+ noResultsFoundSubtitle: 'Nessun risultato. Prova a modificare i filtri o la ricerca',
},
socials: {
podcast: 'Seguici su Podcast',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index a19b6518b68..8434d875729 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -514,6 +514,7 @@ const translations: TranslationDeepObject<typeof en> = {
editor: '編集者',
restrictions: '制限',
off: 'オフ',
+ noResultsFoundSubtitle: '結果がありません。フィルターや検索キーワードを調整してお試しください',
},
socials: {
podcast: 'ポッドキャストでフォロー',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 1567d57b7b8..32b91986468 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -514,6 +514,7 @@ const translations: TranslationDeepObject<typeof en> = {
editor: 'Editor',
restrictions: 'Beperkingen',
off: 'Uit',
+ noResultsFoundSubtitle: 'Geen resultaten. Probeer je filters of zoekopdracht aan te passen',
},
socials: {
podcast: 'Volg ons op Podcast',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 7510e301180..1478b97e938 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -514,6 +514,7 @@ const translations: TranslationDeepObject<typeof en> = {
editor: 'Edytor',
restrictions: 'Ograniczenia',
off: 'Wyłączone',
+ noResultsFoundSubtitle: 'Brak wyników. Spróbuj zmienić filtry lub zapytanie wyszukiwania',
},
socials: {
podcast: 'Śledź nas na Podcast',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 6f0fe226c23..91b7cbae5c3 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -513,6 +513,7 @@ const translations: TranslationDeepObject<typeof en> = {
editor: 'Editor',
restrictions: 'Restrições',
off: 'Desligado',
+ noResultsFoundSubtitle: 'Nenhum resultado. Tente ajustar seus filtros ou termo de pesquisa',
},
socials: {
podcast: 'Siga-nos no Podcast',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 593961f9506..72b4261adff 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -510,6 +510,7 @@ const translations: TranslationDeepObject<typeof en> = {
editor: '编辑',
restrictions: '限制',
off: '关',
+ noResultsFoundSubtitle: '无结果。请尝试调整筛选条件或搜索内容',
},
socials: {
podcast: '在播客上关注我们',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
…p into jsenyitko-search-empty-states
|
Updated @Krishna2323 |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppandroid_native.mp4Android: mWeb Chromeandroid_mWeb.mp4iOS: HybridAppios_native.mp4iOS: mWeb Safariios_mWeb.mp4MacOS: Chrome / Safariweb_chrome.mp4 |
|
The BE is down ATM. I still need to record the native platform videos to complete the checklist, and I’ll do that as soon as it’s resolved. I also think we should merge #94995 first. WDYT? |
|
@Krishna2323 ready for you |
Krishna2323
left a comment
There was a problem hiding this comment.
Tests well! @JS00001, there are just a few failing checks left.
|
@luacmartins ready for you 🙇🏻 |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚧 luacmartins has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/luacmartins in version: 9.4.33-0 🚀
|
|
🤖 Help site review: no This PR is an internal UI standardization that introduces reusable
Doc references I checked against this diff
Since no product-facing copy or workflow changed, I did not create a docs PR. @JS00001, no linked help site PR was created because no |
Explanation of Change
Supports a
Table.EmptyStateandTable.NoResultsStatecomponent, which render conditionally, based on when they should render. This helps to standardize the table componentFixed Issues
$ #94059
Tests
Navigate to all of the tables that have the new table style
When there are no items for that table, an empty state should show
When there are items for the table, and the user searches for the items with no results, the 'empty shelves' illustration should show up
Offline tests
N/.A
QA Steps
Same as tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectioncanBeMissingparam foruseOnyxtoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps./** comment above it */thisproperly so there are no scoping issues (i.e. foronClick={this.submit}the methodthis.submitshould be bound tothisin the constructor)thisare necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);ifthis.submitis never passed to a component event handler likeonClick)Screenshots/Videos
Screen.Recording.2026-06-30.at.10.57.36.AM.mov