From b6b7781fbefec225f8104f5523a975978e6f1dd2 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 3 Nov 2026 15:56:55 -0600 Subject: [PATCH 1/7] fix: adjust for updated column counts, removed outdated test ids, and deleted responsive options --- .../__tests__/show-pages-list-page.test.js | 27 ++++++++++----- .../components/__tests__/cart-view.test.js | 16 ++++++--- .../sponsor-cart-tab/components/cart-view.js | 15 +++++---- .../__tests__/sponsor-forms-tab.test.js | 33 ++++++++++++------- .../__tests__/sponsor-pages-tab.test.js | 12 ++++--- 5 files changed, 68 insertions(+), 35 deletions(-) diff --git a/src/pages/sponsors/show-pages-list-page/__tests__/show-pages-list-page.test.js b/src/pages/sponsors/show-pages-list-page/__tests__/show-pages-list-page.test.js index 8f50169df..add2a8f59 100644 --- a/src/pages/sponsors/show-pages-list-page/__tests__/show-pages-list-page.test.js +++ b/src/pages/sponsors/show-pages-list-page/__tests__/show-pages-list-page.test.js @@ -141,9 +141,11 @@ describe("ShowPagesListPage", () => { } } ); - const editButton = screen.getByTestId("EditIcon").closest("button"); await act(async () => { - await userEvent.click(editButton); + await userEvent.click(screen.getByTestId("row-actions-menu-trigger")); + await userEvent.click( + screen.getByRole("menuitem", { name: "general.edit" }) + ); }); expect(getSummitSponsorshipTypes).toHaveBeenCalledWith( DEFAULT_CURRENT_PAGE, @@ -168,9 +170,11 @@ describe("ShowPagesListPage", () => { } } ); - const editButton = screen.getByTestId("EditIcon").closest("button"); await act(async () => { - await userEvent.click(editButton); + await userEvent.click(screen.getByTestId("row-actions-menu-trigger")); + await userEvent.click( + screen.getByRole("menuitem", { name: "general.edit" }) + ); }); expect(getSummitSponsorshipTypes).toHaveBeenCalledWith( DEFAULT_CURRENT_PAGE, @@ -208,10 +212,13 @@ describe("ShowPagesListPage", () => { } } ); - const deleteButtons = screen.getAllByTestId("DeleteIcon"); - const secondDeleteButton = deleteButtons[1].closest("button"); await act(async () => { - await userEvent.click(secondDeleteButton); + await userEvent.click( + screen.getAllByTestId("row-actions-menu-trigger")[1] + ); + await userEvent.click( + screen.getByRole("menuitem", { name: "general.delete" }) + ); }); expect( await screen.findByText("general.are_you_sure") @@ -244,9 +251,11 @@ describe("ShowPagesListPage", () => { } } ); - const deleteButton = screen.getByTestId("DeleteIcon").closest("button"); await act(async () => { - await userEvent.click(deleteButton); + await userEvent.click(screen.getByTestId("row-actions-menu-trigger")); + await userEvent.click( + screen.getByRole("menuitem", { name: "general.delete" }) + ); }); expect( await screen.findByText("general.are_you_sure") diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/__tests__/cart-view.test.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/__tests__/cart-view.test.js index 935bdeb53..4e84c0c3a 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/__tests__/cart-view.test.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/__tests__/cart-view.test.js @@ -177,8 +177,9 @@ describe("CartView", () => { expect( screen.queryByRole("button", { name: "edit_sponsor.cart_tab.add_form" }) ).not.toBeInTheDocument(); - expect(screen.queryByTestId("action-edit")).not.toBeInTheDocument(); - expect(screen.queryByTestId("action-delete")).not.toBeInTheDocument(); + expect( + screen.queryByTestId("row-actions-menu-trigger") + ).not.toBeInTheDocument(); expect( screen.queryByText("edit_sponsor.cart_tab.sponsor_note.title") ).not.toBeInTheDocument(); @@ -187,14 +188,19 @@ describe("CartView", () => { ).not.toBeInTheDocument(); }); - it("shows them on an Open cart", () => { + it("shows them on an Open cart", async () => { renderCartView(createCart()); expect( screen.getByRole("button", { name: "edit_sponsor.cart_tab.add_form" }) ).toBeInTheDocument(); - expect(screen.getByTestId("action-edit")).toBeInTheDocument(); - expect(screen.getByTestId("action-delete")).toBeInTheDocument(); + await userEvent.click(screen.getByTestId("row-actions-menu-trigger")); + expect( + screen.getByRole("menuitem", { name: "general.edit" }) + ).toBeInTheDocument(); + expect( + screen.getByRole("menuitem", { name: "general.delete" }) + ).toBeInTheDocument(); expect( screen.getByText("edit_sponsor.cart_tab.sponsor_note.title") ).toBeInTheDocument(); diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-view.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-view.js index 15b52a06b..1251bb1c8 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-view.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-view.js @@ -190,6 +190,8 @@ const CartView = ({ } ]; + const amountIndex = tableColumns.findIndex((c) => c.columnKey === "amount"); + return ( <> @@ -231,11 +232,13 @@ const CartView = ({ } confirmButtonColor="error" > - {/* gap skips manage items when hidden, trailing covers lock (+ edit, delete) */} - {cartIsEditable ? ( - - ) : ( - + {/* aligns the total under amount; MuiTable passes its column count */} + {(colCount) => ( + )} {isCardPaymentCart && ( diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/__tests__/sponsor-forms-tab.test.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/__tests__/sponsor-forms-tab.test.js index 2ddd2ffc2..bb210e06b 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/__tests__/sponsor-forms-tab.test.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/__tests__/sponsor-forms-tab.test.js @@ -202,9 +202,11 @@ describe("SponsorFormsTab", () => { const explicitRow = screen.getByText("Managed Form 1").closest("tr"); const implicitRow = screen.getByText("Managed Form 2").closest("tr"); - expect(within(explicitRow).getByTestId("DeleteIcon")).toBeInTheDocument(); expect( - within(implicitRow).queryByTestId("DeleteIcon") + within(explicitRow).getByTestId("row-actions-menu-trigger") + ).toBeInTheDocument(); + expect( + within(implicitRow).queryByTestId("row-actions-menu-trigger") ).not.toBeInTheDocument(); }); @@ -232,10 +234,13 @@ describe("SponsorFormsTab", () => { expect(screen.getByText("Managed Form 1")).toBeInTheDocument(); expect(screen.getByText("Managed Form 2")).toBeInTheDocument(); - const deleteButtons = screen.getAllByTestId("DeleteIcon"); - const secondDeleteButton = deleteButtons[1].closest("button"); await act(async () => { - await userEvent.click(secondDeleteButton); + await userEvent.click( + screen.getAllByTestId("row-actions-menu-trigger")[1] + ); + await userEvent.click( + screen.getByRole("menuitem", { name: "general.delete" }) + ); }); expect( @@ -289,9 +294,11 @@ describe("SponsorFormsTab", () => { } }); - const deleteButton = screen.getByTestId("DeleteIcon").closest("button"); await act(async () => { - await userEvent.click(deleteButton); + await userEvent.click(screen.getByTestId("row-actions-menu-trigger")); + await userEvent.click( + screen.getByRole("menuitem", { name: "general.delete" }) + ); }); expect( @@ -322,9 +329,11 @@ describe("SponsorFormsTab", () => { store }); - const deleteButton = screen.getByTestId("DeleteIcon").closest("button"); await act(async () => { - await userEvent.click(deleteButton); + await userEvent.click(screen.getByTestId("row-actions-menu-trigger")); + await userEvent.click( + screen.getByRole("menuitem", { name: "general.delete" }) + ); }); expect( @@ -371,9 +380,11 @@ describe("SponsorFormsTab", () => { } }); - const deleteButton = screen.getByTestId("DeleteIcon").closest("button"); await act(async () => { - await userEvent.click(deleteButton); + await userEvent.click(screen.getByTestId("row-actions-menu-trigger")); + await userEvent.click( + screen.getByRole("menuitem", { name: "general.delete" }) + ); }); expect( diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/__tests__/sponsor-pages-tab.test.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/__tests__/sponsor-pages-tab.test.js index b3e2a6cf3..f6cbe200d 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/__tests__/sponsor-pages-tab.test.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/__tests__/sponsor-pages-tab.test.js @@ -205,9 +205,11 @@ describe("SponsorPagesTab", () => { } ); - const editButton = screen.getByTestId("EditIcon").closest("button"); await act(async () => { - await userEvent.click(editButton); + await userEvent.click(screen.getByTestId("row-actions-menu-trigger")); + await userEvent.click( + screen.getByRole("menuitem", { name: "general.edit" }) + ); }); expect(getSponsorCustomizedPage).toHaveBeenCalledWith(1); @@ -355,9 +357,11 @@ describe("SponsorPagesTab", () => { } ); - const editButton = screen.getByTestId("EditIcon").closest("button"); await act(async () => { - await userEvent.click(editButton); + await userEvent.click(screen.getByTestId("row-actions-menu-trigger")); + await userEvent.click( + screen.getByRole("menuitem", { name: "general.edit" }) + ); }); await waitFor(() => { From 0c43c891e5e4506e559ab8e9daec15ca3d16dfc8 Mon Sep 17 00:00:00 2001 From: smarcet Date: Fri, 13 Nov 2026 16:06:45 -0300 Subject: [PATCH 2/7] chore(deps): update uicore to 5.0.75 5.0.74 and later replace the MuiTable Edit and Delete icon columns with a row actions menu and pass the column count to a function child, which the cart total row and the sponsor table tests rely on. --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 53f73d565..aacb439d2 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "moment-duration-format": "^2.3.2", "moment-timezone": "^0.5.33", "mui-color-input": "^9.0.0", - "openstack-uicore-foundation": "5.0.73-beta.1", + "openstack-uicore-foundation": "5.0.75", "p-limit": "^6.1.0", "path-browserify": "^1.0.1", "postcss-loader": "^6.2.1", diff --git a/yarn.lock b/yarn.lock index 6cc854497..f440225f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9076,10 +9076,10 @@ open@^10.0.3: is-inside-container "^1.0.0" wsl-utils "^0.1.0" -openstack-uicore-foundation@5.0.73-beta.1: - version "5.0.73-beta.1" - resolved "https://registry.yarnpkg.com/openstack-uicore-foundation/-/openstack-uicore-foundation-5.0.73-beta.1.tgz#95274f8a31004e38d3c201d778f5d7f05928c8e5" - integrity sha512-+UTWgAy7DTZB3bToiASYo1ggtnEsG1MDNTc6Jr43l+HXUbB8NBStHrjR+xwuMKs4YnmSIpCfi8U26yjG029Ggw== +openstack-uicore-foundation@5.0.75: + version "5.0.75" + resolved "https://registry.yarnpkg.com/openstack-uicore-foundation/-/openstack-uicore-foundation-5.0.75.tgz#fa9d9c0bd6d4ee3e55c4a3dd17ed86096a25a21c" + integrity sha512-4zkRwoCPdguBX9W+aj4tWgpivwIltBL3l/U5yaDdAYPMEIiXfWod34vRfqJKryTPgbb1XCJtIDs2T4GgsNAlTQ== dependencies: use-sync-external-store "^1.6.0" From ba9a0fe90d6ad0d5120ec501fe7c5f0e87fd5345 Mon Sep 17 00:00:00 2001 From: Casey Locker Date: Mon, 12 Oct 2026 12:56:34 -0700 Subject: [PATCH 3/7] feat(uploads): select UploadInputV4 behind FILE_UPLOAD_USE_V4 Route the five file-upload-api upload sites (company logo and big logo, event material slide and media upload, upload dialog) through a FileUploadInput wrapper. With FILE_UPLOAD_USE_V4="true" it renders uicore's UploadInputV4 against the direct-upload API base; anything else keeps UploadInputV3 on the chunked endpoint, so rollback is an env flip. Adds @uppy/core and @uppy/aws-s3, which UploadInputV4 takes as peers. Needs the uicore release that ships upload-input-v4. ClickUp: https://app.clickup.com/t/86bcgxnfp --- .env.example | 1 + package.json | 2 + src/app.js | 1 + src/components/forms/company-form.js | 10 +-- src/components/forms/event-material-form.js | 10 +-- .../__tests__/file-upload-input.test.js | 82 +++++++++++++++++++ src/components/inputs/file-upload-input.js | 51 ++++++++++++ src/components/upload-dialog/index.js | 6 +- yarn.lock | 80 +++++++++++++++++- 9 files changed, 223 insertions(+), 20 deletions(-) create mode 100644 src/components/inputs/__tests__/file-upload-input.test.js create mode 100644 src/components/inputs/file-upload-input.js diff --git a/.env.example b/.env.example index 6b78d3253..0f46c1b49 100644 --- a/.env.example +++ b/.env.example @@ -19,6 +19,7 @@ SPONSOR_USERS_SCOPES="show-medata/read show-medata/write access-requests/read ac EMAIL_SCOPES="clients/read templates/read templates/write emails/read" FILE_UPLOAD_SCOPES="files/upload" FILE_UPLOAD_ALLOWED_EXTENSIONS="pdf,jpg,jpeg,png,ppt,key,pptx" +FILE_UPLOAD_USE_V4= SPONSOR_PAGES_API_URL=https://sponsor-pages-api.dev.fnopen.com SPONSOR_REPORTS_API_URL=https://sponsor-reports-api.dev.fnopen.com SPONSOR_PAGES_SCOPES="page-template/read page-template/write show-page/read show-page/write media-upload/read" diff --git a/package.json b/package.json index aacb439d2..ba894aed3 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,8 @@ "@uiw/codemirror-theme-sublime": "^4.21.23", "@uiw/react-codemirror": "^4.21.7", "@uiw/react-color-sketch": "^2.1.0", + "@uppy/aws-s3": "^5.1.0", + "@uppy/core": "^5.2.0", "ably": "^2.30.0", "address-rfc2822": "^2.2.2", "awesome-bootstrap-checkbox": "^1.0.1", diff --git a/src/app.js b/src/app.js index 7a8fa36b1..55da85ca2 100644 --- a/src/app.js +++ b/src/app.js @@ -86,6 +86,7 @@ window.SPONSOR_USERS_API_URL = process.env.SPONSOR_USERS_API_URL; window.SPONSOR_PAGES_API_URL = process.env.SPONSOR_PAGES_API_URL; window.SPONSOR_REPORTS_API_URL = process.env.SPONSOR_REPORTS_API_URL; window.FILE_UPLOAD_API_BASE_URL = process.env.FILE_UPLOAD_API_BASE_URL; +window.FILE_UPLOAD_USE_V4 = process.env.FILE_UPLOAD_USE_V4; window.SIGNAGE_BASE_URL = process.env.SIGNAGE_BASE_URL; window.INVENTORY_API_BASE_URL = process.env.INVENTORY_API_BASE_URL; window.OAUTH2_CLIENT_ID = process.env.OAUTH2_CLIENT_ID; diff --git a/src/components/forms/company-form.js b/src/components/forms/company-form.js index 5b216b71d..2ddad28f3 100644 --- a/src/components/forms/company-form.js +++ b/src/components/forms/company-form.js @@ -23,11 +23,11 @@ import { MenuItem, Select } from "@mui/material"; -import UploadInputV3 from "openstack-uicore-foundation/lib/components/inputs/upload-input-v3"; import { getCountryList } from "openstack-uicore-foundation/lib/utils/query-actions"; import Table from "openstack-uicore-foundation/lib/components/mui/table"; import MuiFormikTextField from "openstack-uicore-foundation/lib/components/mui/formik-inputs/textfield"; import MuiFormikSelect from "openstack-uicore-foundation/lib/components/mui/formik-inputs/select"; +import FileUploadInput from "../inputs/file-upload-input"; import useScrollToError from "../../hooks/useScrollToError"; import FormikTextEditor from "../inputs/formik-text-editor"; import MuiFormikAsyncAutocomplete from "../mui/formik-inputs/mui-formik-async-select"; @@ -370,7 +370,7 @@ const CompanyForm = ({ {T.translate("edit_company.logo")} - {T.translate("edit_company.big_logo")} -