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..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 @@ -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,37 @@ 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 + ); + }) + .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 0d7fef187..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 @@ -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,32 @@ 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 + ); + }) + .catch(() => + getFormTemplates( + term, + currentPage, + 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..5a4e55f68 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,35 @@ 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 + ); + }) + .catch(() => + getInventoryItems( + term, + currentPage, + 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..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 @@ -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,35 @@ 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 + ); + }) + .catch(() => + getPageTemplates( + term, + currentPage, + 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..0a1bd9aa6 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,18 @@ 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); + }) + .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 b8b2822a0..c4063fbda 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,35 @@ 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 + ); + }) + .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 8296b1a49..09355f343 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,28 @@ 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); + }) + .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 5ccaca2fb..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 @@ -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,37 @@ 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 + ); + }) + .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 044424ff9..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 @@ -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,38 @@ 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 + ); + }) + .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 cec79b3ff..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 @@ -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"; @@ -183,17 +184,35 @@ const SponsorPagesTab = ({ (item.is_archived ? unarchiveCustomizedPage(item.id) : archiveCustomizedPage(item.id) - ).then(() => { - const { perPage, order, orderDir, currentPage } = customizedPages; - return getSponsorCustomizedPages( - term, - currentPage, - 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; 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); + }); +}); 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); +};