From e0ede60cdcef2df0fe0c36c9f04ed6a2e012339c Mon Sep 17 00:00:00 2001 From: Santiago Palenque Date: Wed, 4 Mar 2026 18:46:57 -0300 Subject: [PATCH 1/3] fix: page template popup --- src/actions/page-template-actions.js | 31 +++++----- src/actions/show-pages-actions.js | 2 +- .../mui-formik-file-size-field.js | 22 +++---- .../page-templates/page-template-list-page.js | 34 +++++++---- .../page-template-popup/index.js | 58 ++----------------- .../sponsors/show-pages-list-page/index.js | 9 ++- .../sponsors/show-pages-list-reducer.js | 22 ++++++- .../page-template-list-reducer.js | 3 +- 8 files changed, 86 insertions(+), 95 deletions(-) diff --git a/src/actions/page-template-actions.js b/src/actions/page-template-actions.js index f008bb15d..3340525b2 100644 --- a/src/actions/page-template-actions.js +++ b/src/actions/page-template-actions.js @@ -30,6 +30,7 @@ import { DEFAULT_ORDER_DIR, DEFAULT_PER_PAGE, PAGE_MODULES_DOWNLOAD, + PAGE_MODULES_MEDIA_TYPES, PAGES_MODULE_KINDS } from "../utils/constants"; import { snackbarErrorHandler, snackbarSuccessHandler } from "./base-actions"; @@ -56,10 +57,7 @@ export const getPageTemplates = orderDir = DEFAULT_ORDER_DIR, hideArchived = false ) => - async (dispatch, getState) => { - const { currentSummitState } = getState(); - const { currentSummit } = currentSummitState; - const summitTZ = currentSummit.time_zone?.name; + async (dispatch) => { const accessToken = await getAccessTokenSafely(); const filter = []; @@ -97,7 +95,7 @@ export const getPageTemplates = createAction(RECEIVE_PAGE_TEMPLATES), `${window.SPONSOR_PAGES_API_URL}/api/v1/page-templates`, authErrorHandler, - { order, orderDir, page, perPage, term, hideArchived, summitTZ } + { order, orderDir, page, perPage, term, hideArchived } )(params)(dispatch).then(() => { dispatch(stopLoading()); }); @@ -153,15 +151,22 @@ const normalizeEntity = (entity) => { normalizedEntity.modules = entity.modules.map((module) => { const normalizedModule = { ...module }; - if (module.kind === PAGES_MODULE_KINDS.MEDIA && module.upload_deadline) { - normalizedModule.upload_deadline = moment - .utc(module.upload_deadline) - .unix(); - } + if (module.kind === PAGES_MODULE_KINDS.MEDIA) { + if (module.upload_deadline) { + normalizedModule.upload_deadline = moment + .utc(module.upload_deadline) + .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.file_type_id) { + normalizedModule.file_type_id = + module.file_type_id?.value || module.file_type_id; + } + + if (module.type === PAGE_MODULES_MEDIA_TYPES.INPUT) { + delete normalizedModule.file_type_id; + delete normalizedModule.max_file_size; + } } if (module.kind === PAGES_MODULE_KINDS.DOCUMENT) { diff --git a/src/actions/show-pages-actions.js b/src/actions/show-pages-actions.js index 05b90ee28..4c7333767 100644 --- a/src/actions/show-pages-actions.js +++ b/src/actions/show-pages-actions.js @@ -113,7 +113,7 @@ export const getShowPage = (pageId) => async (dispatch, getState) => { const params = { access_token: accessToken, - expand: "modules,modules.file_type" + expand: "modules" }; return getRequest( diff --git a/src/components/mui/formik-inputs/mui-formik-file-size-field.js b/src/components/mui/formik-inputs/mui-formik-file-size-field.js index e6025bb6c..47215561c 100644 --- a/src/components/mui/formik-inputs/mui-formik-file-size-field.js +++ b/src/components/mui/formik-inputs/mui-formik-file-size-field.js @@ -1,22 +1,23 @@ -import React from "react"; +import React, { useState } from "react"; import PropTypes from "prop-types"; import { InputAdornment } from "@mui/material"; import { useField } from "formik"; import MuiFormikTextField from "./mui-formik-textfield"; -import { BYTES_PER_MB } from "../../../utils/constants"; +import { BYTES_PER_MB, DECIMAL_DIGITS } from "../../../utils/constants"; const BLOCKED_KEYS = ["e", "E", "+", "-", ".", ","]; const MuiFormikFilesizeField = ({ name, label, ...props }) => { const [field, meta, helpers] = useField(name); - - const displayValue = - field.value != null ? Math.floor(field.value / BYTES_PER_MB) : 0; - + const initialValue = + field.value != null + ? (field.value / BYTES_PER_MB).toFixed(DECIMAL_DIGITS) + : 0; + const [val, setVal] = useState(initialValue); const emptyValue = meta.initialValue === null ? null : 0; - const handleChange = (e) => { - const mbValue = e.target.value; + const handleChange = () => { + const mbValue = val; if (mbValue === "") { helpers.setValue(emptyValue); @@ -32,8 +33,9 @@ const MuiFormikFilesizeField = ({ name, label, ...props }) => { name={name} label={label} type="number" - value={displayValue} - onChange={handleChange} + value={val} + onChange={(ev) => setVal(ev.target.value)} + onBlur={handleChange} slotProps={{ input: { endAdornment: MB 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 7e17f757d..69d128c21 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 @@ -30,7 +30,8 @@ import { getPageTemplates, getPageTemplate, savePageTemplate, - unarchivePageTemplate + unarchivePageTemplate, + resetPageTemplateForm } from "../../../actions/page-template-actions"; import MuiTable from "../../../components/mui/table/mui-table"; import SearchInput from "../../../components/mui/search-input"; @@ -40,6 +41,7 @@ import PageTemplateClonePopup from "./page-template-clone-popup"; const PageTemplateListPage = ({ pageTemplates, + pageTemplate, currentPage, perPage, term, @@ -53,9 +55,9 @@ const PageTemplateListPage = ({ unarchivePageTemplate, savePageTemplate, deletePageTemplate, - summitTZ + resetPageTemplateForm }) => { - const [pageTemplateId, setPageTemplateId] = useState(null); + const [openPageDialog, setOpenPageDialog] = useState(false); const [openCloneDialog, setOpenCloneDialog] = useState(false); useEffect(() => { @@ -104,7 +106,8 @@ const PageTemplateListPage = ({ }; const handleNewPageTemplate = () => { - setPageTemplateId("new"); + resetPageTemplateForm(); + setOpenPageDialog(true); }; const handleClonePageTemplate = () => { @@ -112,7 +115,7 @@ const PageTemplateListPage = ({ }; const handleSavePageTemplate = (entity) => { - savePageTemplate(entity).then(() => setPageTemplateId(null)); + savePageTemplate(entity).then(() => setOpenPageDialog(false)); }; const handleArchive = (item) => @@ -121,7 +124,7 @@ const PageTemplateListPage = ({ : archivePageTemplate(item.id); const handleEdit = (row) => { - getPageTemplate(row.id).then(() => setPageTemplateId(row.id)); + getPageTemplate(row.id).then(() => setOpenPageDialog(true)); }; const handleDelete = (row) => { @@ -137,6 +140,11 @@ const PageTemplateListPage = ({ ); }; + const handleClosePageDialog = () => { + resetPageTemplateForm(); + setOpenPageDialog(false); + }; + const columns = [ { columnKey: "code", @@ -268,10 +276,10 @@ const PageTemplateListPage = ({ )} setPageTemplateId(null)} + open={openPageDialog} + pageTemplate={pageTemplate} + onClose={handleClosePageDialog} onSave={handleSavePageTemplate} - summitTZ={summitTZ} /> ({ - ...pageTemplateListState +const mapStateToProps = ({ pageTemplateListState, pageTemplateState }) => ({ + ...pageTemplateListState, + pageTemplate: pageTemplateState.entity }); export default connect(mapStateToProps, { @@ -291,5 +300,6 @@ export default connect(mapStateToProps, { archivePageTemplate, unarchivePageTemplate, savePageTemplate, - deletePageTemplate + deletePageTemplate, + resetPageTemplateForm })(PageTemplateListPage); diff --git a/src/pages/sponsors-global/page-templates/page-template-popup/index.js b/src/pages/sponsors-global/page-templates/page-template-popup/index.js index 506151bbc..faa6a89b5 100644 --- a/src/pages/sponsors-global/page-templates/page-template-popup/index.js +++ b/src/pages/sponsors-global/page-templates/page-template-popup/index.js @@ -1,6 +1,5 @@ import React from "react"; import T from "i18n-react/dist/i18n-react"; -import { connect } from "react-redux"; import PropTypes from "prop-types"; import { Box, @@ -18,10 +17,8 @@ import AddIcon from "@mui/icons-material/Add"; import CloseIcon from "@mui/icons-material/Close"; import { FormikProvider, useFormik } from "formik"; import * as yup from "yup"; -import { epochToMomentTimeZone } from "openstack-uicore-foundation/lib/utils/methods"; import MuiFormikTextField from "../../../../components/mui/formik-inputs/mui-formik-textfield"; import PageModules from "./page-template-modules-form"; -import { resetPageTemplateForm } from "../../../../actions/page-template-actions"; import { BYTES_PER_MB, PAGES_MODULE_KINDS, @@ -29,40 +26,7 @@ import { PAGE_MODULES_DOWNLOAD } from "../../../../utils/constants"; -const normalizeModules = (modules = [], summitTZ = "UTC") => - modules.map((m) => { - if (m.kind === PAGES_MODULE_KINDS.MEDIA) { - const normalizeModule = { ...m }; - if (m.upload_deadline) { - normalizeModule.upload_deadline = epochToMomentTimeZone( - m.upload_deadline, - summitTZ - ); - } - if (m.file_type) { - normalizeModule.file_type_id = { - value: m.file_type.id, - label: `${m.file_type.name} (${m.file_type.allowed_extensions})` - }; - } - return normalizeModule; - } - return m; - }); - -const PageTemplatePopup = ({ - pageTemplate, - open, - onClose, - onSave, - summitTZ, - resetPageTemplateForm -}) => { - const handleClose = () => { - resetPageTemplateForm(); - onClose(); - }; - +const PageTemplatePopup = ({ pageTemplate, open, onClose, onSave }) => { const addModule = (moduleData) => { const modules = formik.values.modules || []; const newModule = { @@ -163,10 +127,7 @@ const PageTemplatePopup = ({ }); const formik = useFormik({ - initialValues: { - ...pageTemplate, - modules: normalizeModules(pageTemplate?.modules, summitTZ) || [] - }, + initialValues: pageTemplate, validationSchema: yup.object().shape({ code: yup.string().required(T.translate("validation.required")), name: yup.string().required(T.translate("validation.required")), @@ -184,12 +145,12 @@ const PageTemplatePopup = ({ }); return ( - + {T.translate("page_template_list.page_crud.title")} - handleClose()} sx={{ mr: 1 }}> + @@ -271,14 +232,7 @@ const PageTemplatePopup = ({ PageTemplatePopup.propTypes = { open: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, - onSave: PropTypes.func.isRequired, - summitTZ: PropTypes.string.isRequired + onSave: PropTypes.func.isRequired }; -const mapStateToProps = ({ pageTemplateState }) => ({ - pageTemplate: pageTemplateState.entity -}); - -export default connect(mapStateToProps, { - resetPageTemplateForm -})(PageTemplatePopup); +export default PageTemplatePopup; diff --git a/src/pages/sponsors/show-pages-list-page/index.js b/src/pages/sponsors/show-pages-list-page/index.js index 47b100a4c..7fb7c55fa 100644 --- a/src/pages/sponsors/show-pages-list-page/index.js +++ b/src/pages/sponsors/show-pages-list-page/index.js @@ -47,7 +47,6 @@ const ShowPagesListPage = ({ orderDir, hideArchived, totalCount, - summitTZ, currentShowPage, getShowPages, archiveShowPage, @@ -120,6 +119,11 @@ const ShowPagesListPage = ({ setOpenPopup(null); }; + const handleNewShowPage = () => { + resetShowPageForm(); + setOpenPopup("pageTemplate"); + }; + const columns = [ { columnKey: "code", @@ -207,7 +211,7 @@ const ShowPagesListPage = ({ variant="contained" size="medium" fullWidth - onClick={() => setOpenPopup("pageTemplate")} + onClick={handleNewShowPage} startIcon={} sx={{ height: "36px" }} > @@ -248,7 +252,6 @@ const ShowPagesListPage = ({ pageTemplate={currentShowPage} onClose={handleTemplatePopupClose} onSave={handleSaveShowPage} - summitTZ={summitTZ} /> ); diff --git a/src/reducers/sponsors/show-pages-list-reducer.js b/src/reducers/sponsors/show-pages-list-reducer.js index 8e244d437..701858fbf 100644 --- a/src/reducers/sponsors/show-pages-list-reducer.js +++ b/src/reducers/sponsors/show-pages-list-reducer.js @@ -12,6 +12,7 @@ * */ import { LOGOUT_USER } from "openstack-uicore-foundation/lib/security/actions"; +import { epochToMomentTimeZone } from "openstack-uicore-foundation/lib/utils/methods"; import { RECEIVE_SHOW_PAGE, RECEIVE_SHOW_PAGES, @@ -23,6 +24,8 @@ import { } from "../../actions/show-pages-actions"; import { SET_CURRENT_SUMMIT } from "../../actions/summit-actions"; + + const DEFAULT_SHOW_PAGE = { code: "", name: "", @@ -114,9 +117,24 @@ const showPagesListReducer = (state = DEFAULT_STATE, action) => { }; } case RECEIVE_SHOW_PAGE: { - const showPage = payload.response; + const pageData = payload.response; + + const currentShowPage = { + ...pageData, + modules: pageData.modules.map((m) => ({ + ...m, + ...(m.upload_deadline + ? { + upload_deadline: epochToMomentTimeZone( + m.upload_deadline, + state.summitTZ + ) + } + : {}) + })) + }; - return { ...state, currentShowPage: showPage }; + return { ...state, currentShowPage }; } case SHOW_PAGE_DELETED: { const { pageId } = payload; diff --git a/src/reducers/sponsors_inventory/page-template-list-reducer.js b/src/reducers/sponsors_inventory/page-template-list-reducer.js index f62e32403..15a4f0ee1 100644 --- a/src/reducers/sponsors_inventory/page-template-list-reducer.js +++ b/src/reducers/sponsors_inventory/page-template-list-reducer.js @@ -30,8 +30,7 @@ const DEFAULT_STATE = { lastPage: 1, perPage: 10, totalPageTemplates: 0, - hideArchived: false, - summitTZ: null + hideArchived: false }; const pageTemplateListReducer = (state = DEFAULT_STATE, action = {}) => { From 889f42823921142000557dcdcad9e14238ce140b Mon Sep 17 00:00:00 2001 From: Santiago Palenque Date: Thu, 5 Mar 2026 11:15:28 -0300 Subject: [PATCH 2/3] fix: revert file size input changes --- .../mui-formik-file-size-field.js | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/components/mui/formik-inputs/mui-formik-file-size-field.js b/src/components/mui/formik-inputs/mui-formik-file-size-field.js index 47215561c..e6025bb6c 100644 --- a/src/components/mui/formik-inputs/mui-formik-file-size-field.js +++ b/src/components/mui/formik-inputs/mui-formik-file-size-field.js @@ -1,23 +1,22 @@ -import React, { useState } from "react"; +import React from "react"; import PropTypes from "prop-types"; import { InputAdornment } from "@mui/material"; import { useField } from "formik"; import MuiFormikTextField from "./mui-formik-textfield"; -import { BYTES_PER_MB, DECIMAL_DIGITS } from "../../../utils/constants"; +import { BYTES_PER_MB } from "../../../utils/constants"; const BLOCKED_KEYS = ["e", "E", "+", "-", ".", ","]; const MuiFormikFilesizeField = ({ name, label, ...props }) => { const [field, meta, helpers] = useField(name); - const initialValue = - field.value != null - ? (field.value / BYTES_PER_MB).toFixed(DECIMAL_DIGITS) - : 0; - const [val, setVal] = useState(initialValue); + + const displayValue = + field.value != null ? Math.floor(field.value / BYTES_PER_MB) : 0; + const emptyValue = meta.initialValue === null ? null : 0; - const handleChange = () => { - const mbValue = val; + const handleChange = (e) => { + const mbValue = e.target.value; if (mbValue === "") { helpers.setValue(emptyValue); @@ -33,9 +32,8 @@ const MuiFormikFilesizeField = ({ name, label, ...props }) => { name={name} label={label} type="number" - value={val} - onChange={(ev) => setVal(ev.target.value)} - onBlur={handleChange} + value={displayValue} + onChange={handleChange} slotProps={{ input: { endAdornment: MB From 4291935aae4d0d0cd48aaee87776e4c14894e34a Mon Sep 17 00:00:00 2001 From: Santiago Palenque Date: Thu, 5 Mar 2026 16:15:36 -0300 Subject: [PATCH 3/3] fix: add guard to summit time zone --- src/reducers/sponsors/show-pages-list-reducer.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/reducers/sponsors/show-pages-list-reducer.js b/src/reducers/sponsors/show-pages-list-reducer.js index 701858fbf..52ff5abb5 100644 --- a/src/reducers/sponsors/show-pages-list-reducer.js +++ b/src/reducers/sponsors/show-pages-list-reducer.js @@ -24,8 +24,6 @@ import { } from "../../actions/show-pages-actions"; import { SET_CURRENT_SUMMIT } from "../../actions/summit-actions"; - - const DEFAULT_SHOW_PAGE = { code: "", name: "", @@ -127,7 +125,7 @@ const showPagesListReducer = (state = DEFAULT_STATE, action) => { ? { upload_deadline: epochToMomentTimeZone( m.upload_deadline, - state.summitTZ + state.summitTZ || "UTC" ) } : {})