diff --git a/src/components/forms/sponsor-general-form/index.js b/src/components/forms/sponsor-general-form/index.js deleted file mode 100644 index 781a8395f..000000000 --- a/src/components/forms/sponsor-general-form/index.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright 2025 OpenStack Foundation - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * */ - -import React from "react"; -import { Box } from "@mui/material"; -import SponsorHeader from "./sponsor-header"; -import Sponsorship from "./sponsorship"; -import BadgeScanSettings from "./badge-scan-settings"; -import SponsorExtraQuestions from "./extra-questions"; - -const SponsorGeneralForm = ({ - sponsor, - member, - summit, - onSponsorshipPaginate, - onSponsorshipAdd, - onSponsorshipDelete, - getSponsorshipAddons, - onSponsorshipSelect, - onSponsorshipAddonSave, - onSponsorshipAddonRemove, - getSponsorLeadReportSettingsMeta, - upsertSponsorLeadReportSettings, - getSponsorExtraQuestion, - saveSponsorExtraQuestion, - saveSponsorExtraQuestionValue, - resetSponsorExtraQuestionForm, - onExtraQuestionDelete, - onExtraQuestionReOrder -}) => ( - - - - - - -); - -export default SponsorGeneralForm; diff --git a/src/layouts/sponsor-id-layout.js b/src/layouts/sponsor-id-layout.js index d39a3d32c..e454c02bd 100644 --- a/src/layouts/sponsor-id-layout.js +++ b/src/layouts/sponsor-id-layout.js @@ -3,7 +3,7 @@ import { connect } from "react-redux"; import T from "i18n-react/dist/i18n-react"; import { Breadcrumb } from "react-breadcrumbs"; import { Switch, Route } from "react-router-dom"; -import EditSponsorPage from "../pages/sponsors/edit-sponsor-page"; +import SponsorPage from "../pages/sponsors/sponsor-page"; import { getSponsor, resetSponsorForm } from "../actions/sponsor-actions"; import EditAdSponsorPage from "../pages/sponsors/edit-advertisement-sponsor-page"; import EditMaterialSponsorPage from "../pages/sponsors/edit-material-sponsor-page"; @@ -141,23 +141,7 @@ class SponsorIdLayout extends React.Component { )} /> - - - ( -
- - -
- )} - /> -
+ diff --git a/src/pages/sponsors/__tests__/edit-sponsor-page.test.js b/src/pages/sponsors/__tests__/edit-sponsor-page.test.js index 13845645d..46b02c4e3 100644 --- a/src/pages/sponsors/__tests__/edit-sponsor-page.test.js +++ b/src/pages/sponsors/__tests__/edit-sponsor-page.test.js @@ -1,20 +1,19 @@ import React from "react"; import userEvent from "@testing-library/user-event"; import { act, screen } from "@testing-library/react"; -import EditSponsorPage, { - getFragmentFromValue, - getTabFromFragment -} from "../edit-sponsor-page"; +import { Router, Route } from "react-router-dom"; +import { createMemoryHistory } from "history"; +import SponsorPage from "../sponsor-page"; import { renderWithRedux } from "../../../utils/test-utils"; import { DEFAULT_STATE as currentSponsorDefaultState } from "../../../reducers/sponsors/sponsor-reducer"; -import { DEFAULT_STATE as currentSponsorFormsDefaultState } from "../../../reducers/sponsors/sponsor-page-forms-list-reducer"; +import { DEFAULT_STATE as sponsorPageFormsListDefaultState } from "../../../reducers/sponsors/sponsor-page-forms-list-reducer"; import { DEFAULT_ENTITY as defaultSummitEntity, DEFAULT_STATE as currentSummitDefaultState } from "../../../reducers/summits/current-summit-reducer"; jest.mock( - "../sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items.js" + "../sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items.js" ); jest.mock("../sponsor-users-list-per-sponsor/index.js"); @@ -29,190 +28,73 @@ jest.mock("../../../actions/sponsor-actions", () => ({ resetSponsorForm: jest.fn(() => ({ type: "MOCK_ACTION" })) })); -describe("EditSponsorPage", () => { - describe("getFragmentFromValue", () => { - it("returns correct values", () => { - const result1 = getFragmentFromValue(0); - expect(result1).toBe("general"); - - const result2 = getFragmentFromValue(2); - expect(result2).toBe("pages"); - - const result3 = getFragmentFromValue(3); - expect(result3).toBe("media_uploads"); - - const result4 = getFragmentFromValue(7); - expect(result4).toBe("badge_scans"); - }); - }); - - describe("getTabFromFragment", () => { - it("returns correct values for defined fragments", () => { - expect(getTabFromFragment({ hash: "#general" })).toBe(0); - expect(getTabFromFragment({ hash: "#users" })).toBe(1); - expect(getTabFromFragment({ hash: "#pages" })).toBe(2); - expect(getTabFromFragment({ hash: "#media_uploads" })).toBe(3); - expect(getTabFromFragment({ hash: "#forms" })).toBe(4); - expect(getTabFromFragment({ hash: "#badge_scans" })).toBe(7); - }); - }); - +const SPONSOR_ROUTE = "/app/summits/:summit_id/sponsors/:sponsor_id"; + +const baseState = { + currentSummitState: { + ...currentSummitDefaultState, + currentSummit: { ...defaultSummitEntity, id: 12 } + }, + loggedUserState: { + member: { groups: {} } + }, + currentSummitSponsorshipListState: { + sponsorships: [], + currentPage: 1, + lastPage: 1, + perPage: 100, + order: "order", + orderDir: 1, + totalSponsorships: 0 + }, + currentSponsorState: { + ...currentSponsorDefaultState, + entity: { ...currentSponsorDefaultState.entity, id: 123 } + }, + sponsorPageFormsListState: sponsorPageFormsListDefaultState +}; + +const renderSponsorPage = (url, state = baseState) => { + const history = createMemoryHistory({ initialEntries: [url] }); + return { + history, + ...renderWithRedux( + + + , + { initialState: state } + ) + }; +}; + +describe("SponsorPage", () => { describe("Component", () => { - it("should change the url fragment on tab click (same path)", async () => { - const mockHistory = { push: jest.fn(), replace: jest.fn() }; - - renderWithRedux( - , - { - initialState: { - currentSummitState: { - ...currentSummitDefaultState, - currentSummit: { ...defaultSummitEntity, id: 12 } - }, - loggedUserState: { - member: { - groups: {} - } - }, - currentSummitSponsorshipListState: { - sponsorships: [], - currentPage: 1, - lastPage: 1, - perPage: 100, - order: "order", - orderDir: 1, - totalSponsorships: 0 - }, - currentSponsorState: { - ...currentSponsorDefaultState, - entity: { ...currentSponsorDefaultState.entity, id: 123 } - }, - sponsorPageFormsListState: { - ...currentSponsorFormsDefaultState - } - } - } - ); - - const usersTabReference = screen.getByText("edit_sponsor.tab.forms"); + it("renders the tab nav at the base sponsor URL", () => { + renderSponsorPage("/app/summits/12/sponsors/123"); - await act(async () => { - await userEvent.click(usersTabReference); - }); - - expect(mockHistory.replace).toHaveBeenCalledWith( - expect.objectContaining({ - hash: "#forms" - }) - ); - expect(mockHistory.push).not.toHaveBeenCalled(); + expect(screen.getByText("edit_sponsor.tab.general")).toBeInTheDocument(); + expect(screen.getByText("edit_sponsor.tab.forms")).toBeInTheDocument(); }); - it("should call history.push on tab click when on nested route", async () => { - const mockHistory = { push: jest.fn(), replace: jest.fn() }; - - renderWithRedux( - , - { - initialState: { - currentSummitState: { - ...currentSummitDefaultState, - currentSummit: { ...defaultSummitEntity, id: 12 } - }, - loggedUserState: { - member: { groups: {} } - }, - currentSummitSponsorshipListState: { - sponsorships: [], - currentPage: 1, - lastPage: 1, - perPage: 100, - order: "order", - orderDir: 1, - totalSponsorships: 0 - }, - currentSponsorState: { - ...currentSponsorDefaultState, - entity: { ...currentSponsorDefaultState.entity, id: 44 } - } - } - } - ); + it("navigates to the correct URL when a tab is clicked", async () => { + const { history } = renderSponsorPage("/app/summits/12/sponsors/123"); - const usersTab = screen.getByText("edit_sponsor.tab.users"); + const formsTab = screen.getByText("edit_sponsor.tab.forms"); await act(async () => { - await userEvent.click(usersTab); + await userEvent.click(formsTab); }); - expect(mockHistory.push).toHaveBeenCalledWith( - "/app/summits/12/sponsors/44#users" + expect(history.location.pathname).toBe( + "/app/summits/12/sponsors/123/forms" ); }); - it("should change the tab rendered on fragment change", () => { - const { rerender } = renderWithRedux( - , - { - initialState: { - currentSummitState: { - currentSummit: defaultSummitEntity, - ...currentSummitDefaultState - }, - loggedUserState: { - member: { - groups: {} - } - }, - currentSummitSponsorshipListState: { - sponsorships: [], - currentPage: 1, - lastPage: 1, - perPage: 100, - order: "order", - orderDir: 1, - totalSponsorships: 0 - }, - currentSponsorState: { - sponsorships: [], - ...currentSponsorDefaultState - } - } - } - ); - - const generalTabPanel = screen.getByTestId("simple-tabpanel-0"); - expect(generalTabPanel).toBeDefined(); + it("selects the correct tab based on URL path", () => { + renderSponsorPage("/app/summits/12/sponsors/123/users"); - rerender( - - ); - - const usersTabPanel = screen.getByTestId("simple-tabpanel-1"); - expect(usersTabPanel).toBeDefined(); + const usersTab = screen.getByText("edit_sponsor.tab.users"); + expect(usersTab.closest("[aria-selected='true']")).toBeTruthy(); }); }); }); diff --git a/src/pages/sponsors/edit-sponsor-page.js b/src/pages/sponsors/edit-sponsor-page.js deleted file mode 100644 index 31a549070..000000000 --- a/src/pages/sponsors/edit-sponsor-page.js +++ /dev/null @@ -1,378 +0,0 @@ -/** - * Copyright 2018 OpenStack Foundation - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * */ - -import React, { useState, useEffect } from "react"; -import { connect } from "react-redux"; -import T from "i18n-react/dist/i18n-react"; -import { Box, Container, Tab, Tabs, Typography } from "@mui/material"; -import { - saveSponsor, - resetSponsorForm, - getSponsorAdvertisements, - getSponsorMaterials, - getSponsorSocialNetworks, - getSponsorLeadReportSettingsMeta, - getSponsorTiers, - addTierToSponsor, - removeTierFromSponsor, - getSponsorshipAddons, - saveAddonsToSponsorship, - removeAddonToSponsorship, - setSelectedSponsorship, - upsertSponsorLeadReportSettings, - getSponsorExtraQuestion, - saveSponsorExtraQuestion, - saveSponsorExtraQuestionValue, - resetSponsorExtraQuestionForm, - deleteExtraQuestion, - updateExtraQuestionOrder, - getExtraQuestionMeta -} from "../../actions/sponsor-actions"; -import { getSponsorPurchasesMeta } from "../../actions/sponsor-settings-actions"; -import SponsorGeneralForm from "../../components/forms/sponsor-general-form/index"; -import SponsorUsersListPerSponsorPage from "./sponsor-users-list-per-sponsor"; -import SponsorFormsTab from "./sponsor-forms-tab"; -import SponsorBadgeScans from "./sponsor-badge-scans"; -import SponsorCartTab from "./sponsor-cart-tab"; -import SponsorPagesTab from "./sponsor-pages-tab"; -import SponsorFormsManageItems from "./sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items"; -import { SPONSOR_TABS, ACCESS_ROUTES } from "../../utils/constants"; -import SponsorPurchasesTab from "./sponsor-purchases-tab"; -import SponsorMediaUploadTab from "./sponsor-media-upload-tab"; -import Member from "../../models/member"; - -export const tabsToFragmentMap = [ - "general", - "users", - "pages", - "media_uploads", - "forms", - "cart", - "purchases", - "badge_scans" -]; - -export const getFragmentFromValue = (index) => tabsToFragmentMap[index]; - -export const getTabFromFragment = (location) => { - const currentHash = (location.hash || "").replace("#", ""); - const result = tabsToFragmentMap.indexOf(currentHash); - if (result > -1) return result; - return 0; -}; - -export const CustomTabPanel = (props) => { - const { children, value, index, ...other } = props; - - return ( - - ); -}; - -const a11yProps = (index) => ({ - id: `simple-tab-${index}`, - "aria-controls": `simple-tabpanel-${index}` -}); - -const EditSponsorPage = (props) => { - const { - entity, - member, - history, - location, - match, - currentSummit, - resetSponsorForm, - getSponsorAdvertisements, - getSponsorMaterials, - getSponsorSocialNetworks, - getSponsorLeadReportSettingsMeta, - getSponsorTiers, - addTierToSponsor, - removeTierFromSponsor, - getSponsorshipAddons, - saveAddonsToSponsorship, - removeAddonToSponsorship, - setSelectedSponsorship, - upsertSponsorLeadReportSettings, - getSponsorExtraQuestion, - saveSponsorExtraQuestion, - saveSponsorExtraQuestionValue, - resetSponsorExtraQuestionForm, - deleteExtraQuestion, - updateExtraQuestionOrder, - getExtraQuestionMeta, - getSponsorPurchasesMeta - } = props; - - const [selectedTab, setSelectedTab] = useState(getTabFromFragment(location)); - - const memberObj = new Member(member); - const isNestedFormItemRoute = !!match.params?.form_id; - - const handleTabChange = (event, newValue) => { - setSelectedTab(newValue); - const fragment = getFragmentFromValue(newValue); - if (isNestedFormItemRoute) { - history.push( - `/app/summits/${currentSummit.id}/sponsors/${entity.id}#${fragment}` - ); - } else { - history.replace({ ...location, hash: `#${fragment}` }); - } - }; - - useEffect(() => { - setSelectedTab(getTabFromFragment(location)); - }, [location.hash]); - - useEffect(() => { - if (!location.hash) { - const defaultTab = isNestedFormItemRoute - ? SPONSOR_TABS.FORMS - : SPONSOR_TABS.GENERAL; - history.replace({ - ...location, - hash: `#${getFragmentFromValue(defaultTab)}` - }); - } - }, []); - - useEffect(() => { - if (entity.id > 0) { - getSponsorAdvertisements(entity.id); - getSponsorMaterials(entity.id); - getSponsorSocialNetworks(entity.id); - getSponsorLeadReportSettingsMeta(entity.id); - getSponsorTiers(entity.id); - getExtraQuestionMeta(); - getSponsorPurchasesMeta(); - } else { - resetSponsorForm(); - } - }, [entity.id]); - - const handleSponsorshipPaginate = (page, perPage, order, orderDir) => { - getSponsorTiers(entity.id, page, perPage, order, orderDir); - }; - - const tabs = [ - { - label: T.translate("edit_sponsor.tab.general"), - value: SPONSOR_TABS.GENERAL, - accessRoute: ACCESS_ROUTES.SPONSORS - }, - { - label: T.translate("edit_sponsor.tab.users"), - value: SPONSOR_TABS.USERS, - accessRoute: ACCESS_ROUTES.ADMIN_SPONSORS - }, - { - label: T.translate("edit_sponsor.tab.pages"), - value: SPONSOR_TABS.PAGES, - accessRoute: ACCESS_ROUTES.ADMIN_SPONSORS - }, - { - label: T.translate("edit_sponsor.tab.media_uploads"), - value: SPONSOR_TABS.MEDIA_UPLOADS, - accessRoute: ACCESS_ROUTES.ADMIN_SPONSORS - }, - { - label: T.translate("edit_sponsor.tab.forms"), - value: SPONSOR_TABS.FORMS, - accessRoute: ACCESS_ROUTES.ADMIN_SPONSORS - }, - { - label: T.translate("edit_sponsor.tab.cart"), - value: SPONSOR_TABS.CART, - accessRoute: ACCESS_ROUTES.ADMIN_SPONSORS - }, - { - label: T.translate("edit_sponsor.tab.purchases"), - value: SPONSOR_TABS.PURCHASES, - accessRoute: ACCESS_ROUTES.ADMIN_SPONSORS - }, - { - label: T.translate("edit_sponsor.tab.badge_scans"), - value: SPONSOR_TABS.BADGE_SCANS, - accessRoute: ACCESS_ROUTES.SPONSORS - } - ]; - - const drawTab = (tab) => { - if (!memberObj.hasAccess(tab.accessRoute)) return null; - return ( - - ); - }; - - return ( - - - - {entity.company?.name} - - - - {tabs.map(drawTab)} - - - {memberObj.hasAccess(ACCESS_ROUTES.SPONSORS) && ( - - - - )} - {memberObj.hasAccess(ACCESS_ROUTES.ADMIN_SPONSORS) && ( - - - - )} - {memberObj.hasAccess(ACCESS_ROUTES.ADMIN_SPONSORS) && ( - - - - )} - {memberObj.hasAccess(ACCESS_ROUTES.ADMIN_SPONSORS) && ( - - - - )} - {memberObj.hasAccess(ACCESS_ROUTES.ADMIN_SPONSORS) && ( - - {isNestedFormItemRoute ? ( - - ) : ( - - )} - - )} - {memberObj.hasAccess(ACCESS_ROUTES.ADMIN_SPONSORS) && ( - - - - )} - {memberObj.hasAccess(ACCESS_ROUTES.ADMIN_SPONSORS) && ( - - - - )} - {memberObj.hasAccess(ACCESS_ROUTES.SPONSORS) && ( - - - - )} - - - ); -}; - -const mapStateToProps = ({ - loggedUserState, - currentSummitState, - currentSponsorState, - currentSummitSponsorshipListState -}) => ({ - currentSummit: currentSummitState.currentSummit, - sponsorships: currentSummitSponsorshipListState.sponsorships, - member: loggedUserState.member, - ...currentSponsorState -}); - -export default connect(mapStateToProps, { - saveSponsor, - resetSponsorForm, - getSponsorAdvertisements, - getSponsorMaterials, - getSponsorSocialNetworks, - getSponsorLeadReportSettingsMeta, - getSponsorTiers, - addTierToSponsor, - removeTierFromSponsor, - getSponsorshipAddons, - saveAddonsToSponsorship, - removeAddonToSponsorship, - setSelectedSponsorship, - upsertSponsorLeadReportSettings, - getSponsorExtraQuestion, - saveSponsorExtraQuestion, - saveSponsorExtraQuestionValue, - resetSponsorExtraQuestionForm, - deleteExtraQuestion, - updateExtraQuestionOrder, - getExtraQuestionMeta, - getSponsorPurchasesMeta -})(EditSponsorPage); diff --git a/src/pages/sponsors/sponsor-page/components/tab-nav.js b/src/pages/sponsors/sponsor-page/components/tab-nav.js new file mode 100644 index 000000000..94d54b47f --- /dev/null +++ b/src/pages/sponsors/sponsor-page/components/tab-nav.js @@ -0,0 +1,69 @@ +import React from "react"; +import { connect } from "react-redux"; +import T from "i18n-react/dist/i18n-react"; +import { Tab, Tabs } from "@mui/material"; +import { matchPath } from "react-router-dom"; +import Member from "../../../../models/member"; +import { SPONSOR_PAGE_TABS } from "../tabDefs"; + +const TabNav = ({ currentSummit, sponsor, member, history, location }) => { + const memberObj = new Member(member); + + const tabs = SPONSOR_PAGE_TABS.map((t) => ({ + ...t, + label: T.translate(t.labelKey), + value: t.path.slice(1) || "general" + })); + + const routeMatch = matchPath(location.pathname, { + path: "/app/summits/:summitId/sponsors/:sponsorId/:tab" + }); + const selectedTab = routeMatch?.params?.tab || tabs[0].value; + + const handleTabChange = (value) => { + const tab = tabs.find((t) => t.value === value); + history.push( + `/app/summits/${currentSummit.id}/sponsors/${sponsor.id}${tab.path}` + ); + }; + + return ( + handleTabChange(val)} + sx={{ minHeight: "36px" }} + > + {tabs + .filter((t) => memberObj.hasAccess(t.accessRoute)) + .map((tab) => ( + + ))} + + ); +}; + +const mapStateToProps = ({ + loggedUserState, + currentSummitState, + currentSponsorState +}) => ({ + currentSummit: currentSummitState.currentSummit, + member: loggedUserState.member, + sponsor: currentSponsorState.entity +}); + +export default connect(mapStateToProps, {})(TabNav); diff --git a/src/pages/sponsors/sponsor-page/index.js b/src/pages/sponsors/sponsor-page/index.js new file mode 100644 index 000000000..ea3c6f03e --- /dev/null +++ b/src/pages/sponsors/sponsor-page/index.js @@ -0,0 +1,109 @@ +/** + * Copyright 2018 OpenStack Foundation + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * */ + +import React, { useEffect } from "react"; +import { connect } from "react-redux"; +import { Box, Container, Typography } from "@mui/material"; +import { Redirect, Route, Switch } from "react-router-dom"; +import { + getExtraQuestionMeta, + getSponsorAdvertisements, + getSponsorLeadReportSettingsMeta, + getSponsorMaterials, + getSponsorSocialNetworks, + getSponsorTiers, + resetSponsorForm +} from "../../../actions/sponsor-actions"; +import { getSponsorPurchasesMeta } from "../../../actions/sponsor-settings-actions"; +import TabNav from "./components/tab-nav"; +import { SPONSOR_PAGE_TABS } from "./tabDefs"; + +const SponsorPage = ({ + entity, + history, + location, + match, + currentSummit, + resetSponsorForm, + getSponsorAdvertisements, + getSponsorMaterials, + getSponsorSocialNetworks, + getSponsorLeadReportSettingsMeta, + getSponsorTiers, + getExtraQuestionMeta, + getSponsorPurchasesMeta +}) => { + useEffect(() => { + if (entity.id > 0) { + getSponsorAdvertisements(entity.id); + getSponsorMaterials(entity.id); + getSponsorSocialNetworks(entity.id); + getSponsorLeadReportSettingsMeta(entity.id); + getSponsorTiers(entity.id); + getExtraQuestionMeta(); + getSponsorPurchasesMeta(); + } else { + resetSponsorForm(); + } + }, [entity.id]); + + return ( + + + + {entity.company?.name} + + + + + + {SPONSOR_PAGE_TABS.map( + ({ path, exact, strict, component: Component }) => ( + + ) + )} + + + + + ); +}; + +const mapStateToProps = ({ + currentSummitState, + currentSponsorState, + currentSummitSponsorshipListState +}) => ({ + currentSummit: currentSummitState.currentSummit, + sponsorships: currentSummitSponsorshipListState.sponsorships, + ...currentSponsorState +}); + +export default connect(mapStateToProps, { + resetSponsorForm, + getSponsorAdvertisements, + getSponsorMaterials, + getSponsorSocialNetworks, + getSponsorLeadReportSettingsMeta, + getSponsorTiers, + getExtraQuestionMeta, + getSponsorPurchasesMeta +})(SponsorPage); diff --git a/src/pages/sponsors/sponsor-page/tabDefs.js b/src/pages/sponsors/sponsor-page/tabDefs.js new file mode 100644 index 000000000..083a3048f --- /dev/null +++ b/src/pages/sponsors/sponsor-page/tabDefs.js @@ -0,0 +1,95 @@ +import React from "react"; +import { Route, Switch } from "react-router-dom"; +import { Breadcrumb } from "react-breadcrumbs"; +import { ACCESS_ROUTES } from "../../../utils/constants"; +import Restrict from "../../../routes/restrict"; +import SponsorGeneralForm from "./tabs/sponsor-general-form"; +import SponsorUsersListPerSponsorPage from "../sponsor-users-list-per-sponsor"; +import SponsorPagesTab from "./tabs/sponsor-pages-tab"; +import SponsorMediaUploadTab from "./tabs/sponsor-media-upload-tab"; +import SponsorFormsTab from "./tabs/sponsor-forms-tab"; +import SponsorFormsManageItems from "./tabs/sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items"; +import SponsorCartTab from "./tabs/sponsor-cart-tab"; +import SponsorPurchasesTab from "./tabs/sponsor-purchases-tab"; +import SponsorBadgeScans from "./tabs/sponsor-badge-scans"; + +const SponsorFormsRoute = ({ match }) => ( +
+ + + + + +
+); + +export const SPONSOR_PAGE_TABS = [ + { + labelKey: "edit_sponsor.tab.general", + path: "", + exact: true, + strict: true, + component: SponsorGeneralForm, + accessRoute: ACCESS_ROUTES.SPONSORS + }, + { + labelKey: "edit_sponsor.tab.users", + path: "/users", + exact: true, + component: SponsorUsersListPerSponsorPage, + accessRoute: ACCESS_ROUTES.ADMIN_SPONSORS + }, + { + labelKey: "edit_sponsor.tab.pages", + path: "/pages", + exact: true, + component: SponsorPagesTab, + accessRoute: ACCESS_ROUTES.ADMIN_SPONSORS + }, + { + labelKey: "edit_sponsor.tab.media_uploads", + path: "/media-uploads", + exact: true, + component: SponsorMediaUploadTab, + accessRoute: ACCESS_ROUTES.ADMIN_SPONSORS + }, + { + labelKey: "edit_sponsor.tab.forms", + path: "/forms", + component: SponsorFormsRoute, + accessRoute: ACCESS_ROUTES.ADMIN_SPONSORS + }, + { + labelKey: "edit_sponsor.tab.cart", + path: "/cart", + exact: true, + component: SponsorCartTab, + accessRoute: ACCESS_ROUTES.ADMIN_SPONSORS + }, + { + labelKey: "edit_sponsor.tab.purchases", + path: "/purchases", + exact: true, + component: SponsorPurchasesTab, + accessRoute: ACCESS_ROUTES.ADMIN_SPONSORS + }, + { + labelKey: "edit_sponsor.tab.badge_scans", + path: "/badge-scans", + exact: true, + component: SponsorBadgeScans, + accessRoute: ACCESS_ROUTES.SPONSORS + } +].map((tab) => ({ + ...tab, + component: Restrict(tab.component, tab.accessRoute) +})); diff --git a/src/pages/sponsors/sponsor-badge-scans/edit-badge-scan-popup.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/edit-badge-scan-popup.js similarity index 96% rename from src/pages/sponsors/sponsor-badge-scans/edit-badge-scan-popup.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/edit-badge-scan-popup.js index 2bb8e5f0a..b56dbcf2b 100644 --- a/src/pages/sponsors/sponsor-badge-scans/edit-badge-scan-popup.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/edit-badge-scan-popup.js @@ -19,9 +19,9 @@ import { import CloseIcon from "@mui/icons-material/Close"; import ExtraQuestionsMUI from "openstack-uicore-foundation/lib/components/extra-questions-mui"; -import useScrollToError from "../../../hooks/useScrollToError"; -import MuiFormikTextField from "../../../components/mui/formik-inputs/mui-formik-textfield"; -import { getTypeValue, toSlug } from "../../../utils/extra-questions"; +import useScrollToError from "../../../../../hooks/useScrollToError"; +import MuiFormikTextField from "../../../../../components/mui/formik-inputs/mui-formik-textfield"; +import { getTypeValue, toSlug } from "../../../../../utils/extra-questions"; const formatExtraQuestions = (extraQuestions, sponsorQuestions) => { const values = {}; diff --git a/src/pages/sponsors/sponsor-badge-scans/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/index.js similarity index 94% rename from src/pages/sponsors/sponsor-badge-scans/index.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/index.js index 1853aac2d..e998d27f1 100644 --- a/src/pages/sponsors/sponsor-badge-scans/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-badge-scans/index.js @@ -18,14 +18,14 @@ import { Box, Button, Grid2, TextField } from "@mui/material"; import SearchIcon from "@mui/icons-material/Search"; import AddIcon from "@mui/icons-material/Add"; import DownloadIcon from "@mui/icons-material/Download"; -import MuiTable from "../../../components/mui/table/mui-table"; +import MuiTable from "../../../../../components/mui/table/mui-table"; import { getBadgeScans, exportBadgeScans, getBadgeScan, saveBadgeScan -} from "../../../actions/sponsor-actions"; -import { DEFAULT_CURRENT_PAGE } from "../../../utils/constants"; +} from "../../../../../actions/sponsor-actions"; +import { DEFAULT_CURRENT_PAGE } from "../../../../../utils/constants"; import EditBadgeScanPopup from "./edit-badge-scan-popup"; const SponsorBadgeScans = ({ @@ -237,9 +237,14 @@ const SponsorBadgeScans = ({ ); }; -const mapStateToProps = ({ badgeScansListState, currentBadgeScanState }) => ({ +const mapStateToProps = ({ + badgeScansListState, + currentBadgeScanState, + currentSponsorState +}) => ({ ...badgeScansListState, - currentBadgeScan: currentBadgeScanState.entity + currentBadgeScan: currentBadgeScanState.entity, + sponsor: currentSponsorState.entity }); export default connect(mapStateToProps, { diff --git a/src/pages/sponsors/sponsor-cart-tab/components/cart-note/__tests__/cart-note.test.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-note/__tests__/cart-note.test.js similarity index 99% rename from src/pages/sponsors/sponsor-cart-tab/components/cart-note/__tests__/cart-note.test.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-note/__tests__/cart-note.test.js index 23bfc93b3..e8be8d3db 100644 --- a/src/pages/sponsors/sponsor-cart-tab/components/cart-note/__tests__/cart-note.test.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-note/__tests__/cart-note.test.js @@ -15,7 +15,7 @@ jest.mock("openstack-uicore-foundation/lib/utils/methods", () => ({ // Mock confirm dialog const mockShowConfirmDialog = jest.fn(); -jest.mock("../../../../../../components/mui/showConfirmDialog", () => ({ +jest.mock("../../../../../../../../components/mui/showConfirmDialog", () => ({ __esModule: true, default: (...args) => mockShowConfirmDialog(...args) })); diff --git a/src/pages/sponsors/sponsor-cart-tab/components/cart-note/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-note/index.js similarity index 98% rename from src/pages/sponsors/sponsor-cart-tab/components/cart-note/index.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-note/index.js index f67cd6bbc..3333a5c1d 100644 --- a/src/pages/sponsors/sponsor-cart-tab/components/cart-note/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-note/index.js @@ -13,7 +13,7 @@ import { import EditIcon from "@mui/icons-material/Edit"; import DeleteIcon from "@mui/icons-material/Delete"; import PropTypes from "prop-types"; -import showConfirmDialog from "../../../../../components/mui/showConfirmDialog"; +import showConfirmDialog from "../../../../../../../components/mui/showConfirmDialog"; const CartNote = ({ title, diff --git a/src/pages/sponsors/sponsor-cart-tab/components/cart-view.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-view.js similarity index 95% rename from src/pages/sponsors/sponsor-cart-tab/components/cart-view.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-view.js index 272eba524..d299ed8ad 100644 --- a/src/pages/sponsors/sponsor-cart-tab/components/cart-view.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/cart-view.js @@ -25,9 +25,9 @@ import { import AddIcon from "@mui/icons-material/Add"; import LockOpenIcon from "@mui/icons-material/LockOpen"; import LockClosedIcon from "@mui/icons-material/Lock"; -import MuiTable from "../../../../components/mui/table/mui-table"; -import { TotalRow } from "../../../../components/mui/table/extra-rows"; -import SearchInput from "../../../../components/mui/search-input"; +import MuiTable from "../../../../../../components/mui/table/mui-table"; +import { TotalRow } from "../../../../../../components/mui/table/extra-rows"; +import SearchInput from "../../../../../../components/mui/search-input"; import { deleteSponsorCartForm, getSponsorCart, @@ -35,9 +35,9 @@ import { unlockSponsorCartForm, saveSponsorCartNote, deleteSponsorCartNote -} from "../../../../actions/sponsor-cart-actions"; +} from "../../../../../../actions/sponsor-cart-actions"; import CartNote from "./cart-note"; -import { SPONSOR_CART_NOTE_TYPES } from "../../../../utils/constants"; +import { SPONSOR_CART_NOTE_TYPES } from "../../../../../../utils/constants"; const CartView = ({ cart, diff --git a/src/pages/sponsors/sponsor-cart-tab/components/edit-form/__tests__/edit-cart-form.test.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/edit-form/__tests__/edit-cart-form.test.js similarity index 96% rename from src/pages/sponsors/sponsor-cart-tab/components/edit-form/__tests__/edit-cart-form.test.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/edit-form/__tests__/edit-cart-form.test.js index 83cc17401..46bc01308 100644 --- a/src/pages/sponsors/sponsor-cart-tab/components/edit-form/__tests__/edit-cart-form.test.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/edit-form/__tests__/edit-cart-form.test.js @@ -10,14 +10,14 @@ jest.mock("i18n-react/dist/i18n-react", () => ({ const mockGetSponsorCartForm = jest.fn(() => () => Promise.resolve()); const mockUpdateCartForm = jest.fn(() => () => Promise.resolve()); -jest.mock("../../../../../../actions/sponsor-cart-actions", () => ({ +jest.mock("../../../../../../../../actions/sponsor-cart-actions", () => ({ getSponsorCartForm: (...args) => mockGetSponsorCartForm(...args), updateCartForm: (...args) => mockUpdateCartForm(...args) })); // Mock sub-components used by FormItemTable jest.mock( - "../../../../../../components/mui/FormItemTable/components/GlobalQuantityField", + "../../../../../../../../components/mui/FormItemTable/components/GlobalQuantityField", () => { const React = require("react"); return { @@ -30,7 +30,7 @@ jest.mock( ); jest.mock( - "../../../../../../components/mui/FormItemTable/components/ItemTableField", + "../../../../../../../../components/mui/FormItemTable/components/ItemTableField", () => { const React = require("react"); return { @@ -43,7 +43,7 @@ jest.mock( ); jest.mock( - "../../../../../../components/mui/formik-inputs/mui-formik-select", + "../../../../../../../../components/mui/formik-inputs/mui-formik-select", () => { const React = require("react"); return { @@ -62,7 +62,7 @@ jest.mock( ); jest.mock( - "../../../../../../components/mui/formik-inputs/mui-formik-pricefield", + "../../../../../../../../components/mui/formik-inputs/mui-formik-pricefield", () => { const React = require("react"); return { @@ -75,7 +75,7 @@ jest.mock( ); jest.mock( - "../../../../../../components/mui/formik-inputs/mui-formik-discountfield", + "../../../../../../../../components/mui/formik-inputs/mui-formik-discountfield", () => { const React = require("react"); return { diff --git a/src/pages/sponsors/sponsor-cart-tab/components/edit-form/edit-cart-form.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/edit-form/edit-cart-form.js similarity index 95% rename from src/pages/sponsors/sponsor-cart-tab/components/edit-form/edit-cart-form.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/edit-form/edit-cart-form.js index bac58b422..34225b10b 100644 --- a/src/pages/sponsors/sponsor-cart-tab/components/edit-form/edit-cart-form.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/edit-form/edit-cart-form.js @@ -16,7 +16,7 @@ import { connect } from "react-redux"; import { getSponsorCartForm, updateCartForm -} from "../../../../../actions/sponsor-cart-actions"; +} from "../../../../../../../actions/sponsor-cart-actions"; import EditForm from "./index"; const EditCartForm = ({ diff --git a/src/pages/sponsors/sponsor-cart-tab/components/edit-form/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/edit-form/index.js similarity index 96% rename from src/pages/sponsors/sponsor-cart-tab/components/edit-form/index.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/edit-form/index.js index 67331dfa6..7b400226a 100644 --- a/src/pages/sponsors/sponsor-cart-tab/components/edit-form/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/edit-form/index.js @@ -20,13 +20,11 @@ import { Button, Typography } from "@mui/material"; import Box from "@mui/material/Box"; import moment from "moment-timezone"; import { epochToMomentTimeZone } from "openstack-uicore-foundation/lib/utils/methods"; -import FormItemTable from "../../../../../components/mui/FormItemTable"; -import { DISCOUNT_TYPES } from "../../../../../utils/constants"; -import NotesModal from "../../../../../components/mui/NotesModal"; -import ItemSettingsModal from "../../../../../components/mui/ItemSettingsModal"; -import { - getCurrentApplicableRate -} from "../../../../../components/mui/FormItemTable/helpers"; +import FormItemTable from "../../../../../../../components/mui/FormItemTable"; +import { DISCOUNT_TYPES } from "../../../../../../../utils/constants"; +import NotesModal from "../../../../../../../components/mui/NotesModal"; +import ItemSettingsModal from "../../../../../../../components/mui/ItemSettingsModal"; +import { getCurrentApplicableRate } from "../../../../../../../components/mui/FormItemTable/helpers"; const parseValue = (item, timeZone) => { switch (item.type) { diff --git a/src/pages/sponsors/sponsor-cart-tab/components/edit-form/new-cart-form.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/edit-form/new-cart-form.js similarity index 96% rename from src/pages/sponsors/sponsor-cart-tab/components/edit-form/new-cart-form.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/edit-form/new-cart-form.js index 78ec20c15..389013f42 100644 --- a/src/pages/sponsors/sponsor-cart-tab/components/edit-form/new-cart-form.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/edit-form/new-cart-form.js @@ -16,7 +16,7 @@ import { connect } from "react-redux"; import { addCartForm, getSponsorForm -} from "../../../../../actions/sponsor-cart-actions"; +} from "../../../../../../../actions/sponsor-cart-actions"; import EditForm from "./index"; const NewCartForm = ({ diff --git a/src/pages/sponsors/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 similarity index 95% rename from src/pages/sponsors/sponsor-cart-tab/components/select-form-dialog/__tests__/select-form-dialog.test.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/select-form-dialog/__tests__/select-form-dialog.test.js index 04c09f6c1..cdc436373 100644 --- a/src/pages/sponsors/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 @@ -7,12 +7,12 @@ jest.mock("i18n-react/dist/i18n-react", () => ({ })); // Mock Redux actions -jest.mock("../../../../../../actions/sponsor-cart-actions", () => ({ +jest.mock("../../../../../../../../actions/sponsor-cart-actions", () => ({ getSponsorFormsForCart: jest.fn(() => () => Promise.resolve()) })); // Mock SearchInput component -jest.mock("../../../../../../components/mui/search-input", () => { +jest.mock("../../../../../../../../components/mui/search-input", () => { const React = require("react"); return { __esModule: true, @@ -35,7 +35,7 @@ jest.mock("../../../../../../components/mui/search-input", () => { }); // Mock MuiInfiniteTable component -jest.mock("../../../../../../components/mui/infinite-table", () => { +jest.mock("../../../../../../../../components/mui/infinite-table", () => { const React = require("react"); return { __esModule: true, @@ -80,7 +80,7 @@ jest.mock("../../../../../../components/mui/infinite-table", () => { }); // Mock SponsorAddonSelect component -jest.mock("../../../../../../components/mui/sponsor-addon-select", () => { +jest.mock("../../../../../../../../components/mui/sponsor-addon-select", () => { const React = require("react"); return { __esModule: true, @@ -207,7 +207,7 @@ describe("SelectFormDialog", () => { test("calls getSponsorFormsForCart when dialog opens", () => { const { getSponsorFormsForCart - } = require("../../../../../../actions/sponsor-cart-actions"); + } = require("../../../../../../../../actions/sponsor-cart-actions"); renderWithStore(); @@ -217,7 +217,7 @@ describe("SelectFormDialog", () => { test("does not call getSponsorFormsForCart when dialog is closed", () => { const { getSponsorFormsForCart - } = require("../../../../../../actions/sponsor-cart-actions"); + } = require("../../../../../../../../actions/sponsor-cart-actions"); renderWithStore({ open: false }); @@ -436,7 +436,7 @@ describe("SelectFormDialog", () => { test("calls getSponsorFormsForCart with search term", async () => { const { getSponsorFormsForCart - } = require("../../../../../../actions/sponsor-cart-actions"); + } = require("../../../../../../../../actions/sponsor-cart-actions"); renderWithStore(); const searchInput = screen.getByTestId("search-input"); @@ -453,7 +453,7 @@ describe("SelectFormDialog", () => { test("calls getSponsorFormsForCart with sort parameters", async () => { const { getSponsorFormsForCart - } = require("../../../../../../actions/sponsor-cart-actions"); + } = require("../../../../../../../../actions/sponsor-cart-actions"); renderWithStore(); // Find sortable column button (code column) @@ -470,7 +470,7 @@ describe("SelectFormDialog", () => { test("calls getSponsorFormsForCart to load next page", async () => { const { getSponsorFormsForCart - } = require("../../../../../../actions/sponsor-cart-actions"); + } = require("../../../../../../../../actions/sponsor-cart-actions"); renderWithStore({}, { total: 20 }); // More items available const loadMoreButton = screen.getByTestId("load-more"); @@ -482,7 +482,7 @@ describe("SelectFormDialog", () => { test("does not load more when all items are displayed", () => { const { getSponsorFormsForCart - } = require("../../../../../../actions/sponsor-cart-actions"); + } = require("../../../../../../../../actions/sponsor-cart-actions"); renderWithStore({}, { total: mockForms.length }); // Initial call only diff --git a/src/pages/sponsors/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 similarity index 93% rename from src/pages/sponsors/sponsor-cart-tab/components/select-form-dialog/index.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/components/select-form-dialog/index.js index e71088691..fc6233e80 100644 --- a/src/pages/sponsors/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 @@ -17,10 +17,10 @@ import { Typography } from "@mui/material"; import CloseIcon from "@mui/icons-material/Close"; -import SearchInput from "../../../../../components/mui/search-input"; -import { getSponsorFormsForCart } from "../../../../../actions/sponsor-cart-actions"; -import MuiInfiniteTable from "../../../../../components/mui/infinite-table"; -import SponsorAddonSelect from "../../../../../components/mui/sponsor-addon-select"; +import SearchInput from "../../../../../../../components/mui/search-input"; +import { getSponsorFormsForCart } from "../../../../../../../actions/sponsor-cart-actions"; +import MuiInfiniteTable from "../../../../../../../components/mui/infinite-table"; +import SponsorAddonSelect from "../../../../../../../components/mui/sponsor-addon-select"; const SelectFormDialog = ({ availableForms, diff --git a/src/pages/sponsors/sponsor-cart-tab/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/index.js similarity index 86% rename from src/pages/sponsors/sponsor-cart-tab/index.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/index.js index ca9a23a11..742342ab0 100644 --- a/src/pages/sponsors/sponsor-cart-tab/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-cart-tab/index.js @@ -13,12 +13,13 @@ import React, { useState } from "react"; import { Box } from "@mui/material"; +import { connect } from "react-redux"; import SelectFormDialog from "./components/select-form-dialog"; import CartView from "./components/cart-view"; import NewCartForm from "./components/edit-form/new-cart-form"; import EditCartForm from "./components/edit-form/edit-cart-form"; -const SponsorCartTab = ({ sponsor, summitId }) => { +const SponsorCartTab = ({ sponsor, currentSummit }) => { const [openAddFormDialog, setOpenAddFormDialog] = useState(false); const [formEdit, setFormEdit] = useState(null); const [newForm, setNewForm] = useState(null); @@ -64,7 +65,7 @@ const SponsorCartTab = ({ sponsor, summitId }) => { )} setOpenAddFormDialog(false)} @@ -73,4 +74,9 @@ const SponsorCartTab = ({ sponsor, summitId }) => { ); }; -export default SponsorCartTab; +const mapStateToProps = ({ currentSummitState, currentSponsorState }) => ({ + currentSummit: currentSummitState.currentSummit, + sponsor: currentSponsorState.entity +}); + +export default connect(mapStateToProps, {})(SponsorCartTab); diff --git a/src/pages/sponsors/sponsor-forms-tab/components/add-sponsor-form-template-popup/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/add-sponsor-form-template-popup/index.js similarity index 93% rename from src/pages/sponsors/sponsor-forms-tab/components/add-sponsor-form-template-popup/index.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/add-sponsor-form-template-popup/index.js index 72f84a2bc..1da86aaba 100644 --- a/src/pages/sponsors/sponsor-forms-tab/components/add-sponsor-form-template-popup/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/add-sponsor-form-template-popup/index.js @@ -21,12 +21,12 @@ import SwapVertIcon from "@mui/icons-material/SwapVert"; import SearchIcon from "@mui/icons-material/Search"; import CloseIcon from "@mui/icons-material/Close"; import { FormikProvider, useFormik } from "formik"; -import MuiTable from "../../../../../components/mui/table/mui-table"; -import MenuButton from "../../../../../components/mui/menu-button"; -import { querySponsorAddons } from "../../../../../actions/sponsor-actions"; -import { getSponsorForms } from "../../../../../actions/sponsor-forms-actions"; -import { FIVE_PER_PAGE } from "../../../../../utils/constants"; -import MuiFormikSelectGroup from "../../../../../components/mui/formik-inputs/mui-formik-select-group"; +import MuiTable from "../../../../../../../components/mui/table/mui-table"; +import MenuButton from "../../../../../../../components/mui/menu-button"; +import { querySponsorAddons } from "../../../../../../../actions/sponsor-actions"; +import { getSponsorForms } from "../../../../../../../actions/sponsor-forms-actions"; +import { FIVE_PER_PAGE } from "../../../../../../../utils/constants"; +import MuiFormikSelectGroup from "../../../../../../../components/mui/formik-inputs/mui-formik-select-group"; const AddSponsorFormTemplatePopup = ({ onClose, diff --git a/src/pages/sponsors/sponsor-forms-tab/components/customized-form/customized-form-popup.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/customized-form/customized-form-popup.js similarity index 97% rename from src/pages/sponsors/sponsor-forms-tab/components/customized-form/customized-form-popup.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/customized-form/customized-form-popup.js index 672da5a40..4731b8d98 100644 --- a/src/pages/sponsors/sponsor-forms-tab/components/customized-form/customized-form-popup.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/customized-form/customized-form-popup.js @@ -15,7 +15,7 @@ import { resetSponsorCustomizedForm, saveSponsorCustomizedForm, updateSponsorCustomizedForm -} from "../../../../../actions/sponsor-forms-actions"; +} from "../../../../../../../actions/sponsor-forms-actions"; import CustomizedForm from "./customized-form"; const CustomizedFormPopup = ({ diff --git a/src/pages/sponsors/sponsor-forms-tab/components/customized-form/customized-form.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/customized-form/customized-form.js similarity index 87% rename from src/pages/sponsors/sponsor-forms-tab/components/customized-form/customized-form.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/customized-form/customized-form.js index a94aad825..68e552b83 100644 --- a/src/pages/sponsors/sponsor-forms-tab/components/customized-form/customized-form.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/customized-form/customized-form.js @@ -18,14 +18,14 @@ import { formMetafieldsValidation, opensAtValidation, requiredStringValidation -} from "../../../../../utils/yup"; -import MuiFormikTextField from "../../../../../components/mui/formik-inputs/mui-formik-textfield"; -import MuiFormikDatepicker from "../../../../../components/mui/formik-inputs/mui-formik-datepicker"; -import AdditionalInputList from "../../../../../components/mui/formik-inputs/additional-input/additional-input-list"; -import useScrollToError from "../../../../../hooks/useScrollToError"; -import FormikTextEditor from "../../../../../components/inputs/formik-text-editor"; -import { querySponsorAddons } from "../../../../../actions/sponsor-actions"; -import MuiFormikSelectGroup from "../../../../../components/mui/formik-inputs/mui-formik-select-group"; +} from "../../../../../../../utils/yup"; +import MuiFormikTextField from "../../../../../../../components/mui/formik-inputs/mui-formik-textfield"; +import MuiFormikDatepicker from "../../../../../../../components/mui/formik-inputs/mui-formik-datepicker"; +import AdditionalInputList from "../../../../../../../components/mui/formik-inputs/additional-input/additional-input-list"; +import useScrollToError from "../../../../../../../hooks/useScrollToError"; +import FormikTextEditor from "../../../../../../../components/inputs/formik-text-editor"; +import { querySponsorAddons } from "../../../../../../../actions/sponsor-actions"; +import MuiFormikSelectGroup from "../../../../../../../components/mui/formik-inputs/mui-formik-select-group"; const buildInitialValues = (data, summitTZ) => { const { opens_at, expires_at } = data; diff --git a/src/pages/sponsors/sponsor-forms-tab/components/manage-items/sponsor-form-item-from-inventory.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-form-item-from-inventory.js similarity index 94% rename from src/pages/sponsors/sponsor-forms-tab/components/manage-items/sponsor-form-item-from-inventory.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-form-item-from-inventory.js index b60707291..dd6795e2b 100644 --- a/src/pages/sponsors/sponsor-forms-tab/components/manage-items/sponsor-form-item-from-inventory.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-form-item-from-inventory.js @@ -20,16 +20,16 @@ import { import CloseIcon from "@mui/icons-material/Close"; import ImageIcon from "@mui/icons-material/Image"; import SwapVertIcon from "@mui/icons-material/SwapVert"; -import { formatRateFromCents } from "../../../../../utils/rate-helpers"; -import SearchInput from "../../../../../components/mui/search-input"; +import { formatRateFromCents } from "../../../../../../../utils/rate-helpers"; +import SearchInput from "../../../../../../../components/mui/search-input"; import { DEFAULT_CURRENT_PAGE, DEFAULT_PER_PAGE -} from "../../../../../utils/constants"; +} from "../../../../../../../utils/constants"; -import { getInventoryItems } from "../../../../../actions/inventory-item-actions"; -import MuiTable from "../../../../../components/mui/table/mui-table"; -import MenuButton from "../../../../../components/mui/menu-button"; +import { getInventoryItems } from "../../../../../../../actions/inventory-item-actions"; +import MuiTable from "../../../../../../../components/mui/table/mui-table"; +import MenuButton from "../../../../../../../components/mui/menu-button"; const SponsorFormItemFromInventoryPopup = ({ inventoryItems, diff --git a/src/pages/sponsors/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 similarity index 89% rename from src/pages/sponsors/sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/components/manage-items/sponsor-forms-manage-items.js index 783112d06..4b57b69d6 100644 --- a/src/pages/sponsors/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 @@ -35,15 +35,19 @@ import { resetSponsorFormManagedItem, unarchiveSponsorCustomizedFormItem, getSponsorFormManagedItem -} from "../../../../../actions/sponsor-forms-actions"; -import CustomAlert from "../../../../../components/mui/custom-alert"; -import SearchInput from "../../../../../components/mui/search-input"; -import MuiTableEditable from "../../../../../components/mui/editable-table/mui-table-editable"; -import SponsorInventoryDialog from "../../../../sponsors-global/form-templates/sponsor-inventory-popup"; +} from "../../../../../../../actions/sponsor-forms-actions"; +import CustomAlert from "../../../../../../../components/mui/custom-alert"; +import SearchInput from "../../../../../../../components/mui/search-input"; +import MuiTableEditable from "../../../../../../../components/mui/editable-table/mui-table-editable"; +import SponsorInventoryDialog from "../../../../../../sponsors-global/form-templates/sponsor-inventory-popup"; import SponsorFormItemFromInventoryPopup from "./sponsor-form-item-from-inventory"; -import { DEFAULT_CURRENT_PAGE } from "../../../../../utils/constants"; -import { rateCellValidation } from "../../../../../utils/yup"; -import { rateToCents } from "../../../../../utils/rate-helpers"; +import { + ACCESS_ROUTES, + DEFAULT_CURRENT_PAGE +} from "../../../../../../../utils/constants"; +import { rateCellValidation } from "../../../../../../../utils/yup"; +import { rateToCents } from "../../../../../../../utils/rate-helpers"; +import Restrict from "../../../../../../../routes/restrict"; const SponsorFormsManageItems = ({ term, @@ -398,13 +402,16 @@ const mapStateToProps = ({ sponsorCustomizedFormItemsListState }) => ({ currentInventoryItem: sponsorCustomizedFormItemsListState.currentItem }); -export default connect(mapStateToProps, { - getSponsorCustomizedFormItems, - resetSponsorFormManagedItem, - addSponsorManagedFormItems, - saveSponsorFormManagedItem, - deleteSponsorFormManagedItem, - getSponsorFormManagedItem, - archiveSponsorCustomizedFormItem, - unarchiveSponsorCustomizedFormItem -})(SponsorFormsManageItems); +export default Restrict( + connect(mapStateToProps, { + getSponsorCustomizedFormItems, + resetSponsorFormManagedItem, + addSponsorManagedFormItems, + saveSponsorFormManagedItem, + deleteSponsorFormManagedItem, + getSponsorFormManagedItem, + archiveSponsorCustomizedFormItem, + unarchiveSponsorCustomizedFormItem + })(SponsorFormsManageItems), + ACCESS_ROUTES.ADMIN_SPONSORS +); diff --git a/src/pages/sponsors/sponsor-forms-tab/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/index.js similarity index 93% rename from src/pages/sponsors/sponsor-forms-tab/index.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/index.js index aa62f1b1d..781b63b74 100644 --- a/src/pages/sponsors/sponsor-forms-tab/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-forms-tab/index.js @@ -31,13 +31,13 @@ import { getSponsorManagedForms, saveSponsorManagedForm, unarchiveSponsorCustomizedForm -} from "../../../actions/sponsor-forms-actions"; -import CustomAlert from "../../../components/mui/custom-alert"; -import SearchInput from "../../../components/mui/search-input"; -import MuiTable from "../../../components/mui/table/mui-table"; +} from "../../../../../actions/sponsor-forms-actions"; +import CustomAlert from "../../../../../components/mui/custom-alert"; +import SearchInput from "../../../../../components/mui/search-input"; +import MuiTable from "../../../../../components/mui/table/mui-table"; 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 { DEFAULT_CURRENT_PAGE } from "../../../../../utils/constants"; const SponsorFormsTab = ({ term, @@ -46,7 +46,7 @@ const SponsorFormsTab = ({ managedForms, customizedForms, sponsor, - summitId, + currentSummit, getSponsorManagedForms, getSponsorCustomizedForms, saveSponsorManagedForm, @@ -112,7 +112,7 @@ const SponsorFormsTab = ({ const handleCustomizedFormManageItems = (item) => { history.push( - `/app/summits/${summitId}/sponsors/${sponsor.id}/sponsor-forms/${item.id}/items#forms` + `/app/summits/${currentSummit.id}/sponsors/${sponsor.id}/forms/${item.id}/items` ); }; @@ -377,7 +377,7 @@ const SponsorFormsTab = ({ onClose={() => setOpenPopup(null)} onSubmit={handleSaveFormFromTemplate} sponsor={sponsor} - summitId={summitId} + summitId={currentSummit.id} /> )} @@ -386,14 +386,20 @@ const SponsorFormsTab = ({ open={!!customFormEdit} onClose={() => setCustomFormEdit(null)} sponsor={sponsor} - summitId={summitId} + summitId={currentSummit.id} /> ); }; -const mapStateToProps = ({ sponsorPageFormsListState }) => ({ - ...sponsorPageFormsListState +const mapStateToProps = ({ + sponsorPageFormsListState, + currentSummitState, + currentSponsorState +}) => ({ + ...sponsorPageFormsListState, + currentSummit: currentSummitState.currentSummit, + sponsor: currentSponsorState.entity }); export default connect(mapStateToProps, { diff --git a/src/components/forms/sponsor-general-form/add-extra-question-popup.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-extra-question-popup.js similarity index 97% rename from src/components/forms/sponsor-general-form/add-extra-question-popup.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-extra-question-popup.js index dea7b6733..cd798fd50 100644 --- a/src/components/forms/sponsor-general-form/add-extra-question-popup.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-extra-question-popup.js @@ -24,16 +24,16 @@ import InfoIcon from "@mui/icons-material/Info"; import AddIcon from "@mui/icons-material/Add"; import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; import DragIndicatorIcon from "@mui/icons-material/DragIndicator"; -import useScrollToError from "../../../hooks/useScrollToError"; -import MuiFormikTextField from "../../mui/formik-inputs/mui-formik-textfield"; -import MuiFormikSelect from "../../mui/formik-inputs/mui-formik-select"; -import FormikTextEditor from "../../inputs/formik-text-editor"; -import MuiFormikCheckbox from "../../mui/formik-inputs/mui-formik-checkbox"; -import DragAndDropList from "../../mui/dnd-list"; +import useScrollToError from "../../../../../hooks/useScrollToError"; +import MuiFormikTextField from "../../../../../components/mui/formik-inputs/mui-formik-textfield"; +import MuiFormikSelect from "../../../../../components/mui/formik-inputs/mui-formik-select"; +import FormikTextEditor from "../../../../../components/inputs/formik-text-editor"; +import MuiFormikCheckbox from "../../../../../components/mui/formik-inputs/mui-formik-checkbox"; +import DragAndDropList from "../../../../../components/mui/dnd-list"; import { deleteSponsorExtraQuestionValue, updateSponsorExtraQuestionValueOrder -} from "../../../actions/sponsor-actions"; +} from "../../../../../actions/sponsor-actions"; const AddSponsorExtraQuestionPopup = ({ entity: extraQuestion, diff --git a/src/components/forms/sponsor-general-form/add-tier-popup.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-tier-popup.js similarity index 93% rename from src/components/forms/sponsor-general-form/add-tier-popup.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-tier-popup.js index fb2fa39a0..fbf6d6d5d 100644 --- a/src/components/forms/sponsor-general-form/add-tier-popup.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/add-tier-popup.js @@ -19,9 +19,9 @@ import { import CloseIcon from "@mui/icons-material/Close"; -import useScrollToError from "../../../hooks/useScrollToError"; -import SponsorshipsBySummitSelectMUI from "../../mui/formik-inputs/sponsorship-summit-select-mui"; -import MuiFormikTextField from "../../mui/formik-inputs/mui-formik-textfield"; +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 formik = useFormik({ diff --git a/src/components/forms/sponsor-general-form/badge-scan-settings.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/badge-scan-settings.js similarity index 95% rename from src/components/forms/sponsor-general-form/badge-scan-settings.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/badge-scan-settings.js index ef00c54f9..fdd353f77 100644 --- a/src/components/forms/sponsor-general-form/badge-scan-settings.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/badge-scan-settings.js @@ -14,12 +14,12 @@ import React from "react"; import T from "i18n-react/dist/i18n-react"; import { Box, Divider, Grid2, Typography } from "@mui/material"; -import Member from "../../../models/member"; -import ChipSelectInput from "../../mui/chip-select-input"; +import Member from "../../../../../models/member"; +import ChipSelectInput from "../../../../../components/mui/chip-select-input"; import { denormalizeLeadReportSettings, renderOptions -} from "../../../models/lead-report-settings"; +} from "../../../../../models/lead-report-settings"; const BadgeScanSettings = ({ sponsor, diff --git a/src/components/forms/sponsor-general-form/extra-questions.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/extra-questions.js similarity index 97% rename from src/components/forms/sponsor-general-form/extra-questions.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/extra-questions.js index 19538785c..3a87529b2 100644 --- a/src/components/forms/sponsor-general-form/extra-questions.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/extra-questions.js @@ -15,8 +15,11 @@ import React, { useState, useEffect } from "react"; import T from "i18n-react/dist/i18n-react"; import { Box, Button, Divider, Grid2, Typography } from "@mui/material"; import AddIcon from "@mui/icons-material/Add"; -import MuiTableSortable from "../../mui/sortable-table/mui-table-sortable"; -import { DEFAULT_CURRENT_PAGE, MAX_PER_PAGE } from "../../../utils/constants"; +import MuiTableSortable from "../../../../../components/mui/sortable-table/mui-table-sortable"; +import { + DEFAULT_CURRENT_PAGE, + MAX_PER_PAGE +} from "../../../../../utils/constants"; import AddSponsorExtraQuestionPopup from "./add-extra-question-popup"; const SponsorExtraQuestions = ({ diff --git a/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/index.js new file mode 100644 index 000000000..dea556c59 --- /dev/null +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/index.js @@ -0,0 +1,125 @@ +/** + * Copyright 2025 OpenStack Foundation + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * */ + +import React from "react"; +import { connect } from "react-redux"; +import { Box } from "@mui/material"; +import SponsorHeader from "./sponsor-header"; +import Sponsorship from "./sponsorship"; +import BadgeScanSettings from "./badge-scan-settings"; +import SponsorExtraQuestions from "./extra-questions"; +import { + addTierToSponsor, + deleteExtraQuestion, + getSponsorExtraQuestion, + getSponsorLeadReportSettingsMeta, + getSponsorshipAddons, + getSponsorTiers, + removeAddonToSponsorship, + removeTierFromSponsor, + resetSponsorExtraQuestionForm, + saveAddonsToSponsorship, + saveSponsorExtraQuestion, + saveSponsorExtraQuestionValue, + setSelectedSponsorship, + updateExtraQuestionOrder, + upsertSponsorLeadReportSettings +} from "../../../../../actions/sponsor-actions"; + +const SponsorGeneralForm = ({ + sponsor, + member, + currentSummit, + getSponsorTiers, + addTierToSponsor, + removeTierFromSponsor, + getSponsorshipAddons, + setSelectedSponsorship, + saveAddonsToSponsorship, + removeAddonToSponsorship, + getSponsorLeadReportSettingsMeta, + upsertSponsorLeadReportSettings, + getSponsorExtraQuestion, + saveSponsorExtraQuestion, + saveSponsorExtraQuestionValue, + resetSponsorExtraQuestionForm, + deleteExtraQuestion, + updateExtraQuestionOrder +}) => { + const handleSponsorshipPaginate = (page, perPage, order, orderDir) => { + getSponsorTiers(sponsor.id, page, perPage, order, orderDir); + }; + + return ( + + + + + + + ); +}; + +const mapStateToProps = ({ + loggedUserState, + currentSummitState, + currentSponsorState +}) => ({ + currentSummit: currentSummitState.currentSummit, + member: loggedUserState.member, + sponsor: currentSponsorState.entity +}); + +export default connect(mapStateToProps, { + getSponsorLeadReportSettingsMeta, + getSponsorTiers, + addTierToSponsor, + removeTierFromSponsor, + getSponsorshipAddons, + saveAddonsToSponsorship, + removeAddonToSponsorship, + setSelectedSponsorship, + upsertSponsorLeadReportSettings, + getSponsorExtraQuestion, + saveSponsorExtraQuestion, + saveSponsorExtraQuestionValue, + resetSponsorExtraQuestionForm, + deleteExtraQuestion, + updateExtraQuestionOrder +})(SponsorGeneralForm); diff --git a/src/components/forms/sponsor-general-form/manage-tier-addons-popup.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/manage-tier-addons-popup.js similarity index 97% rename from src/components/forms/sponsor-general-form/manage-tier-addons-popup.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/manage-tier-addons-popup.js index be750f25e..64cf96836 100644 --- a/src/components/forms/sponsor-general-form/manage-tier-addons-popup.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/manage-tier-addons-popup.js @@ -22,9 +22,9 @@ import AddIcon from "@mui/icons-material/Add"; import DeleteIcon from "@mui/icons-material/Delete"; import EditIcon from "@mui/icons-material/Edit"; -import useScrollToError from "../../../hooks/useScrollToError"; -import MuiFormikTextField from "../../mui/formik-inputs/mui-formik-textfield"; -import MuiFormikSummitAddonSelect from "../../mui/formik-inputs/mui-formik-summit-addon-select"; +import useScrollToError from "../../../../../hooks/useScrollToError"; +import MuiFormikTextField from "../../../../../components/mui/formik-inputs/mui-formik-textfield"; +import MuiFormikSummitAddonSelect from "../../../../../components/mui/formik-inputs/mui-formik-summit-addon-select"; const ManageTierAddonsPopup = ({ sponsorship, diff --git a/src/components/forms/sponsor-general-form/sponsor-header.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/sponsor-header.js similarity index 100% rename from src/components/forms/sponsor-general-form/sponsor-header.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/sponsor-header.js diff --git a/src/components/forms/sponsor-general-form/sponsorship.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/sponsorship.js similarity index 97% rename from src/components/forms/sponsor-general-form/sponsorship.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/sponsorship.js index 0817b8c13..de2981ca3 100644 --- a/src/components/forms/sponsor-general-form/sponsorship.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-general-form/sponsorship.js @@ -15,11 +15,11 @@ import React, { useState } from "react"; import T from "i18n-react/dist/i18n-react"; import { Box, Button, Grid2, Typography } from "@mui/material"; import AddIcon from "@mui/icons-material/Add"; -import MuiTable from "../../mui/table/mui-table"; +import MuiTable from "../../../../../components/mui/table/mui-table"; import AddTierPopup from "./add-tier-popup"; import ManageTierAddonsPopup from "./manage-tier-addons-popup"; -import { DEFAULT_CURRENT_PAGE } from "../../../utils/constants"; -import Member from "../../../models/member"; +import { DEFAULT_CURRENT_PAGE } from "../../../../../utils/constants"; +import Member from "../../../../../models/member"; const Sponsorship = ({ sponsor, diff --git a/src/pages/sponsors/sponsor-media-upload-tab/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-media-upload-tab/index.js similarity index 95% rename from src/pages/sponsors/sponsor-media-upload-tab/index.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-media-upload-tab/index.js index db596e786..bc1e590df 100644 --- a/src/pages/sponsors/sponsor-media-upload-tab/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-media-upload-tab/index.js @@ -24,12 +24,12 @@ import { getSponsorMURequests, removeFileForSponsorMU, uploadFileForSponsorMU -} from "../../../actions/sponsor-mu-actions"; -import CustomAlert from "../../../components/mui/custom-alert"; -import MuiTable from "../../../components/mui/table/mui-table"; -import { SPONSOR_MEDIA_UPLOAD_STATUS } from "../../../utils/constants"; -import UploadDialog from "../../../components/upload-dialog"; -import showConfirmDialog from "../../../components/mui/showConfirmDialog"; +} from "../../../../../actions/sponsor-mu-actions"; +import CustomAlert from "../../../../../components/mui/custom-alert"; +import MuiTable from "../../../../../components/mui/table/mui-table"; +import { SPONSOR_MEDIA_UPLOAD_STATUS } from "../../../../../utils/constants"; +import UploadDialog from "../../../../../components/upload-dialog"; +import showConfirmDialog from "../../../../../components/mui/showConfirmDialog"; const SponsorMediaUploadTab = ({ sponsorRequests, diff --git a/src/pages/sponsors/sponsor-pages-tab/__tests__/sponsor-pages-tab.test.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/__tests__/sponsor-pages-tab.test.js similarity index 89% rename from src/pages/sponsors/sponsor-pages-tab/__tests__/sponsor-pages-tab.test.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/__tests__/sponsor-pages-tab.test.js index 27f9b9d39..28b4189b7 100644 --- a/src/pages/sponsors/sponsor-pages-tab/__tests__/sponsor-pages-tab.test.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/__tests__/sponsor-pages-tab.test.js @@ -2,13 +2,13 @@ import React from "react"; import userEvent from "@testing-library/user-event"; import { act, screen, waitFor } from "@testing-library/react"; import SponsorPagesTab from "../index"; -import { renderWithRedux } from "../../../../utils/test-utils"; -import { DEFAULT_STATE as sponsorPagesDefaultState } from "../../../../reducers/sponsors/sponsor-page-pages-list-reducer"; +import { renderWithRedux } from "../../../../../../utils/test-utils"; +import { DEFAULT_STATE as sponsorPagesDefaultState } from "../../../../../../reducers/sponsors/sponsor-page-pages-list-reducer"; import { getSponsorCustomizedPage, archiveCustomizedPage, unarchiveCustomizedPage -} from "../../../../actions/sponsor-pages-actions"; +} from "../../../../../../actions/sponsor-pages-actions"; // Mocks @@ -28,7 +28,7 @@ jest.mock( ); jest.mock( - "../../../sponsors-global/page-templates/page-template-popup", + "../../../../../sponsors-global/page-templates/page-template-popup", () => function MockPageTemplatePopup({ onClose, onSave, pageTemplate }) { return ( @@ -41,8 +41,8 @@ jest.mock( } ); -jest.mock("../../../../actions/sponsor-pages-actions", () => ({ - ...jest.requireActual("../../../../actions/sponsor-pages-actions"), +jest.mock("../../../../../../actions/sponsor-pages-actions", () => ({ + ...jest.requireActual("../../../../../../actions/sponsor-pages-actions"), getSponsorManagedPages: jest.fn(() => ({ type: "MOCK_ACTION" })), getSponsorCustomizedPages: jest.fn(() => ({ type: "MOCK_ACTION" })), getSponsorCustomizedPage: jest.fn( @@ -55,8 +55,8 @@ jest.mock("../../../../actions/sponsor-pages-actions", () => ({ unarchiveCustomizedPage: jest.fn(() => () => Promise.resolve()) })); -jest.mock("../../../../actions/sponsor-forms-actions", () => ({ - ...jest.requireActual("../../../../actions/sponsor-forms-actions"), +jest.mock("../../../../../../actions/sponsor-forms-actions", () => ({ + ...jest.requireActual("../../../../../../actions/sponsor-forms-actions"), getSponsorships: jest.fn(() => () => Promise.resolve()) })); @@ -77,6 +77,9 @@ const createCustomizedPage = (id, overrides = {}) => ({ }); const defaultState = { + loggedUserState: { + member: { groups: {} } + }, sponsorPagePagesListState: { ...sponsorPagesDefaultState, managedPages: { @@ -103,6 +106,10 @@ const defaultState = { id: 1, time_zone: { name: "UTC" } } + }, + currentSponsorState: { + entity: { id: 1, sponsorships_collection: { sponsorships: [] } }, + errors: {} } }; @@ -166,6 +173,7 @@ describe("SponsorPagesTab", () => { />, { initialState: { + ...defaultState, sponsorPagePagesListState: { ...defaultState.sponsorPagePagesListState, customizedPages: { @@ -192,7 +200,7 @@ describe("SponsorPagesTab", () => { it("should refresh customized pages list after save", async () => { const { getSponsorCustomizedPages - } = require("../../../../actions/sponsor-pages-actions"); + } = require("../../../../../../actions/sponsor-pages-actions"); renderWithRedux( { />, { initialState: { + ...defaultState, sponsorPagePagesListState: { ...defaultState.sponsorPagePagesListState, customizedPages: { @@ -242,6 +251,7 @@ describe("SponsorPagesTab", () => { , { initialState: { + ...defaultState, sponsorPagePagesListState: { ...defaultState.sponsorPagePagesListState, customizedPages: { @@ -267,6 +277,7 @@ describe("SponsorPagesTab", () => { , { initialState: { + ...defaultState, sponsorPagePagesListState: { ...defaultState.sponsorPagePagesListState, customizedPages: { diff --git a/src/pages/sponsors/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 similarity index 95% rename from src/pages/sponsors/sponsor-pages-tab/components/add-sponsor-page-template-popup/index.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/components/add-sponsor-page-template-popup/index.js index d839170ff..60a4d6da3 100644 --- a/src/pages/sponsors/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 @@ -35,15 +35,15 @@ import SearchIcon from "@mui/icons-material/Search"; import CloseIcon from "@mui/icons-material/Close"; import * as yup from "yup"; import { FormikProvider, useFormik } from "formik"; -import MuiTable from "../../../../../components/mui/table/mui-table"; -import MenuButton from "../../../../../components/mui/menu-button"; -import { querySponsorAddons } from "../../../../../actions/sponsor-actions"; -import { getShowPages } from "../../../../../actions/show-pages-actions"; +import MuiTable from "../../../../../../../components/mui/table/mui-table"; +import MenuButton from "../../../../../../../components/mui/menu-button"; +import { querySponsorAddons } from "../../../../../../../actions/sponsor-actions"; +import { getShowPages } from "../../../../../../../actions/show-pages-actions"; import { DEFAULT_CURRENT_PAGE, FIVE_PER_PAGE -} from "../../../../../utils/constants"; -import MuiFormikSelectGroup from "../../../../../components/mui/formik-inputs/mui-formik-select-group"; +} from "../../../../../../../utils/constants"; +import MuiFormikSelectGroup from "../../../../../../../components/mui/formik-inputs/mui-formik-select-group"; const AddSponsorPageTemplatePopup = ({ onClose, diff --git a/src/pages/sponsors/sponsor-pages-tab/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/index.js similarity index 93% rename from src/pages/sponsors/sponsor-pages-tab/index.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/index.js index cc362d9f7..7d2fdf266 100644 --- a/src/pages/sponsors/sponsor-pages-tab/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-pages-tab/index.js @@ -24,29 +24,29 @@ import { } from "@mui/material"; import AddIcon from "@mui/icons-material/Add"; import { - getSponsorManagedPages, + archiveCustomizedPage, + deleteSponsorManagedPage, + getSponsorCustomizedPage, getSponsorCustomizedPages, - saveSponsorManagedPage, + getSponsorManagedPages, + resetSponsorPage, saveSponsorCustomizedPage, - getSponsorCustomizedPage, - deleteSponsorManagedPage, - unarchiveCustomizedPage, - archiveCustomizedPage, - resetSponsorPage -} from "../../../actions/sponsor-pages-actions"; -import CustomAlert from "../../../components/mui/custom-alert"; -import SearchInput from "../../../components/mui/search-input"; -import MuiTable from "../../../components/mui/table/mui-table"; + saveSponsorManagedPage, + unarchiveCustomizedPage +} from "../../../../../actions/sponsor-pages-actions"; +import CustomAlert from "../../../../../components/mui/custom-alert"; +import SearchInput from "../../../../../components/mui/search-input"; +import MuiTable from "../../../../../components/mui/table/mui-table"; import { DEFAULT_CURRENT_PAGE, SPONSOR_MANAGED_PAGE_ASSIGNMENT -} from "../../../utils/constants"; +} from "../../../../../utils/constants"; import AddSponsorPageTemplatePopup from "./components/add-sponsor-page-template-popup"; -import PageTemplatePopup from "../../sponsors-global/page-templates/page-template-popup"; +import PageTemplatePopup from "../../../../sponsors-global/page-templates/page-template-popup"; const SponsorPagesTab = ({ sponsor, - summitId, + currentSummit, term, hideArchived, managedPages, @@ -438,7 +438,7 @@ const SponsorPagesTab = ({ {openPopup === "usingTemplate" && ( setOpenPopup(null)} /> @@ -450,7 +450,7 @@ const SponsorPagesTab = ({ onClose={handleClosePagePopup} pageTemplate={currentEditPage} sponsorshipIds={sponsorshipIds} - summitId={summitId} + summitId={currentSummit.id} sponsorId={sponsor.id} summitTZ={summitTZ} /> @@ -459,8 +459,14 @@ const SponsorPagesTab = ({ ); }; -const mapStateToProps = ({ sponsorPagePagesListState }) => ({ - ...sponsorPagePagesListState +const mapStateToProps = ({ + sponsorPagePagesListState, + currentSummitState, + currentSponsorState +}) => ({ + ...sponsorPagePagesListState, + currentSummit: currentSummitState.currentSummit, + sponsor: currentSponsorState.entity }); export default connect(mapStateToProps, { diff --git a/src/pages/sponsors/sponsor-purchases-tab/index.js b/src/pages/sponsors/sponsor-page/tabs/sponsor-purchases-tab/index.js similarity index 94% rename from src/pages/sponsors/sponsor-purchases-tab/index.js rename to src/pages/sponsors/sponsor-page/tabs/sponsor-purchases-tab/index.js index e3cbc28df..35346d893 100644 --- a/src/pages/sponsors/sponsor-purchases-tab/index.js +++ b/src/pages/sponsors/sponsor-page/tabs/sponsor-purchases-tab/index.js @@ -23,13 +23,13 @@ import { Select } from "@mui/material"; import MenuIcon from "@mui/icons-material/Menu"; -import { getSponsorPurchases } from "../../../actions/sponsor-purchases-actions"; -import SearchInput from "../../../components/mui/search-input"; -import MuiTable from "../../../components/mui/table/mui-table"; +import { getSponsorPurchases } from "../../../../../actions/sponsor-purchases-actions"; +import SearchInput from "../../../../../components/mui/search-input"; +import MuiTable from "../../../../../components/mui/table/mui-table"; import { DEFAULT_CURRENT_PAGE, PURCHASE_STATUS -} from "../../../utils/constants"; +} from "../../../../../utils/constants"; const SponsorPurchasesTab = ({ purchases, diff --git a/src/pages/sponsors/sponsor-users-list-per-sponsor/index.js b/src/pages/sponsors/sponsor-users-list-per-sponsor/index.js index b590676f9..e151c946d 100644 --- a/src/pages/sponsors/sponsor-users-list-per-sponsor/index.js +++ b/src/pages/sponsors/sponsor-users-list-per-sponsor/index.js @@ -42,11 +42,13 @@ const SponsorUsersListPerSponsorPage = ({ }) => { const [openPopup, setOpenPopup] = useState(null); const [userEdit, setUserEdit] = useState(null); + const sponsorId = sponsor?.id; + const companyId = sponsor?.company?.id; useEffect(() => { - getSponsorUserRequests(sponsor.company.id); - getSponsorUsers(sponsor.id); - }, []); + if (companyId) getSponsorUserRequests(companyId); + if (sponsorId) getSponsorUsers(sponsorId); + }, [sponsorId, companyId]); const handleSearch = (searchTerm) => { getSponsorUsers(sponsor.id, searchTerm); @@ -158,8 +160,9 @@ const SponsorUsersListPerSponsorPage = ({ ); }; -const mapStateToProps = ({ sponsorUsersListState }) => ({ - ...sponsorUsersListState +const mapStateToProps = ({ sponsorUsersListState, currentSponsorState }) => ({ + ...sponsorUsersListState, + sponsor: currentSponsorState.entity }); export default connect(mapStateToProps, {