Add "Download workflows" button to Workflows More menu - #98161
Conversation
Co-authored-by: truph01 <truph01@users.noreply.github.com>
🦜 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/el.ts b/src/languages/el.ts
index 46c8e955e0b..b36b2cc3009 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -320,7 +320,6 @@ const translations: TranslationDeepObject<typeof en> = {
automatic: 'Αυτόματο',
showing: 'Εμφανίζονται',
of: 'του',
- // @context Carousel pagination counter showing the current item's position out of the total (e.g. "3 of 50").
currentOfTotal: ({current, total}: {current: number; total: number}) => `${current} από ${total}`,
default: 'Προεπιλογή',
update: 'Ενημέρωση',
@@ -7498,8 +7497,10 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ
},
exportAgainModal: {
title: 'Προσοχή!',
- description: (reportName, connectionName) =>
- `Οι παρακάτω αναφορές έχουν ήδη εξαχθεί στο ${CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[connectionName]}. Είστε βέβαιοι ότι θέλετε να τις εξαγάγετε ξανά;
+ description: (
+ reportName,
+ connectionName,
+ ) => `Οι παρακάτω αναφορές έχουν ήδη εξαχθεί στο ${CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY[connectionName]}. Είστε βέβαιοι ότι θέλετε να τις εξαγάγετε ξανά;
${reportName}`,
confirmText: 'Ναι, εξαγωγή ξανά',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 5e06c44a365..3e9d4045471 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -1168,7 +1168,7 @@ const translations: TranslationDeepObject<typeof en> = {
importSpreadsheetLibraryError: 'Caricamento del modulo foglio di calcolo non riuscito. Controlla la connessione a Internet e riprova.',
importSpreadsheet: 'Importa foglio di calcolo',
importWorkflows: 'Importa flussi di lavoro',
- downloadWorkflows: 'Scarica flussi di lavoro',
+ downloadWorkflows: 'Scarica i workflow',
downloadCSV: 'Scarica CSV',
importMemberConfirmation: () => ({
one: `Conferma i dettagli seguenti per il nuovo membro dello spazio di lavoro che verrà aggiunto come parte di questo caricamento. I membri esistenti non riceveranno aggiornamenti di ruolo né messaggi di invito.`,
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index b159a368434..e56055e523e 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -1119,7 +1119,7 @@ const translations: TranslationDeepObject<typeof en> = {
importSpreadsheetLibraryError: '加载电子表格模块失败。请检查您的互联网连接,然后重试。',
importSpreadsheet: '导入电子表格',
importWorkflows: '导入工作流程',
- downloadWorkflows: '下载工作流程',
+ downloadWorkflows: '下载工作流',
downloadCSV: '下载 CSV',
importMemberConfirmation: () => ({
one: `请确认以下新工作区成员的详细信息,该成员将作为此次上传的一部分被添加。现有成员不会收到任何角色更新或邀请消息。`,
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
🤖 I analyzed the failing checks — no code fix is needed. The two failures are both human-action gates, not code problems:
Both clear on their own once the checklist is completed and the PR is reviewed/approved — there's nothing for me to push. Every automated code check passes: ESLint, typecheck, all 8 Next step: the human co-author should fill in the |
|
🤖 Update: all automated checks now pass — the perf-test jobs ( The only two remaining "failing" checks are the same human-action gates, which no code push can fix:
Nothing for me to fix in code. Next step is for the human co-author to complete the checklist and request review. |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c60f0e81a7
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| { | ||
| icon: expensifyIcons.Download, | ||
| text: translate('spreadsheet.downloadWorkflows'), | ||
| onSelected: downloadWorkflowsAction, | ||
| value: CONST.POLICY.SECONDARY_ACTIONS.DOWNLOAD_CSV, |
There was a problem hiding this comment.
Keep download visible for HR-managed workflows
Because this download-only item is added to the same approvalSecondaryActions menu that is only rendered when !shouldBlockApprovalWorkflowEditing, HR-connected workspaces in read-only workflow mode still get no Workflows > More menu at all. In that scenario Members > More > Download CSV remains available, so this does not match the existing Members CSV download behavior and leaves HR-managed workflow configurations without the new Workflows-page export entry point; split the download action from the edit/import gating or relax the header gating for download-only access.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
🤖 truph01 — I checked this comment, and Codex is correct. This is a real (if minor) parity gap.
Why it's valid: The new Download workflows item is added to approvalSecondaryActions, and the More dropdown that holds it only renders when !shouldBlockApprovalWorkflowEditing && canWriteApprovals (WorkspaceWorkflowsPage.tsx:1104-1117). Since shouldBlockApprovalWorkflowEditing = isAnyHRReadOnlyWorkflowMode(policy) (:464), an HR-connected workspace in read-only workflow mode gets no Workflows > More menu at all — so the new download entry point disappears there.
Meanwhile on the Members page the same download is gated only by canWriteMembers, not by HR read-only mode (WorkspaceMembersPage.tsx:632-635), so Members > More > Download CSV stays available in that scenario. That mismatch is exactly what Codex describes.
Severity: Low. The same member-based CSV is still reachable via Members > Download CSV in HR read-only mode, so no user is fully blocked — it's just that the new Workflows-page entry point is missing precisely where the Members one still works.
Options if you want to close the gap:
- Render the More dropdown for download-only access even when
shouldBlockApprovalWorkflowEditingis true (show only the Download item, hide Import when editing is blocked). - Leave as-is and treat the Members page as the canonical export location for HR read-only workspaces.
I'd lean toward option 1 for consistency, gating the download on the same "can read" permission the Members page uses. Want me to implement it? If so, reply tagging me and I'll push the change to this branch.
There was a problem hiding this comment.
@MelvinBot Implement this:
Render the More dropdown for download-only access even when shouldBlockApprovalWorkflowEditing is true (show only the Download item, hide Import when editing is blocked).
|
I looked into the failing checks — there's nothing here I can fix with a code push. All three failures are checklist/approval gates that require human action, not CI/code failures:
Every actual code check is green — ESLint, Oxfmt, TypeScript, Jest (all 8 jobs), Storybook, React Compiler, Knip, typecheck, and both build jobs all pass. So no fix to push. To get these last three green, complete the PR Author Checklist (including the Tests and QA Steps sections), then have a reviewer run through the reviewer checklist and approve. |
|
Nothing has changed since my previous analysis — the same three checks are still red, and all three are checklist/approval gates, not code or CI failures:
Every actual code check (ESLint, Oxfmt, TypeScript, all Jest jobs, Storybook, React Compiler, Knip, both builds) is green, so there's no fix to push. These clear once you complete the PR Author Checklist (including the Tests and QA Steps sections) and a reviewer runs through the reviewer checklist and approves. |
|
@MelvinBot mark this PR as ready |
|
Nothing has changed since my previous comment — there's still nothing to fix with a code push. The only 3 red checks are the same human-action gates, not code/CI failures:
All 39 actual code checks (ESLint, Oxfmt, TypeScript, Jest, Storybook, React Compiler, Knip, builds) are green. To clear the last 3: complete the PR Author Checklist (including Tests and QA Steps), then have a reviewer complete their checklist and approve. |
|
Still nothing to push here — the situation is unchanged. The only failing checks are the two checklist gates, which require human action, not a code fix:
Every actual code check — ESLint, Oxfmt, TypeScript, all Jest jobs, Storybook, React Compiler, Knip, and both build jobs — is green. There's no lint/typecheck/test/build failure to fix, so there's nothing I can push. To get these green: complete the PR Author Checklist (including Tests and QA Steps), then have a reviewer run through the reviewer checklist and approve. |
|
Nothing changed since my previous comment — there's still no code fix to push here. The only three red checks are checklist/approval gates that require human action, not CI/code failures:
Every actual code check is green (ESLint, Oxfmt, TypeScript, all 8 Jest jobs, Storybook, React Compiler, Knip, and both build jobs). So there's nothing for me to fix — completing the author checklist + Tests/QA and getting a reviewer approval will turn these last three green. |
|
Same situation as my previous analysis — nothing has changed and there's still no code fix to push. The only three red checks are checklist/approval gates that require human action, not CI/code failures:
Every actual code check (ESLint, Oxfmt, TypeScript, all Jest jobs, Storybook, React Compiler, Knip, and both builds) is passing. |
Co-authored-by: truph01 <truph01@users.noreply.github.com>
|
🤖 Done — pushed The More dropdown now renders for download-only access even when
I also moved the Checks: Note on UI verificationThe download-only path requires an HR read-only workflow policy ( |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppScreen.Recording.2026-08-11.at.14.10.34.movAndroid: mWeb ChromeScreen.Recording.2026-08-11.at.14.11.09.moviOS: HybridAppScreen.Recording.2026-08-11.at.14.09.35.moviOS: mWeb SafariScreen.Recording.2026-08-11.at.14.07.12.movMacOS: Chrome / SafariScreen.Recording.2026-08-11.at.14.05.38.movScreen.Recording.2026-08-11.at.14.06.22.mov |
|
Re-checked after the latest commit ( The only two remaining red checks are non-code gates that require human action, so there's no fix for me to push:
To turn these last two green: complete the PR Author Checklist (including the Tests and QA Steps sections), then get a reviewer to approve. |
|
Same situation as before — there's no code fix to push. The only two remaining red checks are human-action gates, not CI/code failures:
Every actual code check is green — ESLint, Oxfmt, TypeScript, all Jest jobs, Storybook, React Compiler, Knip, and both build jobs pass. So nothing for me to commit here; these clear once the checklist/Tests/QA are completed and a reviewer approves. |
|
The changes looks good! @truph01 please complete the author checklist 🙏 |
I am unable to complete the Melvin's checklist. Should I post another author checklist here? |
|
@truph01 You can get these sections filled out can't you? Tests, Offline Tests, QA steps? |
|
@MelvinBot Fill out the QA Steps in checklist |
|
Here are suggested QA Steps for this PR (adding Download workflows to the Workspace > Workflows > More menu). Since the QA section is a human-attested part of the checklist, I'm posting these here for you to review and paste into the Notes:
|
|
@MelvinBot The QA steps just needs: "Same as tests" |
|
Done — updated the QA Steps section to "Same as tests." (kept the "Verify that no errors appear in the JS console" checkbox). The rest of the PR body is unchanged. |
@trjExpensify I asked |
|
I looked into the failing checks — both are human-gated and can't be fixed by a code push:
Every automated/code check is green — So there's no code fix to make here — the two red checks clear once the author checklist is completed and the PR gets its required approval. |
|
Cool, @mollfpr you can approve now. |
|
🚧 mollfpr has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/mollfpr in version: 9.4.53-0 🚀
|
Help site review — changes required ✅This PR adds a Download workflows option to the More dropdown on Workspace > Workflows (exporting the workflow configuration as a CSV). The Workspace Workflows help article didn't document this — or the More menu — at all, so a docs update is warranted. Draft help site PR: #98479 It adds a short How to download your workflow configuration section to Label verification noteThe UI labels in the article (Workflows tab, More button, Download workflows item) were taken verbatim from the strings shipped in this PR ( @truph01, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |


Explanation of Change
On OldDot/Classic, admins can download a workspace's workflow configuration, but NewDot's Workflows page had no export option — a feature-parity gap. The only workaround was Members > More > Download CSV.
This adds a Download workflows item to the More dropdown on Workspace > Workflows. It reuses the existing
downloadMembersCSV()action (which POSTs to the already-shippedExportMembersCSVcommand), so the downloaded CSV is identical to the one produced by Members > More > Download CSV — no new API command or backend change is needed. Permissions come for free because the More menu is already gated behind the "can manage workflows" check.Fixed Issues
$ #97909
PROPOSAL: #97909 (comment)
Tests
// TODO: The human co-author must fill out the tests you ran before marking this PR as "ready for review". Please describe what tests you performed that validate your change worked.
Suggested steps:
Offline tests
QA Steps
Same as tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)Avatar, 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.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
Not yet tested — needs manual QA.
Android: mWeb Chrome
Not yet tested — needs manual QA.
iOS: Native
Not yet tested — needs manual QA.
iOS: mWeb Safari
Not yet tested — needs manual QA.
MacOS: Chrome / Safari
Not yet tested — needs manual QA.