From 77e9978f8fc92c9e0db588c87bc9849cc675f080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Thu, 14 May 2026 16:44:51 -0300 Subject: [PATCH 1/4] fix: reload table after archive/unarchive rows 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 | 21 +++++++++++++++++-- .../form-templates/form-template-list-page.js | 13 +++++++++++- .../inventory/inventory-list-page.js | 13 ++++++++++-- .../page-templates/page-template-list-page.js | 13 ++++++++++-- .../sponsors/show-pages-list-page/index.js | 9 +++++++- .../sponsor-form-item-list-page/index.js | 16 ++++++++++++-- .../sponsors/sponsor-forms-list-page/index.js | 9 ++++++-- .../sponsor-forms-manage-items.js | 17 +++++++++++++-- .../tabs/sponsor-forms-tab/index.js | 18 ++++++++++++++-- .../tabs/sponsor-pages-tab/index.js | 6 ++++-- src/utils/methods.js | 7 +++++++ 11 files changed, 124 insertions(+), 18 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 95e6bcd47..980997ac3 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 @@ -45,6 +45,7 @@ import AddFormTemplateItemDialog from "./add-form-template-item-popup"; import SponsorInventoryDialog from "./sponsor-inventory-popup"; import { getInventoryItems } from "../../../actions/inventory-item-actions"; import { DEFAULT_CURRENT_PAGE } from "../../../utils/constants"; +import { getSafePageAfterRemove } from "../../../utils/methods"; const FormTemplateItemListPage = ({ formTemplateId, @@ -161,9 +162,25 @@ const FormTemplateItemListPage = ({ }; const handleArchiveItem = (item) => - item.is_archived + (item.is_archived ? unarchiveFormTemplateItem(formTemplateId, item) - : archiveFormTemplateItem(formTemplateId, item); + : archiveFormTemplateItem(formTemplateId, item) + ).then(() => { + const safePage = getSafePageAfterRemove( + totalFormTemplateItems, + perPage, + currentPage + ); + getFormTemplateItems( + formTemplateId, + term, + safePage, + perPage, + order, + orderDir, + showArchived + ); + }); const handleShowArchivedForms = (ev) => { getFormTemplateItems( 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..bf08a5e3c 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 @@ -42,6 +42,7 @@ import FormTemplateDialog from "./form-template-popup"; import history from "../../../history"; import FormTemplateFromDuplicateDialog from "./form-template-from-duplicate-popup"; import { DEFAULT_CURRENT_PAGE } from "../../../utils/constants"; +import { getSafePageAfterRemove } from "../../../utils/methods"; const FormTemplateListPage = ({ formTemplates, @@ -153,7 +154,17 @@ const FormTemplateListPage = ({ }; const handleArchiveItem = (item) => - item.is_archived ? unarchiveFormTemplate(item) : archiveFormTemplate(item); + (item.is_archived + ? unarchiveFormTemplate(item) + : archiveFormTemplate(item) + ).then(() => { + const safePage = getSafePageAfterRemove( + totalFormTemplates, + perPage, + currentPage + ); + getFormTemplates(term, safePage, perPage, order, orderDir, showArchived); + }); const handleShowArchivedForms = (value) => { getFormTemplates( diff --git a/src/pages/sponsors-global/inventory/inventory-list-page.js b/src/pages/sponsors-global/inventory/inventory-list-page.js index b6e0d072f..d544d2879 100644 --- a/src/pages/sponsors-global/inventory/inventory-list-page.js +++ b/src/pages/sponsors-global/inventory/inventory-list-page.js @@ -44,6 +44,7 @@ import { } from "../../../actions/inventory-item-actions"; import SponsorInventoryDialog from "../form-templates/sponsor-inventory-popup"; import { DEFAULT_CURRENT_PAGE } from "../../../utils/constants"; +import { getSafePageAfterRemove } from "../../../utils/methods"; const PREVIEW_BOX_SIZE = 220; const PREVIEW_MARGIN_BOTTOM = 1; @@ -262,9 +263,17 @@ const InventoryListPage = ({ }; const handleArchiveItem = (item) => - item.is_archived + (item.is_archived ? unarchiveInventoryItem(item) - : archiveInventoryItem(item); + : archiveInventoryItem(item) + ).then(() => { + const safePage = getSafePageAfterRemove( + totalInventoryItems, + perPage, + currentPage + ); + getInventoryItems(term, safePage, perPage, order, orderDir, showArchived); + }); const columns = [ { 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 0b4b05d21..cb7c53092 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 @@ -38,6 +38,7 @@ import { import { DEFAULT_CURRENT_PAGE } from "../../../utils/constants"; import PageTemplatePopup from "./page-template-popup"; import PageTemplateClonePopup from "./page-template-clone-popup"; +import { getSafePageAfterRemove } from "../../../utils/methods"; const PageTemplateListPage = ({ pageTemplates, @@ -119,9 +120,17 @@ const PageTemplateListPage = ({ }; const handleArchive = (item) => - item.is_archived + (item.is_archived ? unarchivePageTemplate(item.id) - : archivePageTemplate(item.id); + : archivePageTemplate(item.id) + ).then(() => { + const safePage = getSafePageAfterRemove( + totalPageTemplates, + perPage, + currentPage + ); + getPageTemplates(term, safePage, perPage, order, orderDir, showArchived); + }); const handleEdit = (row) => { getPageTemplate(row.id).then(() => setOpenPageDialog(true)); diff --git a/src/pages/sponsors/show-pages-list-page/index.js b/src/pages/sponsors/show-pages-list-page/index.js index f9c64b527..0bfde82c4 100644 --- a/src/pages/sponsors/show-pages-list-page/index.js +++ b/src/pages/sponsors/show-pages-list-page/index.js @@ -39,6 +39,7 @@ import CustomAlert from "../../../components/mui/custom-alert"; import GlobalPagePopup from "./components/global-page/global-page-popup"; import PageTemplatePopup from "../../sponsors-global/page-templates/page-template-popup"; import { DEFAULT_CURRENT_PAGE, MAX_PER_PAGE } from "../../../utils/constants"; +import { getSafePageAfterRemove } from "../../../utils/methods"; const ShowPagesListPage = ({ showPages, @@ -92,7 +93,13 @@ const ShowPagesListPage = ({ }; const handleArchiveItem = (item) => - item.is_archived ? unarchiveShowPage(item.id) : archiveShowPage(item.id); + (item.is_archived + ? unarchiveShowPage(item.id) + : archiveShowPage(item.id) + ).then(() => { + const safePage = getSafePageAfterRemove(totalCount, perPage, currentPage); + getShowPages(term, safePage, perPage, order, orderDir, showArchived); + }); const handleShowArchivedForms = (ev) => { getShowPages( 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 b8b2822a0..be7aedfae 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/index.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/index.js @@ -42,6 +42,7 @@ import SponsorFormAddItemFromInventoryPopup from "./components/sponsor-form-add- import { DEFAULT_CURRENT_PAGE } from "../../../utils/constants"; import { rateCellValidation } from "../../../utils/yup"; import { rateToCents } from "../../../utils/rate-helpers"; +import { getSafePageAfterRemove } from "../../../utils/methods"; const SponsorFormItemListPage = ({ match, @@ -110,9 +111,20 @@ const SponsorFormItemListPage = ({ }; const handleArchiveItem = (item) => - item.is_archived + (item.is_archived ? unarchiveSponsorFormItem(formId, item.id) - : archiveSponsorFormItem(formId, item.id); + : archiveSponsorFormItem(formId, item.id) + ).then(() => { + const safePage = getSafePageAfterRemove(totalCount, perPage, currentPage); + getSponsorFormItems( + formId, + safePage, + perPage, + order, + orderDir, + showArchived + ); + }); const handleRowDelete = (itemId) => { deleteSponsorFormItem(formId, itemId).then(() => { diff --git a/src/pages/sponsors/sponsor-forms-list-page/index.js b/src/pages/sponsors/sponsor-forms-list-page/index.js index 8296b1a49..e03855eb7 100644 --- a/src/pages/sponsors/sponsor-forms-list-page/index.js +++ b/src/pages/sponsors/sponsor-forms-list-page/index.js @@ -42,6 +42,7 @@ import GlobalTemplatePopup from "./components/global-template/global-template-po import FormTemplatePopup from "./components/form-template/form-template-popup"; import { DEFAULT_CURRENT_PAGE, MAX_PER_PAGE } from "../../../utils/constants"; import { normalizeTiers, sameTierSet } from "./utils"; +import { getSafePageAfterRemove } from "../../../utils/methods"; const SponsorFormsListPage = ({ sponsorForms, @@ -118,9 +119,13 @@ const SponsorFormsListPage = ({ }; const handleArchiveItem = (item) => - item.is_archived + (item.is_archived ? unarchiveSponsorForm(item.id) - : archiveSponsorForm(item.id); + : archiveSponsorForm(item.id) + ).then(() => { + const safePage = getSafePageAfterRemove(totalCount, perPage, currentPage); + getSponsorForms(term, safePage, perPage, order, orderDir, showArchived); + }); const handleShowArchivedForms = (ev) => { getSponsorForms( 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 5ccaca2fb..12814972c 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 @@ -48,6 +48,7 @@ import { import { rateCellValidation } from "../../../../../../../utils/yup"; import { rateToCents } from "../../../../../../../utils/rate-helpers"; import Restrict from "../../../../../../../routes/restrict"; +import { getSafePageAfterRemove } from "../../../../../../../utils/methods"; const SponsorFormsManageItems = ({ term, @@ -151,9 +152,21 @@ const SponsorFormsManageItems = ({ }; const handleArchiveItem = (item) => - item.is_archived + (item.is_archived ? unarchiveSponsorCustomizedFormItem(formId, item.id) - : archiveSponsorCustomizedFormItem(formId, item.id); + : archiveSponsorCustomizedFormItem(formId, item.id) + ).then(() => { + const safePage = getSafePageAfterRemove(totalCount, perPage, currentPage); + getSponsorCustomizedFormItems( + formId, + term, + safePage, + perPage, + order, + orderDir, + showArchived + ); + }); const handleShowArchivedItems = (ev) => { getSponsorCustomizedFormItems( diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/index.js index 044424ff9..5d9eb820a 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/index.js @@ -38,6 +38,7 @@ import CustomAlert from "../../../../../components/mui/custom-alert"; import AddSponsorFormTemplatePopup from "./components/add-sponsor-form-template-popup"; import CustomizedFormPopup from "./components/customized-form/customized-form-popup"; import { DEFAULT_CURRENT_PAGE } from "../../../../../utils/constants"; +import { getSafePageAfterRemove } from "../../../../../utils/methods"; const SponsorFormsTab = ({ term, @@ -146,9 +147,22 @@ const SponsorFormsTab = ({ }; const handleArchiveForm = (item) => - item.is_archived + (item.is_archived ? unarchiveSponsorCustomizedForm(item.id) - : archiveSponsorCustomizedForm(item.id); + : archiveSponsorCustomizedForm(item.id) + ).then(() => { + const { perPage, order, orderDir, currentPage, totalCount } = + customizedForms; + const safePage = getSafePageAfterRemove(totalCount, perPage, currentPage); + getSponsorCustomizedForms( + term, + safePage, + perPage, + order, + orderDir, + showArchived + ); + }); const handleCustomizedFormManageItems = (item) => { history.push( 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 cec79b3ff..2f4051f24 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 @@ -184,10 +184,12 @@ const SponsorPagesTab = ({ ? unarchiveCustomizedPage(item.id) : archiveCustomizedPage(item.id) ).then(() => { - const { perPage, order, orderDir, currentPage } = customizedPages; + const { perPage, order, orderDir, currentPage, totalItems } = + customizedPages; + const safePage = getSafePageAfterRemove(totalItems, perPage, currentPage); return getSponsorCustomizedPages( term, - currentPage, + safePage, perPage, order, orderDir, diff --git a/src/utils/methods.js b/src/utils/methods.js index cb93e33d2..c7fbafe43 100644 --- a/src/utils/methods.js +++ b/src/utils/methods.js @@ -629,3 +629,10 @@ export const formatDate = (date, timeZone, format = DATETIME_FORMAT) => { .tz(timeZone) .format(format); }; + +export const getSafePageAfterRemove = (totalCount, perPage, currentPage) => { + const totalAfter = totalCount - 1; + const totalPages = Math.ceil(totalAfter / perPage); + const lastValidPage = Math.max(1, totalPages); + return Math.min(currentPage, lastValidPage); +}; From df2963d9bf7cfdfa8fcfb6effc88be275eddf284 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Thu, 14 May 2026 17:07:18 -0300 Subject: [PATCH 2/4] fix: add missing import on sponsor pages tab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/index.js | 1 + 1 file changed, 1 insertion(+) 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 2f4051f24..c45a53aae 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 @@ -44,6 +44,7 @@ import { DEFAULT_CURRENT_PAGE, SPONSOR_MANAGED_PAGE_ASSIGNMENT } from "../../../../../utils/constants"; +import { getSafePageAfterRemove } from "../../../../../utils/methods"; import AddSponsorPageTemplatePopup from "./components/add-sponsor-page-template-popup"; import PageTemplatePopup from "../../../../sponsors-global/page-templates/page-template-popup"; From 035ae44f18e3f5e7294bdfe18df24f59bbc81a01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Mon, 18 May 2026 15:59:18 -0300 Subject: [PATCH 3/4] fix: change reducer cases for archive/unarchive, add catch on error 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 | 42 ++++++++++++------- .../form-templates/form-template-list-page.js | 35 +++++++++++----- .../inventory/inventory-list-page.js | 32 ++++++++++---- .../page-templates/page-template-list-page.js | 32 ++++++++++---- .../sponsors/show-pages-list-page/index.js | 19 +++++---- .../sponsor-form-item-list-page/index.js | 35 +++++++++++----- .../sponsors/sponsor-forms-list-page/index.js | 23 ++++++++-- .../sponsor-forms-manage-items.js | 38 ++++++++++++----- .../tabs/sponsor-forms-tab/index.js | 42 +++++++++++++------ .../tabs/sponsor-pages-tab/index.js | 42 +++++++++++++------ .../sponsor-form-items-list-reducer.test.js | 4 +- .../sponsors/show-pages-list-reducer.js | 6 ++- ...nsor-customized-form-items-list-reducer.js | 4 +- .../sponsor-form-items-list-reducer.js | 4 +- .../sponsors/sponsor-forms-list-reducer.js | 4 +- .../sponsor-page-forms-list-reducer.js | 3 +- .../sponsor-page-pages-list-reducer.js | 6 ++- .../form-template-item-list-reducer.js | 12 +++++- .../form-template-list-reducer.js | 12 +++++- .../inventory-item-list-reducer.js | 12 +++++- .../page-template-list-reducer.js | 12 +++++- 21 files changed, 301 insertions(+), 118 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 980997ac3..2a934215e 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 @@ -165,22 +165,34 @@ const FormTemplateItemListPage = ({ (item.is_archived ? unarchiveFormTemplateItem(formTemplateId, item) : archiveFormTemplateItem(formTemplateId, item) - ).then(() => { - const safePage = getSafePageAfterRemove( - totalFormTemplateItems, - perPage, - currentPage - ); - getFormTemplateItems( - formTemplateId, - term, - safePage, - perPage, - order, - orderDir, - showArchived + ) + .then(() => { + const safePage = getSafePageAfterRemove( + totalFormTemplateItems, + perPage, + currentPage + ); + getFormTemplateItems( + formTemplateId, + term, + safePage, + perPage, + order, + orderDir, + showArchived + ); + }) + .catch(() => + getFormTemplateItems( + formTemplateId, + term, + currentPage, + perPage, + order, + orderDir, + showArchived + ) ); - }); const handleShowArchivedForms = (ev) => { getFormTemplateItems( 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 bf08a5e3c..fadaafc0a 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 @@ -154,17 +154,32 @@ const FormTemplateListPage = ({ }; const handleArchiveItem = (item) => - (item.is_archived - ? unarchiveFormTemplate(item) - : archiveFormTemplate(item) - ).then(() => { - const safePage = getSafePageAfterRemove( - totalFormTemplates, - perPage, - currentPage + (item.is_archived ? unarchiveFormTemplate(item) : archiveFormTemplate(item)) + .then(() => { + const safePage = getSafePageAfterRemove( + totalFormTemplates, + perPage, + currentPage + ); + getFormTemplates( + term, + safePage, + perPage, + order, + orderDir, + showArchived + ); + }) + .catch(() => + getFormTemplates( + term, + currentPage, + perPage, + order, + orderDir, + showArchived + ) ); - getFormTemplates(term, safePage, perPage, order, orderDir, showArchived); - }); const handleShowArchivedForms = (value) => { getFormTemplates( diff --git a/src/pages/sponsors-global/inventory/inventory-list-page.js b/src/pages/sponsors-global/inventory/inventory-list-page.js index d544d2879..5a4e55f68 100644 --- a/src/pages/sponsors-global/inventory/inventory-list-page.js +++ b/src/pages/sponsors-global/inventory/inventory-list-page.js @@ -266,14 +266,32 @@ const InventoryListPage = ({ (item.is_archived ? unarchiveInventoryItem(item) : archiveInventoryItem(item) - ).then(() => { - const safePage = getSafePageAfterRemove( - totalInventoryItems, - perPage, - currentPage + ) + .then(() => { + const safePage = getSafePageAfterRemove( + totalInventoryItems, + perPage, + currentPage + ); + getInventoryItems( + term, + safePage, + perPage, + order, + orderDir, + showArchived + ); + }) + .catch(() => + getInventoryItems( + term, + currentPage, + perPage, + order, + orderDir, + showArchived + ) ); - getInventoryItems(term, safePage, perPage, order, orderDir, showArchived); - }); const columns = [ { 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 cb7c53092..d078c3943 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,14 +123,32 @@ const PageTemplateListPage = ({ (item.is_archived ? unarchivePageTemplate(item.id) : archivePageTemplate(item.id) - ).then(() => { - const safePage = getSafePageAfterRemove( - totalPageTemplates, - perPage, - currentPage + ) + .then(() => { + const safePage = getSafePageAfterRemove( + totalPageTemplates, + perPage, + currentPage + ); + getPageTemplates( + term, + safePage, + perPage, + order, + orderDir, + showArchived + ); + }) + .catch(() => + getPageTemplates( + term, + currentPage, + perPage, + order, + orderDir, + showArchived + ) ); - getPageTemplates(term, safePage, perPage, order, orderDir, showArchived); - }); const handleEdit = (row) => { getPageTemplate(row.id).then(() => setOpenPageDialog(true)); diff --git a/src/pages/sponsors/show-pages-list-page/index.js b/src/pages/sponsors/show-pages-list-page/index.js index 0bfde82c4..0a1bd9aa6 100644 --- a/src/pages/sponsors/show-pages-list-page/index.js +++ b/src/pages/sponsors/show-pages-list-page/index.js @@ -93,13 +93,18 @@ const ShowPagesListPage = ({ }; const handleArchiveItem = (item) => - (item.is_archived - ? unarchiveShowPage(item.id) - : archiveShowPage(item.id) - ).then(() => { - const safePage = getSafePageAfterRemove(totalCount, perPage, currentPage); - getShowPages(term, safePage, perPage, order, orderDir, showArchived); - }); + (item.is_archived ? unarchiveShowPage(item.id) : archiveShowPage(item.id)) + .then(() => { + const safePage = getSafePageAfterRemove( + totalCount, + perPage, + currentPage + ); + getShowPages(term, safePage, perPage, order, orderDir, showArchived); + }) + .catch(() => + getShowPages(term, currentPage, perPage, order, orderDir, showArchived) + ); const handleShowArchivedForms = (ev) => { getShowPages( 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 be7aedfae..c4063fbda 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/index.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/index.js @@ -114,17 +114,32 @@ const SponsorFormItemListPage = ({ (item.is_archived ? unarchiveSponsorFormItem(formId, item.id) : archiveSponsorFormItem(formId, item.id) - ).then(() => { - const safePage = getSafePageAfterRemove(totalCount, perPage, currentPage); - getSponsorFormItems( - formId, - safePage, - perPage, - order, - orderDir, - showArchived + ) + .then(() => { + const safePage = getSafePageAfterRemove( + totalCount, + perPage, + currentPage + ); + getSponsorFormItems( + formId, + safePage, + perPage, + order, + orderDir, + showArchived + ); + }) + .catch(() => + getSponsorFormItems( + formId, + currentPage, + perPage, + order, + orderDir, + showArchived + ) ); - }); const handleRowDelete = (itemId) => { deleteSponsorFormItem(formId, itemId).then(() => { diff --git a/src/pages/sponsors/sponsor-forms-list-page/index.js b/src/pages/sponsors/sponsor-forms-list-page/index.js index e03855eb7..09355f343 100644 --- a/src/pages/sponsors/sponsor-forms-list-page/index.js +++ b/src/pages/sponsors/sponsor-forms-list-page/index.js @@ -122,10 +122,25 @@ const SponsorFormsListPage = ({ (item.is_archived ? unarchiveSponsorForm(item.id) : archiveSponsorForm(item.id) - ).then(() => { - const safePage = getSafePageAfterRemove(totalCount, perPage, currentPage); - getSponsorForms(term, safePage, perPage, order, orderDir, showArchived); - }); + ) + .then(() => { + const safePage = getSafePageAfterRemove( + totalCount, + perPage, + currentPage + ); + getSponsorForms(term, safePage, perPage, order, orderDir, showArchived); + }) + .catch(() => + getSponsorForms( + term, + currentPage, + perPage, + order, + orderDir, + showArchived + ) + ); const handleShowArchivedForms = (ev) => { getSponsorForms( 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 12814972c..b29e6ea7f 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 @@ -155,18 +155,34 @@ const SponsorFormsManageItems = ({ (item.is_archived ? unarchiveSponsorCustomizedFormItem(formId, item.id) : archiveSponsorCustomizedFormItem(formId, item.id) - ).then(() => { - const safePage = getSafePageAfterRemove(totalCount, perPage, currentPage); - getSponsorCustomizedFormItems( - formId, - term, - safePage, - perPage, - order, - orderDir, - showArchived + ) + .then(() => { + const safePage = getSafePageAfterRemove( + totalCount, + perPage, + currentPage + ); + getSponsorCustomizedFormItems( + formId, + term, + safePage, + perPage, + order, + orderDir, + showArchived + ); + }) + .catch(() => + getSponsorCustomizedFormItems( + formId, + term, + currentPage, + perPage, + order, + orderDir, + showArchived + ) ); - }); const handleShowArchivedItems = (ev) => { getSponsorCustomizedFormItems( diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/index.js index 5d9eb820a..0f0f6c5d4 100644 --- a/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/index.js @@ -150,19 +150,35 @@ const SponsorFormsTab = ({ (item.is_archived ? unarchiveSponsorCustomizedForm(item.id) : archiveSponsorCustomizedForm(item.id) - ).then(() => { - const { perPage, order, orderDir, currentPage, totalCount } = - customizedForms; - const safePage = getSafePageAfterRemove(totalCount, perPage, currentPage); - getSponsorCustomizedForms( - term, - safePage, - perPage, - order, - orderDir, - showArchived - ); - }); + ) + .then(() => { + const { perPage, order, orderDir, currentPage, totalCount } = + customizedForms; + const safePage = getSafePageAfterRemove( + totalCount, + perPage, + currentPage + ); + getSponsorCustomizedForms( + term, + safePage, + perPage, + order, + orderDir, + showArchived + ); + }) + .catch(() => { + const { perPage, order, orderDir, currentPage } = customizedForms; + getSponsorCustomizedForms( + term, + currentPage, + perPage, + order, + orderDir, + showArchived + ); + }); const handleCustomizedFormManageItems = (item) => { history.push( 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 c45a53aae..4fd977ad5 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 @@ -184,19 +184,35 @@ const SponsorPagesTab = ({ (item.is_archived ? unarchiveCustomizedPage(item.id) : archiveCustomizedPage(item.id) - ).then(() => { - const { perPage, order, orderDir, currentPage, totalItems } = - customizedPages; - const safePage = getSafePageAfterRemove(totalItems, perPage, currentPage); - return getSponsorCustomizedPages( - term, - safePage, - perPage, - order, - orderDir, - showArchived - ); - }); + ) + .then(() => { + const { perPage, order, orderDir, currentPage, totalItems } = + customizedPages; + const safePage = getSafePageAfterRemove( + totalItems, + perPage, + currentPage + ); + return getSponsorCustomizedPages( + term, + safePage, + perPage, + order, + orderDir, + showArchived + ); + }) + .catch(() => { + const { perPage, order, orderDir, currentPage } = customizedPages; + getSponsorCustomizedPages( + term, + currentPage, + perPage, + order, + orderDir, + showArchived + ); + }); const handleManagedEdit = (item) => { getSponsorManagedPage(item.id).then(() => setOpenPopup("managedPagePopup")); diff --git a/src/reducers/sponsors/__tests__/sponsor-form-items-list-reducer.test.js b/src/reducers/sponsors/__tests__/sponsor-form-items-list-reducer.test.js index 054db2924..67ce11980 100644 --- a/src/reducers/sponsors/__tests__/sponsor-form-items-list-reducer.test.js +++ b/src/reducers/sponsors/__tests__/sponsor-form-items-list-reducer.test.js @@ -310,7 +310,7 @@ describe("SponsorFormItemsListReducer", () => { ); expect(result).toStrictEqual({ ...initialState, - totalCount: 2, + totalCount: 1, items: [ { id: "A", @@ -379,7 +379,7 @@ describe("SponsorFormItemsListReducer", () => { ); expect(result).toStrictEqual({ ...initialState, - totalCount: 2, + totalCount: 1, items: [ { id: "A", diff --git a/src/reducers/sponsors/show-pages-list-reducer.js b/src/reducers/sponsors/show-pages-list-reducer.js index 3df094fa9..3d42c9d71 100644 --- a/src/reducers/sponsors/show-pages-list-reducer.js +++ b/src/reducers/sponsors/show-pages-list-reducer.js @@ -112,7 +112,8 @@ const showPagesListReducer = (state = DEFAULT_STATE, action) => { ); return { ...state, - showPages: [...pages] + showPages: [...pages], + totalCount: state.totalCount - 1 }; } case SHOW_PAGE_UNARCHIVED: { @@ -122,7 +123,8 @@ const showPagesListReducer = (state = DEFAULT_STATE, action) => { ); return { ...state, - showPages: [...pages] + showPages: [...pages], + totalCount: state.totalCount - 1 }; } case RECEIVE_SHOW_PAGE: { diff --git a/src/reducers/sponsors/sponsor-customized-form-items-list-reducer.js b/src/reducers/sponsors/sponsor-customized-form-items-list-reducer.js index c181d463a..41c0c0fca 100644 --- a/src/reducers/sponsors/sponsor-customized-form-items-list-reducer.js +++ b/src/reducers/sponsors/sponsor-customized-form-items-list-reducer.js @@ -127,7 +127,7 @@ const sponsorCustomizedFormItemsListReducer = ( item.id === itemId ? { ...item, is_archived: true } : item ); - return { ...state, items }; + return { ...state, items, totalCount: state.totalCount - 1 }; } case SPONSOR_CUSTOMIZED_FORM_ITEM_UNARCHIVED: { const { itemId } = payload; @@ -136,7 +136,7 @@ const sponsorCustomizedFormItemsListReducer = ( item.id === itemId ? { ...item, is_archived: false } : item ); - return { ...state, items }; + return { ...state, items, totalCount: state.totalCount - 1 }; } case SPONSOR_FORM_MANAGED_ITEM_UPDATED: { const updatedItem = payload.response; diff --git a/src/reducers/sponsors/sponsor-form-items-list-reducer.js b/src/reducers/sponsors/sponsor-form-items-list-reducer.js index 318ea185f..178550094 100644 --- a/src/reducers/sponsors/sponsor-form-items-list-reducer.js +++ b/src/reducers/sponsors/sponsor-form-items-list-reducer.js @@ -122,7 +122,7 @@ const sponsorFormItemsListReducer = (state = DEFAULT_STATE, action) => { item.id === itemId ? { ...item, is_archived: true } : item ); - return { ...state, items }; + return { ...state, items, totalCount: state.totalCount - 1 }; } case SPONSOR_FORM_ITEM_UNARCHIVED: { const { itemId } = payload; @@ -131,7 +131,7 @@ const sponsorFormItemsListReducer = (state = DEFAULT_STATE, action) => { item.id === itemId ? { ...item, is_archived: false } : item ); - return { ...state, items }; + return { ...state, items, totalCount: state.totalCount - 1 }; } default: return state; diff --git a/src/reducers/sponsors/sponsor-forms-list-reducer.js b/src/reducers/sponsors/sponsor-forms-list-reducer.js index ca057b3ae..df8e908b8 100644 --- a/src/reducers/sponsors/sponsor-forms-list-reducer.js +++ b/src/reducers/sponsors/sponsor-forms-list-reducer.js @@ -155,7 +155,7 @@ const sponsorFormsListReducer = (state = DEFAULT_STATE, action) => { item.id === formId ? { ...item, is_archived: true } : item ); - return { ...state, sponsorForms }; + return { ...state, sponsorForms, totalCount: state.totalCount - 1 }; } case SPONSOR_FORM_UNARCHIVED: { const { formId } = payload; @@ -164,7 +164,7 @@ const sponsorFormsListReducer = (state = DEFAULT_STATE, action) => { item.id === formId ? { ...item, is_archived: false } : item ); - return { ...state, sponsorForms }; + return { ...state, sponsorForms, totalCount: state.totalCount - 1 }; } case SPONSOR_FORM_DELETED: { const { formId } = payload; diff --git a/src/reducers/sponsors/sponsor-page-forms-list-reducer.js b/src/reducers/sponsors/sponsor-page-forms-list-reducer.js index 2f5c4b6da..df37610ec 100644 --- a/src/reducers/sponsors/sponsor-page-forms-list-reducer.js +++ b/src/reducers/sponsors/sponsor-page-forms-list-reducer.js @@ -247,7 +247,8 @@ const sponsorPageFormsListReducer = (state = DEFAULT_STATE, action) => { ...state, customizedForms: { ...state.customizedForms, - forms + forms, + totalCount: state.customizedForms.totalCount - 1 } }; } diff --git a/src/reducers/sponsors/sponsor-page-pages-list-reducer.js b/src/reducers/sponsors/sponsor-page-pages-list-reducer.js index edc6ae08e..291dffdfb 100644 --- a/src/reducers/sponsors/sponsor-page-pages-list-reducer.js +++ b/src/reducers/sponsors/sponsor-page-pages-list-reducer.js @@ -240,7 +240,8 @@ const sponsorPagePagesListReducer = (state = DEFAULT_STATE, action) => { ...state, customizedPages: { ...state.customizedPages, - pages: [...pages] + pages: [...pages], + totalItems: state.customizedPages.totalItems - 1 } }; } @@ -253,7 +254,8 @@ const sponsorPagePagesListReducer = (state = DEFAULT_STATE, action) => { ...state, customizedPages: { ...state.customizedPages, - pages: [...pages] + pages: [...pages], + totalItems: state.customizedPages.totalItems - 1 } }; } diff --git a/src/reducers/sponsors_inventory/form-template-item-list-reducer.js b/src/reducers/sponsors_inventory/form-template-item-list-reducer.js index aa9cb2570..7edfe0244 100644 --- a/src/reducers/sponsors_inventory/form-template-item-list-reducer.js +++ b/src/reducers/sponsors_inventory/form-template-item-list-reducer.js @@ -108,7 +108,11 @@ const formTemplateItemListReducer = (state = DEFAULT_STATE, action = {}) => { ? { ...item, is_archived: true } : item ); - return { ...state, formTemplateItems: updatedFormTemplatesItems }; + return { + ...state, + formTemplateItems: updatedFormTemplatesItems, + totalFormTemplateItems: state.totalFormTemplateItems - 1 + }; } case FORM_TEMPLATE_ITEM_UNARCHIVED: { const updatedFormTemplateItemId = payload; @@ -118,7 +122,11 @@ const formTemplateItemListReducer = (state = DEFAULT_STATE, action = {}) => { ? { ...item, is_archived: false } : item ); - return { ...state, formTemplateItems: updatedFormTemplatesItems }; + return { + ...state, + formTemplateItems: updatedFormTemplatesItems, + totalFormTemplateItems: state.totalFormTemplateItems - 1 + }; } default: return state; diff --git a/src/reducers/sponsors_inventory/form-template-list-reducer.js b/src/reducers/sponsors_inventory/form-template-list-reducer.js index 8406d3b3c..e5758b0a3 100644 --- a/src/reducers/sponsors_inventory/form-template-list-reducer.js +++ b/src/reducers/sponsors_inventory/form-template-list-reducer.js @@ -105,7 +105,11 @@ const formTemplateListReducer = (state = DEFAULT_STATE, action = {}) => { ? { ...item, is_archived: true } : item ); - return { ...state, formTemplates: updatedFormTemplates }; + return { + ...state, + formTemplates: updatedFormTemplates, + totalFormTemplates: state.totalFormTemplates - 1 + }; } case FORM_TEMPLATE_UNARCHIVED: { const updatedFormTemplateId = payload; @@ -115,7 +119,11 @@ const formTemplateListReducer = (state = DEFAULT_STATE, action = {}) => { ? { ...item, is_archived: false } : item ); - return { ...state, formTemplates: updatedFormTemplates }; + return { + ...state, + formTemplates: updatedFormTemplates, + totalFormTemplates: state.totalFormTemplates - 1 + }; } case CHANGE_FORM_TEMPLATE_SEARCH_TERM: { const { term } = payload; diff --git a/src/reducers/sponsors_inventory/inventory-item-list-reducer.js b/src/reducers/sponsors_inventory/inventory-item-list-reducer.js index 6da37a276..96855ef45 100644 --- a/src/reducers/sponsors_inventory/inventory-item-list-reducer.js +++ b/src/reducers/sponsors_inventory/inventory-item-list-reducer.js @@ -203,7 +203,11 @@ const inventoryItemListReducer = (state = DEFAULT_STATE, action = {}) => { const updatedInventoryItems = state.inventoryItems.map((item) => item.id === updatedItem.id ? { ...item, is_archived: true } : item ); - return { ...state, inventoryItems: updatedInventoryItems }; + return { + ...state, + inventoryItems: updatedInventoryItems, + totalInventoryItems: state.totalInventoryItems - 1 + }; } case INVENTORY_ITEM_UNARCHIVED: { const updatedItemId = payload; @@ -211,7 +215,11 @@ const inventoryItemListReducer = (state = DEFAULT_STATE, action = {}) => { const updatedInventoryItems = state.inventoryItems.map((item) => item.id === updatedItemId ? { ...item, is_archived: false } : item ); - return { ...state, inventoryItems: updatedInventoryItems }; + return { + ...state, + inventoryItems: updatedInventoryItems, + totalInventoryItems: state.totalInventoryItems - 1 + }; } case INVENTORY_ITEM_IMAGE_SAVED: { const newImage = payload.response; diff --git a/src/reducers/sponsors_inventory/page-template-list-reducer.js b/src/reducers/sponsors_inventory/page-template-list-reducer.js index ebd9fd6a9..e7e363f5f 100644 --- a/src/reducers/sponsors_inventory/page-template-list-reducer.js +++ b/src/reducers/sponsors_inventory/page-template-list-reducer.js @@ -109,7 +109,11 @@ const pageTemplateListReducer = (state = DEFAULT_STATE, action = {}) => { ? { ...item, is_archived: true } : item ); - return { ...state, pageTemplates: updatedPageTemplates }; + return { + ...state, + pageTemplates: updatedPageTemplates, + totalPageTemplates: state.totalPageTemplates - 1 + }; } case PAGE_TEMPLATE_UNARCHIVED: { const { pageTemplateId } = payload; @@ -117,7 +121,11 @@ const pageTemplateListReducer = (state = DEFAULT_STATE, action = {}) => { const updatedPageTemplates = state.pageTemplates.map((item) => item.id === pageTemplateId ? { ...item, is_archived: false } : item ); - return { ...state, pageTemplates: updatedPageTemplates }; + return { + ...state, + pageTemplates: updatedPageTemplates, + totalPageTemplates: state.totalPageTemplates - 1 + }; } default: return state; From b8545c54bfea1481c68bb2b6b7ade038f05ba52c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Wed, 20 May 2026 17:08:24 -0300 Subject: [PATCH 4/4] fix: add unit test cases for getSafePageAfterRemove MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/utils/__tests__/methods.test.js | 134 +++++++++++++++++----------- 1 file changed, 80 insertions(+), 54 deletions(-) diff --git a/src/utils/__tests__/methods.test.js b/src/utils/__tests__/methods.test.js index ac5275c43..e77c8108b 100644 --- a/src/utils/__tests__/methods.test.js +++ b/src/utils/__tests__/methods.test.js @@ -1,4 +1,8 @@ -import { getMediaInputValue, normalizeSelectAllField } from "../methods"; +import { + getMediaInputValue, + normalizeSelectAllField, + getSafePageAfterRemove +} from "../methods"; const FIXED_NOW = 1_772_551_911_231; beforeAll(() => jest.spyOn(Date, "now").mockReturnValue(FIXED_NOW)); @@ -55,69 +59,91 @@ describe("getMediaInputValue", () => { expect(result.filename).toBe("README"); }); }); +}); - describe("normalizeSelectAllField", () => { - it("should return default object when items is empty array", () => { - expect(normalizeSelectAllField([], "apply_to_all", "items")).toEqual({ - apply_to_all: false, - items: [] - }); +describe("normalizeSelectAllField", () => { + it("should return default object when items is empty array", () => { + expect(normalizeSelectAllField([], "apply_to_all", "items")).toEqual({ + apply_to_all: false, + items: [] }); + }); - it("should return all selected when array contains 'all'", () => { - expect( - normalizeSelectAllField( - ["all", { id: 1 }, { id: 2 }], - "apply_to_all", - "items" - ) - ).toEqual({ - apply_to_all: true, - items: [] - }); + it("should return all selected when array contains 'all'", () => { + expect( + normalizeSelectAllField( + ["all", { id: 1 }, { id: 2 }], + "apply_to_all", + "items" + ) + ).toEqual({ + apply_to_all: true, + items: [] }); + }); - it("should return all selected when allSelected flag is true", () => { - expect( - normalizeSelectAllField([{ id: 1 }], "apply_to_all", "items", true) - ).toEqual({ - apply_to_all: true, - items: [] - }); + it("should return all selected when allSelected flag is true", () => { + expect( + normalizeSelectAllField([{ id: 1 }], "apply_to_all", "items", true) + ).toEqual({ + apply_to_all: true, + items: [] }); + }); - it.each([[], null, undefined])( - "should return apply_to_all true when allSelected is true and items is %s", - (items) => { - expect( - normalizeSelectAllField(items, "apply_to_all", "items", true) - ).toEqual({ apply_to_all: true, items: [] }); - } - ); - - it.each([[], null, undefined])( - "should return apply_to_all false when allSelected is false and items is %s", - (items) => { - expect( - normalizeSelectAllField(items, "apply_to_all", "items", false) - ).toEqual({ apply_to_all: false, items: [] }); - } - ); - - it("should return array of ids when items are objects with id", () => { + it.each([[], null, undefined])( + "should return apply_to_all true when allSelected is true and items is %s", + (items) => { expect( - normalizeSelectAllField([{ id: 1 }, { id: 2 }], "apply_to_all", "items") - ).toEqual({ - apply_to_all: false, - items: [1, 2] - }); + normalizeSelectAllField(items, "apply_to_all", "items", true) + ).toEqual({ apply_to_all: true, items: [] }); + } + ); + + it.each([[], null, undefined])( + "should return apply_to_all false when allSelected is false and items is %s", + (items) => { + expect( + normalizeSelectAllField(items, "apply_to_all", "items", false) + ).toEqual({ apply_to_all: false, items: [] }); + } + ); + + it("should return array of ids when items are objects with id", () => { + expect( + normalizeSelectAllField([{ id: 1 }, { id: 2 }], "apply_to_all", "items") + ).toEqual({ + apply_to_all: false, + items: [1, 2] }); + }); - it("should return an array of values directly when items are primitives", () => { - expect(normalizeSelectAllField([1, 2], "apply_to_all", "items")).toEqual({ - apply_to_all: false, - items: [1, 2] - }); + it("should return an array of values directly when items are primitives", () => { + expect(normalizeSelectAllField([1, 2], "apply_to_all", "items")).toEqual({ + apply_to_all: false, + items: [1, 2] }); }); }); + +describe("getSafePageAfterRemove", () => { + it("should stay on page 1 when there is only one page", () => { + expect(getSafePageAfterRemove(10, 10, 1)).toBe(1); + }); + + it("should go back to page 1 when removing the last item on page 2", () => { + expect(getSafePageAfterRemove(11, 10, 2)).toBe(1); + }); + + it("should stay on page 2 when it still has items after removal", () => { + expect(getSafePageAfterRemove(12, 10, 2)).toBe(2); + }); + + it("should go back one page when removing the last item on the last page", () => { + expect(getSafePageAfterRemove(21, 10, 3)).toBe(2); + }); + + it("should never return a page lower than 1", () => { + expect(getSafePageAfterRemove(1, 10, 1)).toBe(1); + }); +});