From 16e36daca1f2d626a82b4b5c8efd363b380e03c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Fri, 19 Jun 2026 15:28:41 -0300 Subject: [PATCH 1/9] fix: adjust popup pattern, add isSaving on popups, return promises, remove open prop, adjust tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- .../form-template-item-list-page.js | 4 +- .../form-templates/form-template-list-page.js | 20 +++++----- .../form-templates/form-template-popup.js | 4 +- .../form-templates/sponsor-inventory-popup.js | 26 +++++++++++-- .../inventory/inventory-list-page.js | 23 +++++------- .../page-template-popup/index.js | 5 +++ src/pages/sponsors/popup/add-sponsor-popup.js | 34 +++++++++++++---- src/pages/sponsors/popup/edit-tier-popup.js | 37 +++++++++++++++---- .../sponsors/show-pages-list-page/index.js | 15 ++++++-- src/pages/sponsors/sponsor-list-page.js | 11 ++---- .../sponsor-forms-manage-items.js | 4 +- .../add-sponsor-page-template-popup/index.js | 25 +++++++++++-- .../tabs/sponsor-pages-tab/index.js | 27 ++++++-------- .../sponsors/summit-sponsorship-list-page.js | 21 ++++++----- .../__tests__/sponsorship-list-page.test.js | 2 +- .../components/sponsorship-dialog.js | 20 ++++++---- .../sponsorship-list-page.js | 17 ++------- src/pages/tags/tag-list-page.js | 6 +-- 18 files changed, 189 insertions(+), 112 deletions(-) diff --git a/src/pages/sponsors-global/form-templates/form-template-item-list-page.js b/src/pages/sponsors-global/form-templates/form-template-item-list-page.js index 90263fa87..4015d275d 100644 --- a/src/pages/sponsors-global/form-templates/form-template-item-list-page.js +++ b/src/pages/sponsors-global/form-templates/form-template-item-list-page.js @@ -174,7 +174,7 @@ const FormTemplateItemListPage = ({ ); }; - const handleFormTemplateSave = (item) => { + const handleFormTemplateSave = (item) => saveFormTemplateItem(formTemplateId, item).then(() => getFormTemplateItems( formTemplateId, @@ -186,8 +186,6 @@ const FormTemplateItemListPage = ({ showArchived ) ); - setShowInventoryItemModal(false); - }; const columns = [ { diff --git a/src/pages/sponsors-global/form-templates/form-template-list-page.js b/src/pages/sponsors-global/form-templates/form-template-list-page.js index 0d7fef187..8c42901c4 100644 --- a/src/pages/sponsors-global/form-templates/form-template-list-page.js +++ b/src/pages/sponsors-global/form-templates/form-template-list-page.js @@ -212,17 +212,17 @@ const FormTemplateListPage = ({ sortDir: orderDir }; - const handleOnSave = async (values) => { - await saveFormTemplate(values); - getFormTemplates( - "", - DEFAULT_CURRENT_PAGE, - perPage, - order, - orderDir, - showArchived + const handleOnSave = (values) => + saveFormTemplate(values).then(() => + getFormTemplates( + "", + DEFAULT_CURRENT_PAGE, + perPage, + order, + orderDir, + showArchived + ) ); - }; return (
diff --git a/src/pages/sponsors-global/form-templates/form-template-popup.js b/src/pages/sponsors-global/form-templates/form-template-popup.js index baef4dfdc..ed960e8b0 100644 --- a/src/pages/sponsors-global/form-templates/form-template-popup.js +++ b/src/pages/sponsors-global/form-templates/form-template-popup.js @@ -74,9 +74,9 @@ const FormTemplateDialog = ({ if (isSaving) return; setIsSaving(true); - Promise.resolve(onSave(finalValues)) + onSave(finalValues) .then(() => { - closePopup(); + onClose(); }) .catch(() => { // keep dialog open on save error to preserve user input diff --git a/src/pages/sponsors-global/form-templates/sponsor-inventory-popup.js b/src/pages/sponsors-global/form-templates/sponsor-inventory-popup.js index ed5e0640b..6fc3ce635 100644 --- a/src/pages/sponsors-global/form-templates/sponsor-inventory-popup.js +++ b/src/pages/sponsors-global/form-templates/sponsor-inventory-popup.js @@ -45,6 +45,8 @@ const SponsorItemDialog = ({ onMetaFieldTypeValueDeleted, entity: initialEntity }) => { + const [isSaving, setIsSaving] = useState(false); + const formik = useFormik({ initialValues: { ...initialEntity, @@ -65,7 +67,13 @@ const SponsorItemDialog = ({ quantity_limit_per_show: positiveNumberValidation(), meta_fields: formMetafieldsValidation() }), - onSubmit: (values) => onSave(values) + onSubmit: (values) => { + if (isSaving) return; + setIsSaving(true); + onSave(values) + .then(() => onClose()) + .finally(() => setIsSaving(false)); + } }); const mediaType = { @@ -79,6 +87,7 @@ const SponsorItemDialog = ({ useScrollToError(formik); const handleClose = () => { + if (isSaving) return; formik.resetForm(); onClose(); }; @@ -92,12 +101,18 @@ const SponsorItemDialog = ({ disableEnforceFocus disableAutoFocus disableRestoreFocus + disableEscapeKeyDown={isSaving} > {initialEntity.id ? T.translate("edit_inventory_item.edit_item") : T.translate("edit_inventory_item.new_item")} - + @@ -227,7 +242,12 @@ const SponsorItemDialog = ({ - diff --git a/src/pages/sponsors-global/inventory/inventory-list-page.js b/src/pages/sponsors-global/inventory/inventory-list-page.js index ec18de994..6d8c2b1de 100644 --- a/src/pages/sponsors-global/inventory/inventory-list-page.js +++ b/src/pages/sponsors-global/inventory/inventory-list-page.js @@ -132,20 +132,17 @@ const InventoryListPage = ({ setOpen(true); }; - const handleInventorySave = (item) => { - saveInventoryItem(item) - .then(() => - getInventoryItems( - term, - currentPage, - perPage, - order, - orderDir, - showArchived - ) + const handleInventorySave = (item) => + saveInventoryItem(item).then(() => + getInventoryItems( + term, + currentPage, + perPage, + order, + orderDir, + showArchived ) - .finally(() => setOpen(false)); - }; + ); const handleArchiveItem = (item) => item.is_archived diff --git a/src/pages/sponsors-global/page-templates/page-template-popup/index.js b/src/pages/sponsors-global/page-templates/page-template-popup/index.js index cb19f223a..2f10a1a7f 100644 --- a/src/pages/sponsors-global/page-templates/page-template-popup/index.js +++ b/src/pages/sponsors-global/page-templates/page-template-popup/index.js @@ -221,6 +221,11 @@ const PageTemplatePopup = ({ }); }; + const handleClose = () => { + if (isSaving) return; + onClose(); + }; + return ( { +const AddSponsorDialog = ({ onClose, onSubmit, summitId }) => { + const [isSaving, setIsSaving] = useState(false); + const formik = useFormik({ initialValues: { company: null, @@ -51,7 +53,13 @@ const AddSponsorDialog = ({ open, onClose, onSubmit, summitId }) => { ) .min(1, "At least one sponsorship is required") }), - onSubmit, + onSubmit: (values) => { + if (isSaving) return; + setIsSaving(true); + onSubmit(values) + .then(() => onClose()) + .finally(() => setIsSaving(false)); + }, enableReinitialize: true }); @@ -59,6 +67,7 @@ const AddSponsorDialog = ({ open, onClose, onSubmit, summitId }) => { useScrollToError(formik); const handleClose = () => { + if (isSaving) return; formik.resetForm(); onClose(); }; @@ -70,12 +79,23 @@ const AddSponsorDialog = ({ open, onClose, onSubmit, summitId }) => { }, [formik.errors]); return ( - + {T.translate("sponsor_list.add_sponsor")} - handleClose()} sx={{ mr: 1 }}> + handleClose()} + sx={{ mr: 1 }} + disabled={isSaving} + > @@ -135,7 +155,8 @@ const AddSponsorDialog = ({ open, onClose, onSubmit, summitId }) => { variant="contained" disabled={ !formik.values.company || - formik.values.sponsorships.length === 0 + formik.values.sponsorships.length === 0 || + isSaving } > {T.translate("sponsor_list.add_sponsor")} @@ -148,7 +169,6 @@ const AddSponsorDialog = ({ open, onClose, onSubmit, summitId }) => { }; AddSponsorDialog.propTypes = { - open: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, onSubmit: PropTypes.func.isRequired, summitId: PropTypes.number.isRequired diff --git a/src/pages/sponsors/popup/edit-tier-popup.js b/src/pages/sponsors/popup/edit-tier-popup.js index 48eb28c22..def72c1ae 100644 --- a/src/pages/sponsors/popup/edit-tier-popup.js +++ b/src/pages/sponsors/popup/edit-tier-popup.js @@ -1,4 +1,4 @@ -import React, { useEffect } from "react"; +import React, { useEffect, useState } from "react"; import T from "i18n-react/dist/i18n-react"; import { useFormik, FormikProvider } from "formik"; import * as yup from "yup"; @@ -27,13 +27,14 @@ import MuiFormikSelect from "../../../components/mui/formik-inputs/mui-formik-se import MuiFormikCheckbox from "../../../components/mui/formik-inputs/mui-formik-checkbox"; const EditTierDialog = ({ - open, onClose, onSubmit, onBadgeImageAttach, onBadgeImageRemove, entity: initialEntity }) => { + const [isSaving, setIsSaving] = useState(false); + const formik = useFormik({ initialValues: initialEntity, validationSchema: yup.object({ @@ -69,7 +70,13 @@ const EditTierDialog = ({ ), should_display_on_lobby_page: yup.bool(T.translate("validation.boolean")) }), - onSubmit, + onSubmit: (values) => { + if (isSaving) return; + setIsSaving(true); + onSubmit(values) + .then(() => onClose()) + .finally(() => setIsSaving(false)); + }, enableReinitialize: true }); @@ -88,6 +95,7 @@ const EditTierDialog = ({ }; const handleClose = () => { + if (isSaving) return; formik.resetForm(); onClose(); }; @@ -123,14 +131,25 @@ const EditTierDialog = ({ ]; return ( - + {`${initialEntity.id ? "Edit" : "Add"} ${T.translate( "edit_summit_sponsorship.tier" )}`} - handleClose()} sx={{ mr: 1 }}> + handleClose()} + sx={{ mr: 1 }} + disabled={isSaving} + > @@ -512,7 +531,12 @@ const EditTierDialog = ({ - @@ -523,7 +547,6 @@ const EditTierDialog = ({ }; EditTierDialog.propTypes = { - open: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, onSubmit: PropTypes.func.isRequired }; diff --git a/src/pages/sponsors/show-pages-list-page/index.js b/src/pages/sponsors/show-pages-list-page/index.js index 5cacc9475..c4f40b5de 100644 --- a/src/pages/sponsors/show-pages-list-page/index.js +++ b/src/pages/sponsors/show-pages-list-page/index.js @@ -106,7 +106,7 @@ const ShowPagesListPage = ({ const handleShowArchivedForms = (ev) => { getShowPages( term, - currentPage, + DEFAULT_CURRENT_PAGE, perPage, order, orderDir, @@ -126,9 +126,16 @@ const ShowPagesListPage = ({ }; const handleSaveShowPage = (entity) => - saveShowPage(entity).then(() => { - getShowPages(); - }); + saveShowPage(entity).then(() => + getShowPages( + term, + DEFAULT_CURRENT_PAGE, + perPage, + order, + orderDir, + showArchived + ) + ); const handleOpenPageTemplatePopup = async (row) => { await Promise.all([ diff --git a/src/pages/sponsors/sponsor-list-page.js b/src/pages/sponsors/sponsor-list-page.js index 7b9ee01dd..739919b26 100644 --- a/src/pages/sponsors/sponsor-list-page.js +++ b/src/pages/sponsors/sponsor-list-page.js @@ -69,12 +69,10 @@ const SponsorListPage = ({ deleteSponsor(sponsorId); }; - const handleNewSponsor = (sponsor) => { - addSponsorToSummit(sponsor).then(() => { - setShowAddSponsorModal(false); - getSponsors(term, DEFAULT_CURRENT_PAGE, perPage, order, orderDir); - }); - }; + const handleNewSponsor = (sponsor) => + addSponsorToSummit(sponsor).then(() => + getSponsors(term, DEFAULT_CURRENT_PAGE, perPage, order, orderDir) + ); const handlePageChange = (page) => { getSponsors(term, page, perPage, order, orderDir); @@ -272,7 +270,6 @@ const SponsorListPage = ({ {showAddSponsorModal && ( { + const handleItemSave = (item) => saveSponsorFormManagedItem(formId, item).then(() => { getSponsorCustomizedFormItems( formId, @@ -141,9 +141,7 @@ const SponsorFormsManageItems = ({ showArchived ); resetSponsorFormManagedItem(); - setOpenPopup(null); }); - }; const handleOpenItemPopup = () => { resetSponsorFormManagedItem(); diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/components/add-sponsor-page-template-popup/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/components/add-sponsor-page-template-popup/index.js index 9a72b86ab..6e2ccce9a 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/components/add-sponsor-page-template-popup/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/components/add-sponsor-page-template-popup/index.js @@ -59,6 +59,7 @@ const AddSponsorPageTemplatePopup = ({ summitId }) => { const [selectedPages, setSelectedPages] = useState([]); + const [isSaving, setIsSaving] = useState(false); const sponsorshipIds = sponsor.sponsorships.map((e) => e.id); @@ -72,12 +73,16 @@ const AddSponsorPageTemplatePopup = ({ add_ons: yup.array() }), onSubmit: (values) => { + if (isSaving) return; + setIsSaving(true); const { add_ons } = values; const entity = { pages: selectedPages, add_ons }; - onSubmit(entity); + onSubmit(entity) + .then(() => onClose()) + .finally(() => setIsSaving(false)); }, enableReinitialize: true }); @@ -140,6 +145,7 @@ const AddSponsorPageTemplatePopup = ({ }; const handleClose = () => { + if (isSaving) return; onClose(); }; @@ -190,12 +196,23 @@ const AddSponsorPageTemplatePopup = ({ ]; return ( - + {T.translate("edit_sponsor.pages_tab.add_page_using_template")} - handleClose()} sx={{ mr: 1 }}> + handleClose()} + sx={{ mr: 1 }} + disabled={isSaving} + > @@ -293,7 +310,7 @@ const AddSponsorPageTemplatePopup = ({
); }; diff --git a/src/pages/sponsorship-types/__tests__/sponsorship-list-page.test.js b/src/pages/sponsorship-types/__tests__/sponsorship-list-page.test.js index f13547ca9..d450d7262 100644 --- a/src/pages/sponsorship-types/__tests__/sponsorship-list-page.test.js +++ b/src/pages/sponsorship-types/__tests__/sponsorship-list-page.test.js @@ -48,7 +48,7 @@ jest.mock(
diff --git a/src/pages/sponsorship-types/components/sponsorship-dialog.js b/src/pages/sponsorship-types/components/sponsorship-dialog.js index dcb093564..fb60052f3 100644 --- a/src/pages/sponsorship-types/components/sponsorship-dialog.js +++ b/src/pages/sponsorship-types/components/sponsorship-dialog.js @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState } from "react"; import T from "i18n-react/dist/i18n-react"; import PropTypes from "prop-types"; import { FormikProvider, useFormik } from "formik"; @@ -28,12 +28,9 @@ const SIZE_OPTIONS_DDL = [ { label: "Big", value: "Big" } ]; -const SponsorshipDialog = ({ - entity: initialEntity, - onClose, - onSave, - isSaving = false -}) => { +const SponsorshipDialog = ({ entity: initialEntity, onClose, onSave }) => { + const [isSaving, setIsSaving] = useState(false); + const formik = useFormik({ initialValues: { id: initialEntity?.id ?? 0, @@ -45,12 +42,19 @@ const SponsorshipDialog = ({ validationSchema: yup.object().shape({ name: requiredStringValidation() }), - onSubmit: (values) => onSave(values) + onSubmit: (values) => { + if (isSaving) return; + setIsSaving(true); + onSave(values) + .then(() => onClose()) + .finally(() => setIsSaving(false)); + } }); useScrollToError(formik); const handleClose = () => { + if (isSaving) return; formik.resetForm(); onClose(); }; diff --git a/src/pages/sponsorship-types/sponsorship-list-page.js b/src/pages/sponsorship-types/sponsorship-list-page.js index 66854a359..0792fddb9 100644 --- a/src/pages/sponsorship-types/sponsorship-list-page.js +++ b/src/pages/sponsorship-types/sponsorship-list-page.js @@ -44,7 +44,6 @@ const SponsorshipListPage = ({ resetSponsorshipForm }) => { const [open, setOpen] = useState(false); - const [isSaving, setIsSaving] = useState(false); useEffect(() => { getSponsorships(); @@ -76,21 +75,14 @@ const SponsorshipListPage = ({ }; const handleClose = () => { - if (isSaving) return; resetSponsorshipForm(); setOpen(false); }; - const handleSave = (entity) => { - if (isSaving) return; - setIsSaving(true); - saveSponsorship(entity) - .then(() => - getSponsorships(term, DEFAULT_CURRENT_PAGE, perPage, order, orderDir) - ) - .then(() => setOpen(false)) - .finally(() => setIsSaving(false)); - }; + const handleSave = (entity) => + saveSponsorship(entity).then(() => + getSponsorships(term, DEFAULT_CURRENT_PAGE, perPage, order, orderDir) + ); const handleDelete = (sponsorshipId) => { deleteSponsorship(sponsorshipId); @@ -196,7 +188,6 @@ const SponsorshipListPage = ({ entity={currentSponsorship} onSave={handleSave} onClose={handleClose} - isSaving={isSaving} /> )}
diff --git a/src/pages/tags/tag-list-page.js b/src/pages/tags/tag-list-page.js index 498c1bff8..4a4a045b7 100644 --- a/src/pages/tags/tag-list-page.js +++ b/src/pages/tags/tag-list-page.js @@ -75,9 +75,9 @@ const TagListPage = ({ }; const handleSaveTag = (entity) => - saveTag(entity).then(() => { - getTags(search, currentPage, perPage, order, orderDir); - }); + saveTag(entity).then(() => + getTags(search, currentPage, perPage, order, orderDir) + ); const handleDeleteTag = (id) => { deleteTag(id) From ea4a36fa045c4fdea365d0e7742fcf87b495154c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Fri, 19 Jun 2026 18:06:37 -0300 Subject: [PATCH 2/9] fix: add return for actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/actions/inventory-item-actions.js | 6 ++---- src/actions/sponsor-actions.js | 8 ++++---- .../page-templates/page-template-list-page.js | 6 +++--- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/actions/inventory-item-actions.js b/src/actions/inventory-item-actions.js index 0c85483d5..ba4120316 100644 --- a/src/actions/inventory-item-actions.js +++ b/src/actions/inventory-item-actions.js @@ -233,7 +233,7 @@ export const saveInventoryItem = (entity) => async (dispatch) => { promises.push(saveItemMetaFieldTypes(normalizedEntity)(dispatch)); } - Promise.all(promises) + return Promise.all(promises) .then(() => { dispatch( showSuccessMessage( @@ -241,15 +241,13 @@ export const saveInventoryItem = (entity) => async (dispatch) => { ) ); }) - .catch((err) => { - console.error(err); - }) .finally(() => { dispatch(stopLoading()); }); }) .catch((err) => { console.error(err); + throw err; }); } diff --git a/src/actions/sponsor-actions.js b/src/actions/sponsor-actions.js index e20b7fb84..062b58bbc 100644 --- a/src/actions/sponsor-actions.js +++ b/src/actions/sponsor-actions.js @@ -1128,7 +1128,7 @@ export const saveSummitSponsorship = (entity) => async (dispatch, getState) => { const normalizedEntity = normalizeSponsorship(entity); if (entity.id) { - putRequest( + return putRequest( createAction(UPDATE_SUMMIT_SPONSORSHIP), createAction(SUMMIT_SPONSORSHIP_UPDATED), `${window.API_BASE_URL}/api/v1/summits/${currentSummit.id}/sponsorships-types/${entity.id}`, @@ -1140,14 +1140,14 @@ export const saveSummitSponsorship = (entity) => async (dispatch, getState) => { showSuccessMessage(T.translate("edit_sponsorship.sponsorship_saved")) ); }); - } else { + } const success_message = { title: T.translate("general.done"), html: T.translate("edit_sponsorship.sponsorship_created"), type: "success" }; - postRequest( + return postRequest( createAction(UPDATE_SUMMIT_SPONSORSHIP), createAction(SUMMIT_SPONSORSHIP_ADDED), `${window.API_BASE_URL}/api/v1/summits/${currentSummit.id}/sponsorships-types`, @@ -1157,7 +1157,7 @@ export const saveSummitSponsorship = (entity) => async (dispatch, getState) => { )(params)(dispatch).then(() => { dispatch(showMessage(success_message)); }); - } + }; export const uploadSponsorshipBadgeImage = diff --git a/src/pages/sponsors-global/page-templates/page-template-list-page.js b/src/pages/sponsors-global/page-templates/page-template-list-page.js index b19a3e416..6d2cd4021 100644 --- a/src/pages/sponsors-global/page-templates/page-template-list-page.js +++ b/src/pages/sponsors-global/page-templates/page-template-list-page.js @@ -115,7 +115,7 @@ const PageTemplateListPage = ({ }; const handleSavePageTemplate = (entity) => - savePageTemplate(entity).then(() => { + savePageTemplate(entity).then(() => getPageTemplates( term, DEFAULT_CURRENT_PAGE, @@ -123,8 +123,8 @@ const PageTemplateListPage = ({ order, orderDir, showArchived - ).catch(() => {}); - }); + ).catch(() => { }) + ); const handleArchive = (item) => item.is_archived From 0bc857feaaa6f96779ac6ab075f7d711fc2253b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Fri, 19 Jun 2026 18:14:37 -0300 Subject: [PATCH 3/9] fix: move stopLoading outisde Promise array MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/actions/inventory-item-actions.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/actions/inventory-item-actions.js b/src/actions/inventory-item-actions.js index ba4120316..974a10d27 100644 --- a/src/actions/inventory-item-actions.js +++ b/src/actions/inventory-item-actions.js @@ -233,21 +233,20 @@ export const saveInventoryItem = (entity) => async (dispatch) => { promises.push(saveItemMetaFieldTypes(normalizedEntity)(dispatch)); } - return Promise.all(promises) - .then(() => { - dispatch( - showSuccessMessage( - T.translate("edit_inventory_item.inventory_item_saved") - ) - ); - }) - .finally(() => { - dispatch(stopLoading()); - }); + return Promise.all(promises).then(() => { + dispatch( + showSuccessMessage( + T.translate("edit_inventory_item.inventory_item_saved") + ) + ); + }); }) .catch((err) => { console.error(err); throw err; + }) + .finally(() => { + dispatch(stopLoading()); }); } From ebfb0c8a51a1477f67927687e25b14166c86db52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Mon, 13 Jul 2026 09:19:17 -0300 Subject: [PATCH 4/9] fix: adjust code from PR comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/actions/inventory-item-actions.js | 1 + src/actions/sponsor-actions.js | 34 +++++++++---------- .../form-template-item-list-page.js | 2 +- .../form-templates/form-template-list-page.js | 30 +++++++++------- .../form-templates/form-template-popup.js | 4 +-- .../form-templates/sponsor-inventory-popup.js | 3 +- .../inventory/inventory-list-page.js | 2 +- .../page-templates/page-template-list-page.js | 2 +- .../page-template-popup/index.js | 8 ++--- src/pages/sponsors/popup/add-sponsor-popup.js | 1 + src/pages/sponsors/popup/edit-tier-popup.js | 1 + .../sponsors/show-pages-list-page/index.js | 2 +- src/pages/sponsors/sponsor-list-page.js | 4 ++- .../sponsor-forms-manage-items.js | 2 +- .../add-sponsor-page-template-popup/index.js | 1 + .../tabs/sponsor-pages-tab/index.js | 8 ++--- .../sponsors/summit-sponsorship-list-page.js | 3 +- .../components/sponsorship-dialog.js | 1 + .../sponsorship-list-page.js | 8 ++++- src/pages/tags/tag-list-page.js | 2 +- 20 files changed, 66 insertions(+), 53 deletions(-) diff --git a/src/actions/inventory-item-actions.js b/src/actions/inventory-item-actions.js index 974a10d27..374750771 100644 --- a/src/actions/inventory-item-actions.js +++ b/src/actions/inventory-item-actions.js @@ -286,6 +286,7 @@ export const saveInventoryItem = (entity) => async (dispatch) => { }) .catch((err) => { console.error(err); + throw err; }) .finally(() => { dispatch(stopLoading()); diff --git a/src/actions/sponsor-actions.js b/src/actions/sponsor-actions.js index 062b58bbc..b32b68b40 100644 --- a/src/actions/sponsor-actions.js +++ b/src/actions/sponsor-actions.js @@ -1140,24 +1140,24 @@ export const saveSummitSponsorship = (entity) => async (dispatch, getState) => { showSuccessMessage(T.translate("edit_sponsorship.sponsorship_saved")) ); }); - } - const success_message = { - title: T.translate("general.done"), - html: T.translate("edit_sponsorship.sponsorship_created"), - type: "success" - }; + } - return postRequest( - createAction(UPDATE_SUMMIT_SPONSORSHIP), - createAction(SUMMIT_SPONSORSHIP_ADDED), - `${window.API_BASE_URL}/api/v1/summits/${currentSummit.id}/sponsorships-types`, - normalizedEntity, - authErrorHandler, - entity - )(params)(dispatch).then(() => { - dispatch(showMessage(success_message)); - }); - + const success_message = { + title: T.translate("general.done"), + html: T.translate("edit_sponsorship.sponsorship_created"), + type: "success" + }; + + return postRequest( + createAction(UPDATE_SUMMIT_SPONSORSHIP), + createAction(SUMMIT_SPONSORSHIP_ADDED), + `${window.API_BASE_URL}/api/v1/summits/${currentSummit.id}/sponsorships-types`, + normalizedEntity, + authErrorHandler, + entity + )(params)(dispatch).then(() => { + dispatch(showMessage(success_message)); + }); }; export const uploadSponsorshipBadgeImage = diff --git a/src/pages/sponsors-global/form-templates/form-template-item-list-page.js b/src/pages/sponsors-global/form-templates/form-template-item-list-page.js index 4015d275d..b14752eed 100644 --- a/src/pages/sponsors-global/form-templates/form-template-item-list-page.js +++ b/src/pages/sponsors-global/form-templates/form-template-item-list-page.js @@ -184,7 +184,7 @@ const FormTemplateItemListPage = ({ order, orderDir, showArchived - ) + ).catch(() => {}) ); const columns = [ diff --git a/src/pages/sponsors-global/form-templates/form-template-list-page.js b/src/pages/sponsors-global/form-templates/form-template-list-page.js index 8c42901c4..c0d0e969d 100644 --- a/src/pages/sponsors-global/form-templates/form-template-list-page.js +++ b/src/pages/sponsors-global/form-templates/form-template-list-page.js @@ -139,6 +139,11 @@ const FormTemplateListPage = ({ setFormTemplateFromDuplicatePopupOpen(false); }; + const handleCloseFormTemplateDialog = () => { + resetFormTemplateForm(); + setFormTemplatePopupOpen(false); + }; + const handleDuplicatePopupClose = () => { getFormTemplates( "", @@ -221,7 +226,7 @@ const FormTemplateListPage = ({ order, orderDir, showArchived - ) + ).catch(() => {}) ); return ( @@ -330,17 +335,18 @@ const FormTemplateListPage = ({ /> )} - setFormTemplatePopupOpen(false)} - onMetaFieldTypeDeleted={deleteFormTemplateMetaFieldType} - onMetaFieldTypeValueDeleted={deleteFormTemplateMetaFieldTypeValue} - onMaterialDeleted={deleteFormTemplateMaterial} - /> + {formTemplatePopupOpen && ( + + )} onClose()) + .catch(() => {}) .finally(() => setIsSaving(false)); } }); diff --git a/src/pages/sponsors-global/inventory/inventory-list-page.js b/src/pages/sponsors-global/inventory/inventory-list-page.js index 6d8c2b1de..c497ea7bc 100644 --- a/src/pages/sponsors-global/inventory/inventory-list-page.js +++ b/src/pages/sponsors-global/inventory/inventory-list-page.js @@ -141,7 +141,7 @@ const InventoryListPage = ({ order, orderDir, showArchived - ) + ).catch(() => {}) ); const handleArchiveItem = (item) => diff --git a/src/pages/sponsors-global/page-templates/page-template-list-page.js b/src/pages/sponsors-global/page-templates/page-template-list-page.js index 6d2cd4021..08b8fb610 100644 --- a/src/pages/sponsors-global/page-templates/page-template-list-page.js +++ b/src/pages/sponsors-global/page-templates/page-template-list-page.js @@ -123,7 +123,7 @@ const PageTemplateListPage = ({ order, orderDir, showArchived - ).catch(() => { }) + ).catch(() => {}) ); const handleArchive = (item) => diff --git a/src/pages/sponsors-global/page-templates/page-template-popup/index.js b/src/pages/sponsors-global/page-templates/page-template-popup/index.js index 2f10a1a7f..192d9bc15 100644 --- a/src/pages/sponsors-global/page-templates/page-template-popup/index.js +++ b/src/pages/sponsors-global/page-templates/page-template-popup/index.js @@ -172,13 +172,9 @@ const PageTemplatePopup = ({ })); onSave({ ...values, modules: modulesWithOrder }) - .then(() => { - onClose(); - }) + .then(() => onClose()) .catch(() => {}) - .finally(() => { - setIsSaving(false); - }); + .finally(() => setIsSaving(false)); } }); diff --git a/src/pages/sponsors/popup/add-sponsor-popup.js b/src/pages/sponsors/popup/add-sponsor-popup.js index 75011f32a..0e9054e38 100644 --- a/src/pages/sponsors/popup/add-sponsor-popup.js +++ b/src/pages/sponsors/popup/add-sponsor-popup.js @@ -58,6 +58,7 @@ const AddSponsorDialog = ({ onClose, onSubmit, summitId }) => { setIsSaving(true); onSubmit(values) .then(() => onClose()) + .catch(() => {}) .finally(() => setIsSaving(false)); }, enableReinitialize: true diff --git a/src/pages/sponsors/popup/edit-tier-popup.js b/src/pages/sponsors/popup/edit-tier-popup.js index def72c1ae..cb4452fa4 100644 --- a/src/pages/sponsors/popup/edit-tier-popup.js +++ b/src/pages/sponsors/popup/edit-tier-popup.js @@ -75,6 +75,7 @@ const EditTierDialog = ({ setIsSaving(true); onSubmit(values) .then(() => onClose()) + .catch(() => {}) .finally(() => setIsSaving(false)); }, enableReinitialize: true diff --git a/src/pages/sponsors/show-pages-list-page/index.js b/src/pages/sponsors/show-pages-list-page/index.js index c4f40b5de..5eb64f82d 100644 --- a/src/pages/sponsors/show-pages-list-page/index.js +++ b/src/pages/sponsors/show-pages-list-page/index.js @@ -134,7 +134,7 @@ const ShowPagesListPage = ({ order, orderDir, showArchived - ) + ).catch(() => {}) ); const handleOpenPageTemplatePopup = async (row) => { diff --git a/src/pages/sponsors/sponsor-list-page.js b/src/pages/sponsors/sponsor-list-page.js index 739919b26..9bc7d95f8 100644 --- a/src/pages/sponsors/sponsor-list-page.js +++ b/src/pages/sponsors/sponsor-list-page.js @@ -71,7 +71,9 @@ const SponsorListPage = ({ const handleNewSponsor = (sponsor) => addSponsorToSummit(sponsor).then(() => - getSponsors(term, DEFAULT_CURRENT_PAGE, perPage, order, orderDir) + getSponsors(term, DEFAULT_CURRENT_PAGE, perPage, order, orderDir).catch( + () => {} + ) ); const handlePageChange = (page) => { diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items.js index ee964e236..72557182f 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items.js @@ -139,7 +139,7 @@ const SponsorFormsManageItems = ({ order, orderDir, showArchived - ); + ).catch(() => {}); resetSponsorFormManagedItem(); }); diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/components/add-sponsor-page-template-popup/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/components/add-sponsor-page-template-popup/index.js index 6e2ccce9a..90cf133cd 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/components/add-sponsor-page-template-popup/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/components/add-sponsor-page-template-popup/index.js @@ -82,6 +82,7 @@ const AddSponsorPageTemplatePopup = ({ }; onSubmit(entity) .then(() => onClose()) + .catch(() => {}) .finally(() => setIsSaving(false)); }, enableReinitialize: true diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/index.js index 6128af23e..a87b345b6 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/index.js @@ -258,7 +258,7 @@ const SponsorPagesTab = ({ order, orderDir, showArchived - ); + ).catch(() => {}); }); const handleSaveCustomizedPage = (entity) => @@ -271,7 +271,7 @@ const SponsorPagesTab = ({ order, orderDir, showArchived - ); + ).catch(() => {}); }); const handleSaveManagedPage = (entity) => @@ -283,7 +283,7 @@ const SponsorPagesTab = ({ managedPages.order, managedPages.orderDir, showArchived - ); + ).catch(() => {}); getSponsorCustomizedPages( term, DEFAULT_CURRENT_PAGE, @@ -291,7 +291,7 @@ const SponsorPagesTab = ({ customizedPages.order, customizedPages.orderDir, showArchived - ); + ).catch(() => {}); }); const handleClosePagePopup = () => { diff --git a/src/pages/sponsors/summit-sponsorship-list-page.js b/src/pages/sponsors/summit-sponsorship-list-page.js index 365fdab58..f043f6cf5 100644 --- a/src/pages/sponsors/summit-sponsorship-list-page.js +++ b/src/pages/sponsors/summit-sponsorship-list-page.js @@ -95,11 +95,10 @@ const SummitSponsorshipListPage = ({ updateSummitSponsorhipOrder(newOrder, itemId, newItemOrder); }; - const handleSaveSummitSponsorship = (sponsorship) => { + const handleSaveSummitSponsorship = (sponsorship) => saveSummitSponsorship(sponsorship).then(() => getSummitSponsorships(DEFAULT_CURRENT_PAGE, perPage, order, orderDir) ); - }; const columns = [ { diff --git a/src/pages/sponsorship-types/components/sponsorship-dialog.js b/src/pages/sponsorship-types/components/sponsorship-dialog.js index fb60052f3..737a88aef 100644 --- a/src/pages/sponsorship-types/components/sponsorship-dialog.js +++ b/src/pages/sponsorship-types/components/sponsorship-dialog.js @@ -47,6 +47,7 @@ const SponsorshipDialog = ({ entity: initialEntity, onClose, onSave }) => { setIsSaving(true); onSave(values) .then(() => onClose()) + .catch(() => {}) .finally(() => setIsSaving(false)); } }); diff --git a/src/pages/sponsorship-types/sponsorship-list-page.js b/src/pages/sponsorship-types/sponsorship-list-page.js index 0792fddb9..3004bc7ec 100644 --- a/src/pages/sponsorship-types/sponsorship-list-page.js +++ b/src/pages/sponsorship-types/sponsorship-list-page.js @@ -81,7 +81,13 @@ const SponsorshipListPage = ({ const handleSave = (entity) => saveSponsorship(entity).then(() => - getSponsorships(term, DEFAULT_CURRENT_PAGE, perPage, order, orderDir) + getSponsorships( + term, + DEFAULT_CURRENT_PAGE, + perPage, + order, + orderDir + ).catch(() => {}) ); const handleDelete = (sponsorshipId) => { diff --git a/src/pages/tags/tag-list-page.js b/src/pages/tags/tag-list-page.js index 4a4a045b7..0e4155652 100644 --- a/src/pages/tags/tag-list-page.js +++ b/src/pages/tags/tag-list-page.js @@ -76,7 +76,7 @@ const TagListPage = ({ const handleSaveTag = (entity) => saveTag(entity).then(() => - getTags(search, currentPage, perPage, order, orderDir) + getTags(search, currentPage, perPage, order, orderDir).catch(() => {}) ); const handleDeleteTag = (id) => { From 8710e87297e7cd61c100e1cccf3d5a4ea3203eed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Mon, 13 Jul 2026 09:55:35 -0300 Subject: [PATCH 5/9] fix: clear open prop from dialogs, update test cases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- .../form-template-from-duplicate-popup.js | 4 +- .../form-templates/form-template-list-page.js | 29 +++--- .../__tests__/show-pages-list-page.test.js | 2 +- .../__test__/inventory-popup.test.js | 96 ++++++++----------- ...nsor-form-add-item-from-inventory-popup.js | 4 +- .../components/sponsor-form-item-popup.js | 4 +- .../sponsor-form-item-list-page/index.js | 22 +++-- .../form-template/form-template-popup.js | 4 +- .../global-template/global-template-popup.js | 5 +- .../sponsors/sponsor-forms-list-page/index.js | 18 ++-- .../edit-badge-scan-popup.js | 5 +- .../tabs/sponsor-badge-scans/index.js | 1 - .../__tests__/select-form-dialog.test.js | 11 --- .../components/select-form-dialog/index.js | 9 +- .../tabs/sponsor-cart-tab/index.js | 15 +-- .../__tests__/customized-form-popup.test.js | 3 - .../customized-form/customized-form-popup.js | 4 +- .../tabs/sponsor-forms-tab/index.js | 19 ++-- .../add-extra-question-popup.js | 4 +- .../sponsor-general-form/add-tier-popup.js | 5 +- .../sponsor-general-form/extra-questions.js | 1 - .../manage-tier-addons-popup.js | 4 +- .../tabs/sponsor-general-form/sponsorship.js | 2 - .../__tests__/sponsor-pages-tab.test.js | 4 +- .../components/import-users-popup.js | 3 +- .../components/new-user-popup.js | 10 +- .../components/process-request-popup.js | 3 +- .../sponsor-users-list-per-sponsor/index.js | 3 - 28 files changed, 118 insertions(+), 176 deletions(-) diff --git a/src/pages/sponsors-global/form-templates/form-template-from-duplicate-popup.js b/src/pages/sponsors-global/form-templates/form-template-from-duplicate-popup.js index f76fc6528..17b79a843 100644 --- a/src/pages/sponsors-global/form-templates/form-template-from-duplicate-popup.js +++ b/src/pages/sponsors-global/form-templates/form-template-from-duplicate-popup.js @@ -22,7 +22,6 @@ import SearchInput from "openstack-uicore-foundation/lib/components/mui/search-i import MenuButton from "../../../components/mui/menu-button"; const FormTemplateFromDuplicateDialog = ({ - open, options, onClose, onDuplicate, @@ -94,7 +93,7 @@ const FormTemplateFromDuplicateDialog = ({ ]; return ( - + {T.translate("form_template_from_duplicate_dialog.duplicate_form")} @@ -176,7 +175,6 @@ const FormTemplateFromDuplicateDialog = ({ }; FormTemplateFromDuplicateDialog.propTypes = { - open: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, onDuplicate: PropTypes.func.isRequired, onSearch: PropTypes.func.isRequired, diff --git a/src/pages/sponsors-global/form-templates/form-template-list-page.js b/src/pages/sponsors-global/form-templates/form-template-list-page.js index c0d0e969d..b6d0f1cbe 100644 --- a/src/pages/sponsors-global/form-templates/form-template-list-page.js +++ b/src/pages/sponsors-global/form-templates/form-template-list-page.js @@ -347,20 +347,21 @@ const FormTemplateListPage = ({ onMaterialDeleted={deleteFormTemplateMaterial} /> )} - + {formTemplateFromDuplicatePopupOpen && ( + + )} ); }; 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 9df2140fc..4ada962ec 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 @@ -51,7 +51,7 @@ jest.mock( jest.mock("../../../../actions/show-pages-actions", () => ({ ...jest.requireActual("../../../../actions/show-pages-actions"), - getShowPages: jest.fn(() => ({ type: "MOCK_ACTION" })), + getShowPages: jest.fn(() => () => Promise.resolve()), getShowPage: jest.fn( () => () => Promise.resolve({ id: 1, name: "Test Page" }) ), diff --git a/src/pages/sponsors/sponsor-form-item-list-page/components/__test__/inventory-popup.test.js b/src/pages/sponsors/sponsor-form-item-list-page/components/__test__/inventory-popup.test.js index f602a371c..5c10d6b43 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/components/__test__/inventory-popup.test.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/components/__test__/inventory-popup.test.js @@ -45,7 +45,6 @@ jest.mock("openstack-uicore-foundation/lib/utils/money", () => ({ describe("InventoryPopup", () => { it("check if title is being rendered", async () => { const formId = "AAA"; - const open = true; const onClose = jest.fn(); const inventoryItems = { @@ -58,16 +57,13 @@ describe("InventoryPopup", () => { totalInventoryItems: 2 }; - renderWithRedux( - , - { - initialState: { - currentInventoryItemListState: { - inventoryItems - } + renderWithRedux(, { + initialState: { + currentInventoryItemListState: { + inventoryItems } } - ); + }); const node = screen.getByText( "sponsor_form_item_list.add_from_inventory.title" @@ -79,7 +75,6 @@ describe("InventoryPopup", () => { it("check if close button calls close callback", async () => { const formId = "AAA"; - const open = true; const onClose = jest.fn(); const inventoryItems = { @@ -92,16 +87,13 @@ describe("InventoryPopup", () => { totalInventoryItems: 2 }; - renderWithRedux( - , - { - initialState: { - currentInventoryItemListState: { - inventoryItems - } + renderWithRedux(, { + initialState: { + currentInventoryItemListState: { + inventoryItems } } - ); + }); const user = userEvent.setup(); const node = screen.getByTestId("close-dialog"); @@ -112,46 +104,42 @@ describe("InventoryPopup", () => { it("check if close button clears selected rows", async () => { const formId = "AAA"; - const open = true; const onClose = jest.fn(); - renderWithRedux( - , - { - initialState: { - currentInventoryItemListState: { - inventoryItems: [ - { - id: "123", - code: "AAA", - name: "My Item", - early_bird_rate: "100", - standard_rate: "100", - onsite_rate: "100", - hasImage: false, - images: [] - }, - { - id: "456", - code: "AAAA", - name: "My Item", - early_bird_rate: "100", - standard_rate: "100", - onsite_rate: "100", - hasImage: false, - images: [] - } - ], - term: "", - order: "", - orderDir: "1", - currentPage: 1, - perPage: 10, - totalInventoryItems: 2 - } + renderWithRedux(, { + initialState: { + currentInventoryItemListState: { + inventoryItems: [ + { + id: "123", + code: "AAA", + name: "My Item", + early_bird_rate: "100", + standard_rate: "100", + onsite_rate: "100", + hasImage: false, + images: [] + }, + { + id: "456", + code: "AAAA", + name: "My Item", + early_bird_rate: "100", + standard_rate: "100", + onsite_rate: "100", + hasImage: false, + images: [] + } + ], + term: "", + order: "", + orderDir: "1", + currentPage: 1, + perPage: 10, + totalInventoryItems: 2 } } - ); + }); const user = userEvent.setup(); diff --git a/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-add-item-from-inventory-popup.js b/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-add-item-from-inventory-popup.js index b2e980d8a..9d71f90a7 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-add-item-from-inventory-popup.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-add-item-from-inventory-popup.js @@ -27,7 +27,6 @@ import { DEFAULT_CURRENT_PAGE } from "../../../../utils/constants"; const SponsorFormAddItemFromInventoryPopup = ({ formId, - open, onClose, addInventoryItems, getInventoryItems, @@ -161,7 +160,7 @@ const SponsorFormAddItemFromInventoryPopup = ({ ]; return ( - + + )} - setOpenPopup(null)} - /> - setOpenPopup(null)} - /> + {openPopup === "crud" && ( + setOpenPopup(null)} + /> + )} + {openPopup === "inventory" && ( + setOpenPopup(null)} + /> + )} ); }; diff --git a/src/pages/sponsors/sponsor-forms-list-page/components/form-template/form-template-popup.js b/src/pages/sponsors/sponsor-forms-list-page/components/form-template/form-template-popup.js index 964104c19..916e52f8e 100644 --- a/src/pages/sponsors/sponsor-forms-list-page/components/form-template/form-template-popup.js +++ b/src/pages/sponsors/sponsor-forms-list-page/components/form-template/form-template-popup.js @@ -23,7 +23,6 @@ const FormTemplatePopup = ({ summitTZ, sponsorships, formTemplate, - open, onClose, getSummitSponsorshipTypes, resetFormTemplate, @@ -67,7 +66,7 @@ const FormTemplatePopup = ({ return ( { handleClose(); }} @@ -111,7 +110,6 @@ const FormTemplatePopup = ({ }; FormTemplatePopup.propTypes = { - open: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, edit: PropTypes.bool.isRequired }; diff --git a/src/pages/sponsors/sponsor-forms-list-page/components/global-template/global-template-popup.js b/src/pages/sponsors/sponsor-forms-list-page/components/global-template/global-template-popup.js index 9058f366c..72ae3e6c3 100644 --- a/src/pages/sponsors/sponsor-forms-list-page/components/global-template/global-template-popup.js +++ b/src/pages/sponsors/sponsor-forms-list-page/components/global-template/global-template-popup.js @@ -6,7 +6,7 @@ import { cloneGlobalTemplate } from "../../../../../actions/sponsor-forms-action import SelectTemplatesDialog from "./select-templates-dialog"; import SelectSponsorshipsDialog from "./select-sponsorships-dialog"; -const GlobalTemplatePopup = ({ open, onClose, cloneGlobalTemplate }) => { +const GlobalTemplatePopup = ({ onClose, cloneGlobalTemplate }) => { const [stage, setStage] = useState("templates"); const [selectedTemplates, setSelectedTemplates] = useState([]); const [isSaving, setIsSaving] = useState(false); @@ -45,7 +45,7 @@ const GlobalTemplatePopup = ({ open, onClose, cloneGlobalTemplate }) => { return ( { }; GlobalTemplatePopup.propTypes = { - open: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired }; diff --git a/src/pages/sponsors/sponsor-forms-list-page/index.js b/src/pages/sponsors/sponsor-forms-list-page/index.js index 0c7d3e6ac..dc1cabe4d 100644 --- a/src/pages/sponsors/sponsor-forms-list-page/index.js +++ b/src/pages/sponsors/sponsor-forms-list-page/index.js @@ -432,15 +432,15 @@ const SponsorFormsListPage = ({ /> )} - setOpenPopup(null)} - /> - setOpenPopup(null)} - edit={openPopup === "edit"} - /> + {openPopup === "clone" && ( + setOpenPopup(null)} /> + )} + {(openPopup === "new" || openPopup === "edit") && ( + setOpenPopup(null)} + edit={openPopup === "edit"} + /> + )} ); }; diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/edit-badge-scan-popup.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/edit-badge-scan-popup.js index b56dbcf2b..9c0f5a967 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/edit-badge-scan-popup.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/edit-badge-scan-popup.js @@ -38,7 +38,7 @@ const formatExtraQuestions = (extraQuestions, sponsorQuestions) => { return values; }; -const EditBadgeScanPopup = ({ badgeScan, open, onClose, onSubmit }) => { +const EditBadgeScanPopup = ({ badgeScan, onClose, onSubmit }) => { const formik = useFormik({ initialValues: { id: badgeScan.id, @@ -111,7 +111,7 @@ const EditBadgeScanPopup = ({ badgeScan, open, onClose, onSubmit }) => { }, [formik.values]); return ( - + {T.translate("edit_badge_scan.edit_badge_scan")} @@ -218,7 +218,6 @@ const EditBadgeScanPopup = ({ badgeScan, open, onClose, onSubmit }) => { }; EditBadgeScanPopup.propTypes = { - open: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, onSubmit: PropTypes.func.isRequired }; diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/index.js index 7b9699c1a..b85c38f95 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/index.js @@ -244,7 +244,6 @@ const SponsorBadgeScans = ({ {showEditBadgeScanPopup && ( diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/select-form-dialog/__tests__/select-form-dialog.test.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/select-form-dialog/__tests__/select-form-dialog.test.js index 298658f7f..bbc6efcda 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/select-form-dialog/__tests__/select-form-dialog.test.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/select-form-dialog/__tests__/select-form-dialog.test.js @@ -157,7 +157,6 @@ const renderWithStore = (props, storeState = {}) => { const store = mockStore(defaultState); const defaultProps = { - open: true, summitId: 1, sponsor: { id: 10, name: "Test Sponsor" }, onClose: jest.fn(), @@ -197,16 +196,6 @@ describe("SelectFormDialog", () => { expect(getSponsorFormsForCart).toHaveBeenCalled(); }); - test("does not call getSponsorFormsForCart when dialog is closed", () => { - const { - getSponsorFormsForCart - } = require("../../../../../../../../actions/sponsor-cart-actions"); - - renderWithStore({ open: false }); - - expect(getSponsorFormsForCart).not.toHaveBeenCalled(); - }); - test("displays initial selection count as 0", () => { renderWithStore(); diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/select-form-dialog/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/select-form-dialog/index.js index 8b4631380..2d9c2fdd2 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/select-form-dialog/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/select-form-dialog/index.js @@ -26,7 +26,6 @@ const SelectFormDialog = ({ availableForms, summitId, sponsor, - open, onSave, onClose, getSponsorFormsForCart @@ -36,10 +35,8 @@ const SelectFormDialog = ({ const { forms, currentPage, term, order, orderDir, total } = availableForms; useEffect(() => { - if (open) { - getSponsorFormsForCart(); - } - }, [open]); + getSponsorFormsForCart(); + }, []); const handleSort = (key, dir) => { getSponsorFormsForCart(term, 1, key, dir); @@ -110,7 +107,7 @@ const SelectFormDialog = ({ ]; return ( - + { )} - setOpenAddFormDialog(false)} - /> + {!!openAddFormDialog && ( + setOpenAddFormDialog(false)} + /> + )} )} /> diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/customized-form/__tests__/customized-form-popup.test.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/customized-form/__tests__/customized-form-popup.test.js index 036ca9781..42cacff58 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/customized-form/__tests__/customized-form-popup.test.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/customized-form/__tests__/customized-form-popup.test.js @@ -66,7 +66,6 @@ describe("CustomizedFormPopup", () => { renderWithRedux( { renderWithRedux( { renderWithRedux( )} - + {!!customFormEdit && ( + + )} ); }; diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-extra-question-popup.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-extra-question-popup.js index 5b3c04c00..a1083be38 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-extra-question-popup.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-extra-question-popup.js @@ -39,7 +39,6 @@ import { ExtraQuestionsTypeAllowSubQuestion } from "../../../../../utils/constan const AddSponsorExtraQuestionPopup = ({ entity: extraQuestion, summit, - open, onClose, onSubmit, allClasses, @@ -296,7 +295,7 @@ const AddSponsorExtraQuestionPopup = ({ : []; return ( - + {extraQuestion.id @@ -655,7 +654,6 @@ const mapStateToProps = ({ currentSponsorExtraQuestionState }) => ({ }); AddSponsorExtraQuestionPopup.propTypes = { - open: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, onSubmit: PropTypes.func.isRequired }; diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-tier-popup.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-tier-popup.js index fbf6d6d5d..6cbf069c4 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-tier-popup.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-tier-popup.js @@ -23,7 +23,7 @@ import useScrollToError from "../../../../../hooks/useScrollToError"; import SponsorshipsBySummitSelectMUI from "../../../../../components/mui/formik-inputs/sponsorship-summit-select-mui"; import MuiFormikTextField from "../../../../../components/mui/formik-inputs/mui-formik-textfield"; -const AddTierPopup = ({ sponsor, open, onClose, onSubmit, summitId }) => { +const AddTierPopup = ({ sponsor, onClose, onSubmit, summitId }) => { const formik = useFormik({ initialValues: { company: sponsor.company?.name, @@ -68,7 +68,7 @@ const AddTierPopup = ({ sponsor, open, onClose, onSubmit, summitId }) => { }, [formik.values]); return ( - + {T.translate("edit_sponsor.add_tier")} @@ -147,7 +147,6 @@ const AddTierPopup = ({ sponsor, open, onClose, onSubmit, summitId }) => { }; AddTierPopup.propTypes = { - open: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, onSubmit: PropTypes.func.isRequired, summitId: PropTypes.number.isRequired diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/extra-questions.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/extra-questions.js index 6fa3703f6..62da352bf 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/extra-questions.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/extra-questions.js @@ -209,7 +209,6 @@ const SponsorExtraQuestions = ({ {showAddExtraQuestionPopup && ( + {T.translate("edit_sponsor.manage_addons")} @@ -396,7 +395,6 @@ const ManageTierAddonsPopup = ({ }; ManageTierAddonsPopup.propTypes = { - open: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, onSubmit: PropTypes.func.isRequired, onSponsorshipAddonRemove: PropTypes.func.isRequired, diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/sponsorship.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/sponsorship.js index 2b3ccbd75..5a966b761 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/sponsorship.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/sponsorship.js @@ -174,7 +174,6 @@ const Sponsorship = ({ @@ -184,7 +183,6 @@ const Sponsorship = ({ ({ ...jest.requireActual("../../../../../../actions/sponsor-pages-actions"), - getSponsorManagedPages: jest.fn(() => ({ type: "MOCK_ACTION" })), - getSponsorCustomizedPages: jest.fn(() => ({ type: "MOCK_ACTION" })), + getSponsorManagedPages: jest.fn(() => () => Promise.resolve()), + getSponsorCustomizedPages: jest.fn(() => () => Promise.resolve()), getSponsorCustomizedPage: jest.fn( () => () => Promise.resolve({ id: 1, name: "Test Page" }) ), diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-users-list-per-sponsor/components/import-users-popup.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-users-list-per-sponsor/components/import-users-popup.js index 0c3e5b51d..496be723e 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-users-list-per-sponsor/components/import-users-popup.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-users-list-per-sponsor/components/import-users-popup.js @@ -22,7 +22,6 @@ import { } from "../../../../../../actions/sponsor-users-actions"; const ImportUsersPopup = ({ - open, currentSummit, sponsorId, companyId, @@ -84,7 +83,7 @@ const ImportUsersPopup = ({ }; return ( - + + + setOpenPopup(null)} sponsorId={sponsor.id} /> @@ -177,7 +176,6 @@ const SponsorUsersListPerSponsorPage = ({ {openPopup === "access_request" && ( setOpenPopup(null)} requests={requests} sponsorId={sponsor.id} @@ -187,7 +185,6 @@ const SponsorUsersListPerSponsorPage = ({ {openPopup === "import" && ( setOpenPopup(null)} sponsorId={sponsor.id} companyId={sponsor.company?.id} From 9c3c57e9f9a5b7a5aa99d6ec581b797058272b82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Mon, 20 Jul 2026 13:09:58 -0300 Subject: [PATCH 6/9] fix: return promise and catch error on new inventory item. Catch summit sponsorships MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/actions/inventory-item-actions.js | 26 ++++++++----------- .../sponsors/summit-sponsorship-list-page.js | 7 ++++- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/actions/inventory-item-actions.js b/src/actions/inventory-item-actions.js index 374750771..9a7fa66ca 100644 --- a/src/actions/inventory-item-actions.js +++ b/src/actions/inventory-item-actions.js @@ -276,24 +276,20 @@ export const saveInventoryItem = (entity) => async (dispatch) => { promises.push(saveItemMetaFieldTypes(inventoryItem)(dispatch)); } - Promise.all(promises) - .then(() => { - dispatch( - showMessage(success_message, () => { - history.push("/app/inventory"); - }) - ); - }) - .catch((err) => { - console.error(err); - throw err; - }) - .finally(() => { - dispatch(stopLoading()); - }); + return Promise.all(promises).then(() => { + dispatch( + showMessage(success_message, () => { + history.push("/app/inventory"); + }) + ); + }); }) .catch((err) => { console.error(err); + throw err; + }) + .finally(() => { + dispatch(stopLoading()); }); }; diff --git a/src/pages/sponsors/summit-sponsorship-list-page.js b/src/pages/sponsors/summit-sponsorship-list-page.js index f043f6cf5..455d3155d 100644 --- a/src/pages/sponsors/summit-sponsorship-list-page.js +++ b/src/pages/sponsors/summit-sponsorship-list-page.js @@ -97,7 +97,12 @@ const SummitSponsorshipListPage = ({ const handleSaveSummitSponsorship = (sponsorship) => saveSummitSponsorship(sponsorship).then(() => - getSummitSponsorships(DEFAULT_CURRENT_PAGE, perPage, order, orderDir) + getSummitSponsorships( + DEFAULT_CURRENT_PAGE, + perPage, + order, + orderDir + ).catch(() => {}) ); const columns = [ From 6bbbf465451ebba1549eff85c17e585411c5cc80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Mon, 20 Jul 2026 13:43:31 -0300 Subject: [PATCH 7/9] fix: adjust popups for sponsor form item list page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/actions/sponsor-forms-actions.js | 8 +- .../__test__/inventory-popup.test.js | 175 +++++++----------- ...nsor-form-add-item-from-inventory-popup.js | 43 ++--- .../components/sponsor-form-item-form.js | 9 +- .../components/sponsor-form-item-popup.js | 74 ++++---- .../sponsor-form-item-list-page/index.js | 45 ++++- 6 files changed, 172 insertions(+), 182 deletions(-) diff --git a/src/actions/sponsor-forms-actions.js b/src/actions/sponsor-forms-actions.js index 959c8ac4a..4dfea6b4e 100644 --- a/src/actions/sponsor-forms-actions.js +++ b/src/actions/sponsor-forms-actions.js @@ -1355,7 +1355,9 @@ export const updateSponsorFormItem = ); }); }) - .catch(console.log) // need to catch promise reject + .catch((err) => { + throw err; + }) .finally(() => { dispatch(stopLoading()); }); @@ -1490,7 +1492,9 @@ export const addInventoryItems = }) ); }) - .catch(console.log) // need to catch promise reject + .catch((err) => { + throw err; + }) .finally(() => { dispatch(stopLoading()); }); diff --git a/src/pages/sponsors/sponsor-form-item-list-page/components/__test__/inventory-popup.test.js b/src/pages/sponsors/sponsor-form-item-list-page/components/__test__/inventory-popup.test.js index 5c10d6b43..c8ff0d0bd 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/components/__test__/inventory-popup.test.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/components/__test__/inventory-popup.test.js @@ -1,69 +1,36 @@ import React from "react"; -import { screen } from "@testing-library/react"; +import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { renderWithRedux } from "../../../../../utils/test-utils"; import InventoryPopup from "../sponsor-form-add-item-from-inventory-popup"; -jest.mock("../../../../../actions/inventory-item-actions", () => ({ - getInventoryItems: jest.fn(() => ({ - type: "RECEIVE_INVENTORY_ITEMS", - payload: { - response: { - data: [ - { - id: "123", - code: "AAA", - name: "My Item", - early_bird_rate: 1000, - standard_rate: 1000, - onsite_rate: 1000, - is_archived: false - }, - - { - id: "456", - code: "AAAA", - name: "My Item 2", - early_bird_rate: 1000, - standard_rate: 1000, - onsite_rate: 1000, - is_archived: false - } - ] - }, - current_page: 1, - total: 2, - last_page: 1 - } - })) -})); - jest.mock("openstack-uicore-foundation/lib/utils/money", () => ({ currencyAmountFromCents: jest.fn() })); describe("InventoryPopup", () => { + const buildInventoryItems = (items = []) => ({ + inventoryItems: items, + term: "", + order: "", + orderDir: "1", + currentPage: 1, + perPage: 10, + totalInventoryItems: items.length + }); + it("check if title is being rendered", async () => { - const formId = "AAA"; const onClose = jest.fn(); - - const inventoryItems = { - inventoryItems: [], - term: 1, - order: 1, - orderDir: "A", - currentPage: 1, - perPag: 3, - totalInventoryItems: 2 - }; - - renderWithRedux(, { - initialState: { - currentInventoryItemListState: { - inventoryItems - } - } - }); + const onSave = jest.fn(); + const getInventoryItems = jest.fn(); + + render( + + ); const node = screen.getByText( "sponsor_form_item_list.add_from_inventory.title" @@ -74,26 +41,18 @@ describe("InventoryPopup", () => { }); it("check if close button calls close callback", async () => { - const formId = "AAA"; const onClose = jest.fn(); - - const inventoryItems = { - inventoryItems: [], - term: 1, - order: 1, - orderDir: "A", - currentPage: 1, - perPag: 3, - totalInventoryItems: 2 - }; - - renderWithRedux(, { - initialState: { - currentInventoryItemListState: { - inventoryItems - } - } - }); + const onSave = jest.fn(); + const getInventoryItems = jest.fn(); + + render( + + ); const user = userEvent.setup(); const node = screen.getByTestId("close-dialog"); @@ -103,43 +62,39 @@ describe("InventoryPopup", () => { }); it("check if close button clears selected rows", async () => { - const formId = "AAA"; const onClose = jest.fn(); - - renderWithRedux(, { - initialState: { - currentInventoryItemListState: { - inventoryItems: [ - { - id: "123", - code: "AAA", - name: "My Item", - early_bird_rate: "100", - standard_rate: "100", - onsite_rate: "100", - hasImage: false, - images: [] - }, - { - id: "456", - code: "AAAA", - name: "My Item", - early_bird_rate: "100", - standard_rate: "100", - onsite_rate: "100", - hasImage: false, - images: [] - } - ], - term: "", - order: "", - orderDir: "1", - currentPage: 1, - perPage: 10, - totalInventoryItems: 2 - } - } - }); + const onSave = jest.fn(); + const getInventoryItems = jest.fn(); + + render( + + ); const user = userEvent.setup(); diff --git a/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-add-item-from-inventory-popup.js b/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-add-item-from-inventory-popup.js index 9d71f90a7..8df83f36c 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-add-item-from-inventory-popup.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-add-item-from-inventory-popup.js @@ -1,7 +1,6 @@ import React, { useEffect, useState } from "react"; import PropTypes from "prop-types"; import T from "i18n-react/dist/i18n-react"; -import { connect } from "react-redux"; import { Button, Checkbox, @@ -21,14 +20,11 @@ import MuiTable from "openstack-uicore-foundation/lib/components/mui/table"; import SearchInput from "openstack-uicore-foundation/lib/components/mui/search-input"; import { ImagePreviewCell } from "../../../../components/image-preview-cell"; import { formatRateFromCents } from "../../../../utils/rate-helpers"; -import { addInventoryItems } from "../../../../actions/sponsor-forms-actions"; -import { getInventoryItems } from "../../../../actions/inventory-item-actions"; import { DEFAULT_CURRENT_PAGE } from "../../../../utils/constants"; const SponsorFormAddItemFromInventoryPopup = ({ - formId, onClose, - addInventoryItems, + onSave, getInventoryItems, inventoryItems }) => { @@ -42,16 +38,21 @@ const SponsorFormAddItemFromInventoryPopup = ({ totalInventoryItems: total } = inventoryItems; const [selectedRows, setSelectedRows] = useState([]); + const [isSaving, setIsSaving] = useState(false); const handleClose = () => { + if (isSaving) return; setSelectedRows([]); onClose(); }; const handleOnAdd = () => { - addInventoryItems(formId, selectedRows).finally(() => { - handleClose(); - }); + if (isSaving) return; + setIsSaving(true); + onSave(selectedRows) + .then(() => onClose()) + .catch(() => {}) + .finally(() => setIsSaving(false)); }; const handleOnCheck = (rowId, checked) => { @@ -160,7 +161,13 @@ const SponsorFormAddItemFromInventoryPopup = ({ ]; return ( - + @@ -216,7 +224,7 @@ const SponsorFormAddItemFromInventoryPopup = ({ diff --git a/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-item-popup.js b/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-item-popup.js index 0ba50ec79..b908a5c4d 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-item-popup.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-item-popup.js @@ -1,7 +1,6 @@ -import React from "react"; +import React, { useState } from "react"; import PropTypes from "prop-types"; import T from "i18n-react/dist/i18n-react"; -import { connect } from "react-redux"; import { Dialog, DialogTitle, @@ -10,37 +9,33 @@ import { Typography } from "@mui/material"; import CloseIcon from "@mui/icons-material/Close"; -import { - resetSponsorFormItem, - saveSponsorFormItem, - updateSponsorFormItem -} from "../../../../actions/sponsor-forms-actions"; import SponsorFormItemForm from "./sponsor-form-item-form"; -const SponsorFormItemPopup = ({ - formId, - item, - onClose, - resetSponsorFormItem, - saveSponsorFormItem, - updateSponsorFormItem -}) => { +const SponsorFormItemPopup = ({ item, onClose, onSave }) => { + const [isSaving, setIsSaving] = useState(false); + const handleClose = () => { - // clear form from reducer - resetSponsorFormItem(); + if (isSaving) return; onClose(); }; const handleOnSave = (values) => { - const save = values.id ? updateSponsorFormItem : saveSponsorFormItem; - - save(formId, values).finally(() => { - handleClose(); - }); + if (isSaving) return; + setIsSaving(true); + onSave(values) + .then(() => onClose()) + .catch(() => {}) + .finally(() => setIsSaving(false)); }; return ( - + - + - + ); }; SponsorFormItemPopup.propTypes = { onClose: PropTypes.func.isRequired, - formId: PropTypes.string.isRequired, - resetSponsorFormItem: PropTypes.func.isRequired, - saveSponsorFormItem: PropTypes.func.isRequired, - updateSponsorFormItem: PropTypes.func.isRequired + onSave: PropTypes.func.isRequired, + item: PropTypes.object }; -const mapStateToProps = ({ - sponsorFormItemsListState, - currentSummitState -}) => ({ - item: sponsorFormItemsListState.currentItem, - summitTZ: currentSummitState.currentSummit.time_zone_id -}); - -export default connect(mapStateToProps, { - resetSponsorFormItem, - saveSponsorFormItem, - updateSponsorFormItem -})(SponsorFormItemPopup); +export default SponsorFormItemPopup; diff --git a/src/pages/sponsors/sponsor-form-item-list-page/index.js b/src/pages/sponsors/sponsor-form-item-list-page/index.js index 5a50273fc..34bf47211 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/index.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/index.js @@ -31,10 +31,14 @@ import { deleteSponsorFormItem, getSponsorFormItem, getSponsorFormItems, + saveSponsorFormItem, updateSponsorFormItem, + addInventoryItems, + resetSponsorFormItem, archiveSponsorFormItem, unarchiveSponsorFormItem } from "../../../actions/sponsor-forms-actions"; +import { getInventoryItems } from "../../../actions/inventory-item-actions"; import SponsorFormItemPopup from "./components/sponsor-form-item-popup"; import SponsorFormAddItemFromInventoryPopup from "./components/sponsor-form-add-item-from-inventory-popup"; import { DEFAULT_CURRENT_PAGE } from "../../../utils/constants"; @@ -44,16 +48,22 @@ import { rateToCents } from "../../../utils/rate-helpers"; const SponsorFormItemListPage = ({ match, items, + currentItem, currentPage, perPage, showArchived, order, orderDir, totalCount, + inventoryItems, + getInventoryItems, getSponsorFormItems, getSponsorFormItem, deleteSponsorFormItem, + saveSponsorFormItem, updateSponsorFormItem, + addInventoryItems, + resetSponsorFormItem, archiveSponsorFormItem, unarchiveSponsorFormItem }) => { @@ -100,6 +110,19 @@ const SponsorFormItemListPage = ({ }); }; + const handleClosePopup = () => { + resetSponsorFormItem(); + setOpenPopup(null); + }; + + const handleSaveItem = (values) => { + const save = values.id ? updateSponsorFormItem : saveSponsorFormItem; + return save(formId, values); + }; + + const handleAddFromInventory = (itemIds) => + addInventoryItems(formId, itemIds); + const handleCellEdit = (rowId, column, value) => { // since editable cell is TextField and not PriceField, we need to convert to cents const valueInCents = rateToCents(value); @@ -126,6 +149,7 @@ const SponsorFormItemListPage = ({ }; const handleNewItem = () => { + resetSponsorFormItem(); setOpenPopup("crud"); }; @@ -303,13 +327,16 @@ const SponsorFormItemListPage = ({ )} {openPopup === "crud" && ( setOpenPopup(null)} + item={currentItem} + onSave={handleSaveItem} + onClose={handleClosePopup} /> )} {openPopup === "inventory" && ( setOpenPopup(null)} /> )} @@ -317,15 +344,23 @@ const SponsorFormItemListPage = ({ ); }; -const mapStateToProps = ({ sponsorFormItemsListState }) => ({ - ...sponsorFormItemsListState +const mapStateToProps = ({ + sponsorFormItemsListState, + currentInventoryItemListState +}) => ({ + ...sponsorFormItemsListState, + inventoryItems: currentInventoryItemListState }); export default connect(mapStateToProps, { getSponsorFormItems, deleteSponsorFormItem, getSponsorFormItem, + saveSponsorFormItem, updateSponsorFormItem, + addInventoryItems, + resetSponsorFormItem, + getInventoryItems, archiveSponsorFormItem, unarchiveSponsorFormItem })(SponsorFormItemListPage); From 499179a90b3bdfd44b75333706ca33b92d75f180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Tue, 28 Jul 2026 16:37:25 -0300 Subject: [PATCH 8/9] fix: adjust test, add catches and props, adjust reload after save MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/actions/page-template-actions.js | 2 + .../form-templates/form-template-list-page.js | 2 +- .../page-templates/page-template-list-page.js | 2 +- .../sponsors/show-pages-list-page/index.js | 2 +- .../__test__/inventory-popup.test.js | 99 ++++++++++++++++++- .../sponsor-form-item-list-page/index.js | 2 +- .../sponsor-forms-manage-items.js | 2 +- .../tabs/sponsor-pages-tab/index.js | 4 +- .../components/new-user-popup.js | 8 +- .../sponsors/summit-sponsorship-list-page.js | 2 +- .../__tests__/sponsorship-dialog.test.js | 5 +- .../sponsorship-list-page.js | 2 +- 12 files changed, 119 insertions(+), 13 deletions(-) diff --git a/src/actions/page-template-actions.js b/src/actions/page-template-actions.js index f719b79a2..0bf6b2985 100644 --- a/src/actions/page-template-actions.js +++ b/src/actions/page-template-actions.js @@ -177,6 +177,7 @@ export const savePageTemplate = (entity) => async (dispatch) => { ); }) .catch((err) => { + console.error(err); throw err; }) .finally(() => { @@ -201,6 +202,7 @@ export const savePageTemplate = (entity) => async (dispatch) => { ); }) .catch((err) => { + console.error(err); throw err; }) .finally(() => { diff --git a/src/pages/sponsors-global/form-templates/form-template-list-page.js b/src/pages/sponsors-global/form-templates/form-template-list-page.js index b6d0f1cbe..302c0cc1b 100644 --- a/src/pages/sponsors-global/form-templates/form-template-list-page.js +++ b/src/pages/sponsors-global/form-templates/form-template-list-page.js @@ -221,7 +221,7 @@ const FormTemplateListPage = ({ saveFormTemplate(values).then(() => getFormTemplates( "", - DEFAULT_CURRENT_PAGE, + values.id ? currentPage : DEFAULT_CURRENT_PAGE, perPage, order, orderDir, diff --git a/src/pages/sponsors-global/page-templates/page-template-list-page.js b/src/pages/sponsors-global/page-templates/page-template-list-page.js index 08b8fb610..f3ffedc6b 100644 --- a/src/pages/sponsors-global/page-templates/page-template-list-page.js +++ b/src/pages/sponsors-global/page-templates/page-template-list-page.js @@ -118,7 +118,7 @@ const PageTemplateListPage = ({ savePageTemplate(entity).then(() => getPageTemplates( term, - DEFAULT_CURRENT_PAGE, + entity.id ? currentPage : DEFAULT_CURRENT_PAGE, perPage, order, orderDir, diff --git a/src/pages/sponsors/show-pages-list-page/index.js b/src/pages/sponsors/show-pages-list-page/index.js index 5eb64f82d..b93ad1914 100644 --- a/src/pages/sponsors/show-pages-list-page/index.js +++ b/src/pages/sponsors/show-pages-list-page/index.js @@ -129,7 +129,7 @@ const ShowPagesListPage = ({ saveShowPage(entity).then(() => getShowPages( term, - DEFAULT_CURRENT_PAGE, + entity.id ? currentPage : DEFAULT_CURRENT_PAGE, perPage, order, orderDir, diff --git a/src/pages/sponsors/sponsor-form-item-list-page/components/__test__/inventory-popup.test.js b/src/pages/sponsors/sponsor-form-item-list-page/components/__test__/inventory-popup.test.js index c8ff0d0bd..3c48942b8 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/components/__test__/inventory-popup.test.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/components/__test__/inventory-popup.test.js @@ -1,5 +1,11 @@ import React from "react"; -import { render, screen } from "@testing-library/react"; +import { + act, + fireEvent, + render, + screen, + waitFor +} from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import InventoryPopup from "../sponsor-form-add-item-from-inventory-popup"; @@ -110,4 +116,95 @@ describe("InventoryPopup", () => { const textNode2 = screen.getByText("0 items selected"); expect(textNode2.textContent).toBe("0 items selected"); }); + + it("keeps the dialog open and re-enables the button when the save rejects", async () => { + const onClose = jest.fn(); + const onSave = jest.fn(() => Promise.reject(new Error("API error"))); + const getInventoryItems = jest.fn(); + + render( + + ); + + const user = userEvent.setup(); + const checkboxNode = await screen.findAllByRole("checkbox"); + await user.click(checkboxNode[0]); + + const saveButton = screen.getByText( + "sponsor_form_item_list.add_from_inventory.save" + ); + await user.click(saveButton); + + await waitFor(() => expect(saveButton).not.toBeDisabled()); + expect(onClose).not.toHaveBeenCalled(); + }); + + it("ignores a second submit while the first save is pending", async () => { + const onClose = jest.fn(); + let resolveSave; + const onSave = jest.fn( + () => + new Promise((resolve) => { + resolveSave = resolve; + }) + ); + const getInventoryItems = jest.fn(); + + render( + + ); + + const user = userEvent.setup(); + const checkboxNode = await screen.findAllByRole("checkbox"); + await user.click(checkboxNode[0]); + + const saveButton = screen.getByText( + "sponsor_form_item_list.add_from_inventory.save" + ); + await user.click(saveButton); + + await waitFor(() => expect(saveButton).toBeDisabled()); + + fireEvent.click(saveButton); + expect(onSave).toHaveBeenCalledTimes(1); + + await act(async () => { + resolveSave(); + await Promise.resolve(); + }); + + expect(onClose).toHaveBeenCalledTimes(1); + }); }); diff --git a/src/pages/sponsors/sponsor-form-item-list-page/index.js b/src/pages/sponsors/sponsor-form-item-list-page/index.js index 34bf47211..0d17ce7f2 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/index.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/index.js @@ -127,7 +127,7 @@ const SponsorFormItemListPage = ({ // since editable cell is TextField and not PriceField, we need to convert to cents const valueInCents = rateToCents(value); const tmpEntity = { id: rowId, [column]: valueInCents }; - updateSponsorFormItem(formId, tmpEntity); + return updateSponsorFormItem(formId, tmpEntity).catch(() => {}); }; const handleArchiveItem = (item) => diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items.js index 72557182f..86a48eae5 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items.js @@ -134,7 +134,7 @@ const SponsorFormsManageItems = ({ getSponsorCustomizedFormItems( formId, term, - DEFAULT_CURRENT_PAGE, + item.id ? currentPage : DEFAULT_CURRENT_PAGE, perPage, order, orderDir, diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/index.js index a87b345b6..bf530a36c 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/index.js @@ -266,7 +266,7 @@ const SponsorPagesTab = ({ const { perPage, order, orderDir } = customizedPages; getSponsorCustomizedPages( term, - DEFAULT_CURRENT_PAGE, + entity.id ? customizedPages.currentPage : DEFAULT_CURRENT_PAGE, perPage, order, orderDir, @@ -278,7 +278,7 @@ const SponsorPagesTab = ({ saveSponsorManagedPage(entity).then(() => { getSponsorManagedPages( term, - DEFAULT_CURRENT_PAGE, + entity.id ? managedPages.currentPage : DEFAULT_CURRENT_PAGE, managedPages.perPage, managedPages.order, managedPages.orderDir, diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-users-list-per-sponsor/components/new-user-popup.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-users-list-per-sponsor/components/new-user-popup.js index e3ce0df6d..1d2e57658 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-users-list-per-sponsor/components/new-user-popup.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-users-list-per-sponsor/components/new-user-popup.js @@ -60,7 +60,13 @@ const NewUserPopup = ({ }); return ( - + saveSummitSponsorship(sponsorship).then(() => getSummitSponsorships( - DEFAULT_CURRENT_PAGE, + sponsorship.id ? currentPage : DEFAULT_CURRENT_PAGE, perPage, order, orderDir diff --git a/src/pages/sponsorship-types/components/__tests__/sponsorship-dialog.test.js b/src/pages/sponsorship-types/components/__tests__/sponsorship-dialog.test.js index 0289c4784..719d694fa 100644 --- a/src/pages/sponsorship-types/components/__tests__/sponsorship-dialog.test.js +++ b/src/pages/sponsorship-types/components/__tests__/sponsorship-dialog.test.js @@ -1,5 +1,5 @@ import React from "react"; -import { act, render, screen } from "@testing-library/react"; +import { act, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import SponsorshipDialog from "../sponsorship-dialog"; @@ -20,7 +20,7 @@ const EXISTING_ENTITY = { }; describe("SponsorshipDialog", () => { - const onSave = jest.fn(); + const onSave = jest.fn(() => Promise.resolve()); const onClose = jest.fn(); beforeEach(() => { @@ -117,5 +117,6 @@ describe("SponsorshipDialog", () => { expect(onSave).toHaveBeenCalledWith( expect.objectContaining({ name: "Bronze" }) ); + await waitFor(() => expect(onClose).toHaveBeenCalledTimes(1)); }); }); diff --git a/src/pages/sponsorship-types/sponsorship-list-page.js b/src/pages/sponsorship-types/sponsorship-list-page.js index 3004bc7ec..30a7f76a3 100644 --- a/src/pages/sponsorship-types/sponsorship-list-page.js +++ b/src/pages/sponsorship-types/sponsorship-list-page.js @@ -83,7 +83,7 @@ const SponsorshipListPage = ({ saveSponsorship(entity).then(() => getSponsorships( term, - DEFAULT_CURRENT_PAGE, + entity.id ? currentPage : DEFAULT_CURRENT_PAGE, perPage, order, orderDir From b68f454a9cf820f98a20f1524ff38b910f1ff898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Tue, 28 Jul 2026 16:49:07 -0300 Subject: [PATCH 9/9] fix: remove duplicate function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- .../page-templates/page-template-popup/index.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/pages/sponsors-global/page-templates/page-template-popup/index.js b/src/pages/sponsors-global/page-templates/page-template-popup/index.js index 192d9bc15..f5019ff9f 100644 --- a/src/pages/sponsors-global/page-templates/page-template-popup/index.js +++ b/src/pages/sponsors-global/page-templates/page-template-popup/index.js @@ -217,11 +217,6 @@ const PageTemplatePopup = ({ }); }; - const handleClose = () => { - if (isSaving) return; - onClose(); - }; - return (