mirror of
https://github.com/documenso/documenso.git
synced 2026-09-29 08:14:31 +10:00
fix: prevent dialogs from closing on blur (#3314)
This commit is contained in:
@@ -0,0 +1,80 @@
|
|||||||
|
import { prisma } from '@documenso/prisma';
|
||||||
|
import { seedTeam } from '@documenso/prisma/seed/teams';
|
||||||
|
import { seedTemplate } from '@documenso/prisma/seed/templates';
|
||||||
|
import { expect, test } from '@playwright/test';
|
||||||
|
import { EnvelopeType } from '@prisma/client';
|
||||||
|
|
||||||
|
import { apiSignin } from '../fixtures/authentication';
|
||||||
|
import { openDropdownMenu } from '../fixtures/generic';
|
||||||
|
|
||||||
|
test('[TEMPLATES]: bulk send via CSV from the table action dropdown', async ({ page }) => {
|
||||||
|
const { team, owner } = await seedTeam();
|
||||||
|
|
||||||
|
await seedTemplate({
|
||||||
|
title: 'Bulk send template',
|
||||||
|
userId: owner.id,
|
||||||
|
teamId: team.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
const uniqueRecipientEmail = `bulk-send-${Date.now()}@documenso.com`;
|
||||||
|
|
||||||
|
await apiSignin({
|
||||||
|
page,
|
||||||
|
email: owner.email,
|
||||||
|
redirectPath: `/t/${team.url}/templates`,
|
||||||
|
});
|
||||||
|
|
||||||
|
const actionBtn = page
|
||||||
|
.getByRole('row', { name: 'Bulk send template' })
|
||||||
|
.getByRole('cell', { name: 'Use Template' })
|
||||||
|
.getByRole('button')
|
||||||
|
.nth(1);
|
||||||
|
|
||||||
|
await openDropdownMenu(page, actionBtn);
|
||||||
|
|
||||||
|
await page.getByText('Bulk Send via CSV').click();
|
||||||
|
|
||||||
|
const dialog = page.getByRole('dialog').filter({ hasText: 'Bulk Send Template via CSV' });
|
||||||
|
|
||||||
|
await expect(dialog).toBeVisible();
|
||||||
|
|
||||||
|
// Opening the native file picker blurs the window. Radix dropdown menus close themselves on
|
||||||
|
// window blur, which used to unmount this dialog when it was nested inside the menu content,
|
||||||
|
// silently discarding the user's file selection.
|
||||||
|
await page.evaluate(() => window.dispatchEvent(new Event('blur')));
|
||||||
|
|
||||||
|
await expect(dialog).toBeVisible();
|
||||||
|
|
||||||
|
const csv = ['recipient_1_email,recipient_1_name', `${uniqueRecipientEmail},Bulk Recipient`].join('\n');
|
||||||
|
|
||||||
|
await dialog.locator('input[type="file"]').setInputFiles({
|
||||||
|
name: 'bulk-send.csv',
|
||||||
|
mimeType: 'text/csv',
|
||||||
|
buffer: Buffer.from(csv),
|
||||||
|
});
|
||||||
|
|
||||||
|
await expect(dialog.getByText('bulk-send.csv')).toBeVisible();
|
||||||
|
|
||||||
|
await dialog.getByRole('button', { name: 'Upload and Process' }).click();
|
||||||
|
|
||||||
|
await expect(page.getByText('Your bulk send has been initiated').first()).toBeVisible();
|
||||||
|
|
||||||
|
// The bulk send runs as a background job, so poll for the created document.
|
||||||
|
await expect
|
||||||
|
.poll(
|
||||||
|
async () =>
|
||||||
|
await prisma.envelope.count({
|
||||||
|
where: {
|
||||||
|
type: EnvelopeType.DOCUMENT,
|
||||||
|
teamId: team.id,
|
||||||
|
recipients: {
|
||||||
|
some: {
|
||||||
|
email: uniqueRecipientEmail,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
{ timeout: 30_000 },
|
||||||
|
)
|
||||||
|
.toBe(1);
|
||||||
|
});
|
||||||
@@ -4,6 +4,19 @@ import * as React from 'react';
|
|||||||
|
|
||||||
import { cn } from '../lib/utils';
|
import { cn } from '../lib/utils';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Note: The underlying @radix-ui/react-menu package is patched, see
|
||||||
|
* patches/@radix-ui+react-menu+2.1.24.patch.
|
||||||
|
*
|
||||||
|
* Since @radix-ui/react-menu 2.1.18, Radix closes any open menu when the window fires a
|
||||||
|
* "blur" event. Opening a native file picker blurs the window, which would close the
|
||||||
|
* menu and unmount anything rendered within its content, such as dialogs containing
|
||||||
|
* file inputs, silently discarding the user's file selection. The patch removes that
|
||||||
|
* behaviour since there is currently no native prop to opt out of it, see
|
||||||
|
* https://github.com/radix-ui/primitives/issues/3618.
|
||||||
|
*
|
||||||
|
* Regression test: packages/app-tests/e2e/templates/template-bulk-send.spec.ts
|
||||||
|
*/
|
||||||
const DropdownMenu = DropdownMenuPrimitive.Root;
|
const DropdownMenu = DropdownMenuPrimitive.Root;
|
||||||
|
|
||||||
const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
|
const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
diff --git a/node_modules/@radix-ui/react-menu/dist/index.js b/node_modules/@radix-ui/react-menu/dist/index.js
|
||||||
|
index b3f6113..d8ec2e3 100644
|
||||||
|
--- a/node_modules/@radix-ui/react-menu/dist/index.js
|
||||||
|
+++ b/node_modules/@radix-ui/react-menu/dist/index.js
|
||||||
|
@@ -139,9 +139,14 @@ var Menu = /* @__PURE__ */ __name((props) => {
|
||||||
|
if (!open) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
- const handleBlur = /* @__PURE__ */ __name(() => handleOpenChange(false), "handleBlur");
|
||||||
|
- window.addEventListener("blur", handleBlur);
|
||||||
|
- return () => window.removeEventListener("blur", handleBlur);
|
||||||
|
+ // DOCUMENSO PATCH: @radix-ui/react-menu 2.1.18+ closes open menus when the window
|
||||||
|
+ // fires a "blur" event. Opening a native file picker blurs the window, which closes
|
||||||
|
+ // the menu and unmounts anything rendered within its content, such as dialogs that
|
||||||
|
+ // contain file inputs, silently discarding the user's file selection. This restores
|
||||||
|
+ // the pre-2.1.18 behaviour. Regression test: e2e/templates/template-bulk-send.spec.ts
|
||||||
|
+ // const handleBlur = () => handleOpenChange(false);
|
||||||
|
+ // window.addEventListener("blur", handleBlur);
|
||||||
|
+ // return () => window.removeEventListener("blur", handleBlur);
|
||||||
|
}, [open, handleOpenChange]);
|
||||||
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
||||||
|
MenuProvider,
|
||||||
|
diff --git a/node_modules/@radix-ui/react-menu/dist/index.mjs b/node_modules/@radix-ui/react-menu/dist/index.mjs
|
||||||
|
index cd4303a..68865e3 100644
|
||||||
|
--- a/node_modules/@radix-ui/react-menu/dist/index.mjs
|
||||||
|
+++ b/node_modules/@radix-ui/react-menu/dist/index.mjs
|
||||||
|
@@ -73,9 +73,14 @@ var Menu = /* @__PURE__ */ __name((props) => {
|
||||||
|
if (!open) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
- const handleBlur = /* @__PURE__ */ __name(() => handleOpenChange(false), "handleBlur");
|
||||||
|
- window.addEventListener("blur", handleBlur);
|
||||||
|
- return () => window.removeEventListener("blur", handleBlur);
|
||||||
|
+ // DOCUMENSO PATCH: @radix-ui/react-menu 2.1.18+ closes open menus when the window
|
||||||
|
+ // fires a "blur" event. Opening a native file picker blurs the window, which closes
|
||||||
|
+ // the menu and unmounts anything rendered within its content, such as dialogs that
|
||||||
|
+ // contain file inputs, silently discarding the user's file selection. This restores
|
||||||
|
+ // the pre-2.1.18 behaviour. Regression test: e2e/templates/template-bulk-send.spec.ts
|
||||||
|
+ // const handleBlur = () => handleOpenChange(false);
|
||||||
|
+ // window.addEventListener("blur", handleBlur);
|
||||||
|
+ // return () => window.removeEventListener("blur", handleBlur);
|
||||||
|
}, [open, handleOpenChange]);
|
||||||
|
return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(
|
||||||
|
MenuProvider,
|
||||||
Reference in New Issue
Block a user