diff --git a/src/actions/sponsor-pages-actions.js b/src/actions/sponsor-pages-actions.js index 13667ace3..eb2a89df6 100644 --- a/src/actions/sponsor-pages-actions.js +++ b/src/actions/sponsor-pages-actions.js @@ -15,21 +15,24 @@ import { createAction, getRequest, postRequest, + putRequest, startLoading, stopLoading, - authErrorHandler, escapeFilterValue } from "openstack-uicore-foundation/lib/utils/actions"; import T from "i18n-react/dist/i18n-react"; +import moment from "moment-timezone"; import { getAccessTokenSafely } from "../utils/methods"; import { snackbarErrorHandler, snackbarSuccessHandler } from "./base-actions"; import { DEFAULT_CURRENT_PAGE, DEFAULT_ORDER_DIR, - DEFAULT_PER_PAGE + DEFAULT_PER_PAGE, + PAGES_MODULE_KINDS } from "../utils/constants"; export const GLOBAL_PAGE_CLONED = "GLOBAL_PAGE_CLONED"; +export const RESET_EDIT_PAGE = "RESET_EDIT_PAGE"; export const REQUEST_SPONSOR_MANAGED_PAGES = "REQUEST_SPONSOR_MANAGED_PAGES"; export const RECEIVE_SPONSOR_MANAGED_PAGES = "RECEIVE_SPONSOR_MANAGED_PAGES"; @@ -39,6 +42,11 @@ export const REQUEST_SPONSOR_CUSTOMIZED_PAGES = "REQUEST_SPONSOR_CUSTOMIZED_PAGES"; export const RECEIVE_SPONSOR_CUSTOMIZED_PAGES = "RECEIVE_SPONSOR_CUSTOMIZED_PAGES"; +export const RECEIVE_SPONSOR_CUSTOMIZED_PAGE = + "RECEIVE_SPONSOR_CUSTOMIZED_PAGE"; +export const SPONSOR_CUSTOMIZED_PAGE_ADDED = "SPONSOR_CUSTOMIZED_PAGE_ADDED"; +export const SPONSOR_CUSTOMIZED_PAGE_UPDATED = + "SPONSOR_CUSTOMIZED_PAGE_UPDATED"; export const cloneGlobalPage = (pagesIds, sponsorIds, allSponsors) => async (dispatch, getState) => { @@ -80,6 +88,10 @@ export const cloneGlobalPage = .finally(() => dispatch(stopLoading())); }; +export const resetSponsorPage = () => (dispatch) => { + dispatch(createAction(RESET_EDIT_PAGE)({})); +}; + /* ************************************************************************ */ /* MANAGED PAGES */ /* ************************************************************************ */ @@ -133,7 +145,7 @@ export const getSponsorManagedPages = createAction(REQUEST_SPONSOR_MANAGED_PAGES), createAction(RECEIVE_SPONSOR_MANAGED_PAGES), `${window.SPONSOR_PAGES_API_URL}/api/v1/summits/${currentSummit.id}/sponsors/${sponsorId}/managed-pages`, - authErrorHandler, + snackbarErrorHandler, { order, orderDir, page, perPage, term, hideArchived, summitTZ } )(params)(dispatch).then(() => { dispatch(stopLoading()); @@ -215,7 +227,9 @@ export const getSponsorCustomizedPages = const params = { page, - fields: "id,code,name,kind,modules_count,allowed_add_ons", + fields: + "id,code,name,allowed_add_ons,is_archived,modules,allowed_add_ons.type,allowed_add_ons.name,allowed_add_ons.id", + expand: "allowed_add_ons", per_page: perPage, access_token: accessToken }; @@ -236,9 +250,134 @@ export const getSponsorCustomizedPages = createAction(REQUEST_SPONSOR_CUSTOMIZED_PAGES), createAction(RECEIVE_SPONSOR_CUSTOMIZED_PAGES), `${window.SPONSOR_PAGES_API_URL}/api/v1/summits/${currentSummit.id}/sponsors/${sponsorId}/sponsor-pages`, - authErrorHandler, + snackbarErrorHandler, { order, orderDir, page, perPage, term, hideArchived, summitTZ } )(params)(dispatch).then(() => { dispatch(stopLoading()); }); }; + +export const getSponsorCustomizedPage = + (pageId) => async (dispatch, getState) => { + const { currentSummitState, currentSponsorState } = getState(); + const { currentSummit } = currentSummitState; + const { + entity: { id: sponsorId } + } = currentSponsorState; + const accessToken = await getAccessTokenSafely(); + + dispatch(startLoading()); + + const params = { + fields: + "id,code,name,allowed_add_ons,is_archived,modules,allowed_add_ons.name,allowed_add_ons.id", + expand: "allowed_add_ons", + access_token: accessToken + }; + + return getRequest( + null, + createAction(RECEIVE_SPONSOR_CUSTOMIZED_PAGE), + `${window.SPONSOR_PAGES_API_URL}/api/v1/summits/${currentSummit.id}/sponsors/${sponsorId}/sponsor-pages/${pageId}`, + snackbarErrorHandler + )(params)(dispatch).then(() => { + dispatch(stopLoading()); + }); + }; + +export const saveSponsorCustomizedPage = + (entity) => async (dispatch, getState) => { + const { currentSummitState, currentSponsorState } = getState(); + const { currentSummit } = currentSummitState; + const { + entity: { id: sponsorId } + } = currentSponsorState; + const summitTZ = currentSummit.time_zone.name; + const accessToken = await getAccessTokenSafely(); + + dispatch(startLoading()); + + const normalizedEntity = normalizeSponsorCustomPage(entity, summitTZ); + + const params = { + access_token: accessToken, + fields: "id,code,name,kind,modules_count,allowed_add_ons" + }; + + if (entity.id) { + return putRequest( + null, + createAction(SPONSOR_CUSTOMIZED_PAGE_UPDATED), + `${window.SPONSOR_PAGES_API_URL}/api/v1/summits/${currentSummit.id}/sponsors/${sponsorId}/sponsor-pages/${entity.id}`, + normalizedEntity, + snackbarErrorHandler, + entity + )(params)(dispatch) + .then(() => { + dispatch( + snackbarSuccessHandler({ + title: T.translate("general.success"), + html: T.translate("edit_sponsor.pages_tab.custom_page_saved") + }) + ); + }) + .finally(() => { + dispatch(stopLoading()); + }); + } + + return postRequest( + null, + createAction(SPONSOR_CUSTOMIZED_PAGE_ADDED), + `${window.SPONSOR_PAGES_API_URL}/api/v1/summits/${currentSummit.id}/sponsors/${sponsorId}/sponsor-pages`, + normalizedEntity, + snackbarErrorHandler + )(params)(dispatch).then(() => { + dispatch(stopLoading()); + dispatch( + snackbarSuccessHandler({ + title: T.translate("general.success"), + html: T.translate("edit_sponsor.pages_tab.custom_page_created") + }) + ); + }); + }; + +const normalizeSponsorCustomPage = (entity, summitTZ) => { + const normalizedEntity = { + ...entity, + apply_to_all_add_ons: false + }; + + if (entity.allowed_add_ons.includes("all")) { + normalizedEntity.apply_to_all_add_ons = true; + normalizedEntity.allowed_add_ons = []; + } else { + normalizedEntity.allowed_add_ons = entity.allowed_add_ons.map((e) => e.id); + } + + normalizedEntity.modules = entity.modules.map((module) => { + const normalizedModule = { ...module }; + + if (module.kind === PAGES_MODULE_KINDS.MEDIA && module.upload_deadline) { + normalizedModule.upload_deadline = moment + .tz(module.upload_deadline, summitTZ) + .unix(); + } + + if (module.kind === PAGES_MODULE_KINDS.MEDIA && module.file_type_id) { + normalizedModule.file_type_id = + module.file_type_id?.value || module.file_type_id; + } + + if (module.kind === PAGES_MODULE_KINDS.DOCUMENT && module.file) { + normalizedModule.file = module.file[0] || null; + } + + delete normalizedModule._tempId; + + return normalizedModule; + }); + + return normalizedEntity; +}; diff --git a/src/components/inputs/formik-text-editor.js b/src/components/inputs/formik-text-editor.js index 0e2ce7527..20ee5a20b 100644 --- a/src/components/inputs/formik-text-editor.js +++ b/src/components/inputs/formik-text-editor.js @@ -1,23 +1,22 @@ import React from "react"; import TextEditorV3 from "openstack-uicore-foundation/lib/components/inputs/editor-input-v3"; -import { useFormikContext } from "formik"; +import { useField } from "formik"; import normalizeHtmlString from "../../utils/normalize-html-string"; const FormikTextEditor = ({ name, ...props }) => { - const { values, errors, touched, setFieldValue, setFieldTouched } = - useFormikContext(); + const [field, meta, helpers] = useField(name); return ( { const stringValue = normalizeHtmlString(e.target.value); - setFieldValue(name, stringValue); + helpers.setValue(stringValue); }} - onBlur={() => setFieldTouched(name, true)} - error={touched?.[name] && errors?.[name] ? errors?.[name] : ""} + onBlur={() => helpers.setTouched(true)} + error={meta.touched && meta.error ? meta.error : ""} license={process.env.JODIT_LICENSE_KEY} {...props} /> diff --git a/src/components/mui/dropdown-checkbox.js b/src/components/mui/dropdown-checkbox.js index 00b6ff461..2f7fdc1ae 100644 --- a/src/components/mui/dropdown-checkbox.js +++ b/src/components/mui/dropdown-checkbox.js @@ -38,7 +38,7 @@ const DropdownCheckbox = ({ }; return ( - + {label}