-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Create Time Tracking settings page #80331
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
Create Time Tracking settings page #80331
Conversation
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
…ling in rate section
🦜 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 9dbe2a90..0735fc47 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -5239,7 +5239,12 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
title: 'Regeln',
subtitle: 'Belege verlangen, hohe Ausgaben kennzeichnen und mehr.',
},
- timeTracking: {title: 'Zeit', subtitle: 'Legen Sie einen abrechenbaren Stundensatz fest, damit Mitarbeitende für ihre Zeit bezahlt werden.'},
+ timeTracking: {
+ title: 'Zeit',
+ subtitle: 'Legen Sie einen abrechenbaren Stundensatz fest, damit Mitarbeitende für ihre Zeit bezahlt werden.',
+ defaultHourlyRate: 'Standardstundensatz',
+ defaultHourlyRateSubtitle: 'Legen Sie einen abrechenbaren Stundensatz für die Zeiterfassung fest.',
+ },
},
reports: {
reportsCustomTitleExamples: 'Beispiele:',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 8e5ea4c8..defa7a5b 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -5247,7 +5247,12 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST.
title: 'Règles',
subtitle: 'Exigez des reçus, signalez les dépenses élevées, et plus encore.',
},
- timeTracking: {title: 'Heure', subtitle: 'Définissez un taux horaire facturable pour que les employés soient rémunérés pour leur temps.'},
+ timeTracking: {
+ title: 'Heure',
+ subtitle: 'Définissez un taux horaire facturable pour que les employés soient rémunérés pour leur temps.',
+ defaultHourlyRate: 'Taux horaire par défaut',
+ defaultHourlyRateSubtitle: 'Définissez un taux horaire facturable pour le suivi du temps.',
+ },
},
reports: {
reportsCustomTitleExamples: 'Exemples :',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index ee09a7f6..5786e5d4 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -5226,7 +5226,12 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST.
title: 'Regole',
subtitle: 'Richiedi ricevute, segnala spese elevate e altro ancora.',
},
- timeTracking: {title: 'Ora', subtitle: 'Imposta una tariffa oraria fatturabile per consentire ai dipendenti di essere pagati per il loro tempo.'},
+ timeTracking: {
+ title: 'Ora',
+ subtitle: 'Imposta una tariffa oraria fatturabile per consentire ai dipendenti di essere pagati per il loro tempo.',
+ defaultHourlyRate: 'Tariffa oraria predefinita',
+ defaultHourlyRateSubtitle: 'Imposta una tariffa oraria fatturabile per il monitoraggio del tempo.',
+ },
},
reports: {
reportsCustomTitleExamples: 'Esempi:',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index a4aecc65..2e1769ae 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -5192,7 +5192,12 @@ _より詳しい手順については、[ヘルプサイトをご覧ください
title: 'ルール',
subtitle: 'レシートの必須化や高額支出のフラグ付けなどを設定できます。',
},
- timeTracking: {title: '時間', subtitle: '従業員が作業時間に対して支払いを受けられるよう、時間単位の請求レートを設定します。'},
+ timeTracking: {
+ title: '時間',
+ subtitle: '従業員が作業時間に対して支払いを受けられるよう、時間単位の請求レートを設定します。',
+ defaultHourlyRate: 'デフォルトの時間単価',
+ defaultHourlyRateSubtitle: 'タイムトラッキング用の時間単価請求レートを設定します。',
+ },
},
reports: {
reportsCustomTitleExamples: '例:',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 5b0db59e..90168e06 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -5215,7 +5215,12 @@ _Voor gedetailleerdere instructies, [bezoek onze helpsite](${CONST.NETSUITE_IMPO
title: 'Regels',
subtitle: 'Vereis bonnetjes, markeer hoge uitgaven en meer.',
},
- timeTracking: {title: 'Tijd', subtitle: 'Stel een uurtarief in waarmee medewerkers worden betaald voor hun tijd.'},
+ timeTracking: {
+ title: 'Tijd',
+ subtitle: 'Stel een uurtarief in waarmee medewerkers worden betaald voor hun tijd.',
+ defaultHourlyRate: 'Standaard uurtarief',
+ defaultHourlyRateSubtitle: 'Stel een factureerbaar uurtarief in voor tijdregistratie.',
+ },
},
reports: {
reportsCustomTitleExamples: 'Voorbeelden:',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index dea21683..f8e390b8 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -5208,7 +5208,12 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy
title: 'Zasady',
subtitle: 'Wymagaj paragonów, oznaczaj wysokie wydatki i nie tylko.',
},
- timeTracking: {title: 'Czas', subtitle: 'Ustaw godzinową stawkę rozliczeniową, aby pracownicy byli wynagradzani za swój czas.'},
+ timeTracking: {
+ title: 'Czas',
+ subtitle: 'Ustaw godzinową stawkę rozliczeniową, aby pracownicy byli wynagradzani za swój czas.',
+ defaultHourlyRate: 'Domyślna stawka godzinowa',
+ defaultHourlyRateSubtitle: 'Ustaw godzinową stawkę rozliczeniową do śledzenia czasu.',
+ },
},
reports: {
reportsCustomTitleExamples: 'Przykłady:',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index a4c33c47..fd197d90 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -5208,7 +5208,12 @@ _Para instruções mais detalhadas, [visite nosso site de ajuda](${CONST.NETSUIT
title: 'Regras',
subtitle: 'Exigir recibos, sinalizar gastos elevados e muito mais.',
},
- timeTracking: {title: 'Hora', subtitle: 'Defina uma taxa horária faturável para que os funcionários sejam pagos pelo tempo trabalhado.'},
+ timeTracking: {
+ title: 'Hora',
+ subtitle: 'Defina uma taxa horária faturável para que os funcionários sejam pagos pelo tempo trabalhado.',
+ defaultHourlyRate: 'Taxa horária padrão',
+ defaultHourlyRateSubtitle: 'Defina uma taxa horária faturável para o controle de tempo.',
+ },
},
reports: {
reportsCustomTitleExamples: 'Exemplos:',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index cefb15fb..fb252882 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -5102,7 +5102,12 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM
title: '规则',
subtitle: '要求收据、标记高额支出等。',
},
- timeTracking: {title: '时间', subtitle: '为员工设置按小时计费的费率,以便根据他们的工作时间获得报酬。'},
+ timeTracking: {
+ title: '时间',
+ subtitle: '为员工设置按小时计费的费率,以便根据他们的工作时间获得报酬。',
+ defaultHourlyRate: '默认时薪',
+ defaultHourlyRateSubtitle: '为时间跟踪设置按小时计费费率。',
+ },
},
reports: {
reportsCustomTitleExamples: '示例:',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
Codecov Report❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.
|
|
NAB at all but cc @Expensify/design - I wonder if we should consider making our clock icon have some more negative space around it? It's pretty beefy compared to say the cash icon. I think our credit card icon has a similar issue. Nothing we need to fix here, but just something we should keep in mind. |
|
🚧 @grgia has triggered a test Expensify/App build. You can view the workflow run here. |
This comment has been minimized.
This comment has been minimized.
|
Just to make sure I am following, we aren't planning to add Time tracking to the More features page? I enabled the beta but I haven't seen it there yet, though maybe I just need to wait longer :) |
|
Sounds good, I'll wait a bit until the beta kicks in then. Also, cc @jamesdeanexpensify - did you work on the copy for that feature? I wonder if we could shorten it a tad (the description text under Time) |
it's |
|
Okay got it working, seems to be good. Let's just get confirmation on the copy 👍 |
|
Friendly bump on the copy when you can @jamesdeanexpensify |
thanks, I didn't notice this. @grgia I think it's a backend issue, right? |
|
@jnowakow has been working on updates to that flow |
src/SCREENS.ts
Outdated
| PER_DIEM_EDIT_AMOUNT: 'Per_Diem_Edit_Amount', | ||
| PER_DIEM_EDIT_CURRENCY: 'Per_Diem_Edit_Currency', | ||
| TIME_TRACKING: 'Time_Tracking', | ||
| TIME_TRACKING_RATE: 'Time_Tracking_Rate', |
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.
Let's rename TIME_TRACKING_DEFAULT_RATE
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.
sure, should the route stay as /rate or should that be /default-rate too?
joekaufmanexpensify
left a comment
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.
WN project 👍
|
@mhawryluk Could you please check the failed perf tests? |
|
The offline indicator floats to the middle of the page when navigating away from the default rate form. Screen.Recording.2026-01-29.at.17.50.35.movThis is another flow where I don't see this bug happened Screen.Recording.2026-01-29.at.17.51.09.mov |
merging main fixed it |
should be fixed now. I disabled |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppScreen.Recording.2026-01-29.at.21.32.02.movAndroid: mWeb ChromeScreen.Recording.2026-01-29.at.19.07.31.moviOS: HybridAppScreen.Recording.2026-01-29.at.18.54.37.moviOS: mWeb SafariScreen.Recording.2026-01-29.at.18.53.49.movMacOS: Chrome / SafariScreen.Recording.2026-01-29.at.17.30.03.mov |
|
Checking again .... |
|
🚧 @grgia 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! 🧪🧪
|
grgia
left a comment
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.
@mhawryluk we should require upgrade for Time, the same as per Diem
Bug:
Screen.Recording.2026-01-29.at.1.30.35.PM.mov
Otherwise main flows LGTM:
Screen.Recording.2026-01-29.at.1.26.53.PM.mov
cc @Expensify/design @dylanexpensify can you confirm if we need this page for time tracking? it's collect or control @mhawryluk if changes are req, we can tackle in a follow up as this is under beta |
|
fixed tags |
|
yeah, I implemented it to be available for both control and collect workspaces, per the design doc, but if we want to limit it to just control we can do that in a follow up! |
|
Thanks @mhawryluk, then we're good to go |
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.
LGTM!
DylanDylann
left a comment
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.
LGTM
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚀 Deployed to staging by https://github.com/grgia in version: 9.3.11-16 🚀
|



Explanation of Change
Creates a new workspace settings page for the Time Tracking feature as well as a new RHP for setting default hourly rate.
Fixed Issues
$ #77523
PROPOSAL: N/A
Tests
Offline tests
After updating the default rate when offline, the default hourly rate menu item should be greyed out until back online. The rate should be updated optimistically.
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.Screenshots/Videos
Android: Native
Nagranie.z.ekranu.2026-01-27.o.17.48.56.mov
Android: mWeb Chrome
Nagranie.z.ekranu.2026-01-27.o.17.42.04.mov
iOS: Native
Simulator.Screen.Recording.-.iPhone.16.Pro.Max.-.2026-01-27.at.17.37.15.mp4
iOS: mWeb Safari
Simulator.Screen.Recording.-.iPhone.16.Pro.Max.-.2026-01-27.at.17.39.45.mp4
MacOS: Chrome / Safari
Nagranie.z.ekranu.2026-01-23.o.13.02.45.mov