Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 18 additions & 13 deletions src/actions/page-template-actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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 = [];

Expand Down Expand Up @@ -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());
});
Expand Down Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion src/actions/show-pages-actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
34 changes: 22 additions & 12 deletions src/pages/sponsors-global/page-templates/page-template-list-page.js
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -40,6 +41,7 @@ import PageTemplateClonePopup from "./page-template-clone-popup";

const PageTemplateListPage = ({
pageTemplates,
pageTemplate,
currentPage,
perPage,
term,
Expand All @@ -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(() => {
Expand Down Expand Up @@ -104,15 +106,16 @@ const PageTemplateListPage = ({
};

const handleNewPageTemplate = () => {
setPageTemplateId("new");
resetPageTemplateForm();
setOpenPageDialog(true);
};

const handleClonePageTemplate = () => {
setOpenCloneDialog(true);
};

const handleSavePageTemplate = (entity) => {
savePageTemplate(entity).then(() => setPageTemplateId(null));
savePageTemplate(entity).then(() => setOpenPageDialog(false));
};

const handleArchive = (item) =>
Expand All @@ -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) => {
Expand All @@ -137,6 +140,11 @@ const PageTemplateListPage = ({
);
};

const handleClosePageDialog = () => {
resetPageTemplateForm();
setOpenPageDialog(false);
};

const columns = [
{
columnKey: "code",
Expand Down Expand Up @@ -268,10 +276,10 @@ const PageTemplateListPage = ({
)}
</Box>
<PageTemplatePopup
open={!!pageTemplateId}
onClose={() => setPageTemplateId(null)}
open={openPageDialog}
pageTemplate={pageTemplate}
onClose={handleClosePageDialog}
onSave={handleSavePageTemplate}
summitTZ={summitTZ}
/>
<PageTemplateClonePopup
open={openCloneDialog}
Expand All @@ -281,8 +289,9 @@ const PageTemplateListPage = ({
);
};

const mapStateToProps = ({ pageTemplateListState }) => ({
...pageTemplateListState
const mapStateToProps = ({ pageTemplateListState, pageTemplateState }) => ({
...pageTemplateListState,
pageTemplate: pageTemplateState.entity
});

export default connect(mapStateToProps, {
Expand All @@ -291,5 +300,6 @@ export default connect(mapStateToProps, {
archivePageTemplate,
unarchivePageTemplate,
savePageTemplate,
deletePageTemplate
deletePageTemplate,
resetPageTemplateForm
})(PageTemplateListPage);
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -18,51 +17,16 @@ 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,
PAGE_MODULES_MEDIA_TYPES,
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 = {
Expand Down Expand Up @@ -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")),
Expand All @@ -184,12 +145,12 @@ const PageTemplatePopup = ({
});

return (
<Dialog open={open} onClose={handleClose} maxWidth="md" fullWidth>
<Dialog open={open} onClose={onClose} maxWidth="md" fullWidth>
<DialogTitle sx={{ display: "flex", justifyContent: "space-between" }}>
<Typography fontSize="1.5rem">
{T.translate("page_template_list.page_crud.title")}
</Typography>
<IconButton size="small" onClick={() => handleClose()} sx={{ mr: 1 }}>
<IconButton size="small" onClick={onClose} sx={{ mr: 1 }}>
<CloseIcon fontSize="small" />
</IconButton>
</DialogTitle>
Expand Down Expand Up @@ -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
};
Comment on lines 232 to 236
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Missing pageTemplate prop type definition.

The pageTemplate prop is used at line 130 for initialValues but is not defined in PropTypes.

Proposed fix
 PageTemplatePopup.propTypes = {
+  pageTemplate: PropTypes.object.isRequired,
   open: PropTypes.bool.isRequired,
   onClose: PropTypes.func.isRequired,
   onSave: PropTypes.func.isRequired
 };
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
PageTemplatePopup.propTypes = {
open: PropTypes.bool.isRequired,
onClose: PropTypes.func.isRequired,
onSave: PropTypes.func.isRequired,
summitTZ: PropTypes.string.isRequired
onSave: PropTypes.func.isRequired
};
PageTemplatePopup.propTypes = {
pageTemplate: PropTypes.object.isRequired,
open: PropTypes.bool.isRequired,
onClose: PropTypes.func.isRequired,
onSave: PropTypes.func.isRequired
};
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/sponsors-global/page-templates/page-template-popup/index.js` around
lines 232 - 236, The PageTemplatePopup component is missing a PropTypes entry
for the pageTemplate prop used to set initialValues; update
PageTemplatePopup.propTypes to include pageTemplate with the appropriate shape
(e.g., PropTypes.object or a PropTypes.shape describing fields used by
initialValues) and mark it as required if it must always be provided,
referencing PageTemplatePopup, pageTemplate, and initialValues so the component
prop validation matches actual usage.


const mapStateToProps = ({ pageTemplateState }) => ({
pageTemplate: pageTemplateState.entity
});

export default connect(mapStateToProps, {
resetPageTemplateForm
})(PageTemplatePopup);
export default PageTemplatePopup;
9 changes: 6 additions & 3 deletions src/pages/sponsors/show-pages-list-page/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ const ShowPagesListPage = ({
orderDir,
hideArchived,
totalCount,
summitTZ,
currentShowPage,
getShowPages,
archiveShowPage,
Expand Down Expand Up @@ -120,6 +119,11 @@ const ShowPagesListPage = ({
setOpenPopup(null);
};

const handleNewShowPage = () => {
resetShowPageForm();
setOpenPopup("pageTemplate");
};

const columns = [
{
columnKey: "code",
Expand Down Expand Up @@ -207,7 +211,7 @@ const ShowPagesListPage = ({
variant="contained"
size="medium"
fullWidth
onClick={() => setOpenPopup("pageTemplate")}
onClick={handleNewShowPage}
startIcon={<AddIcon />}
sx={{ height: "36px" }}
>
Expand Down Expand Up @@ -248,7 +252,6 @@ const ShowPagesListPage = ({
pageTemplate={currentShowPage}
onClose={handleTemplatePopupClose}
onSave={handleSaveShowPage}
summitTZ={summitTZ}
/>
</div>
);
Expand Down
20 changes: 18 additions & 2 deletions src/reducers/sponsors/show-pages-list-reducer.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -114,9 +115,24 @@ const showPagesListReducer = (state = DEFAULT_STATE, action) => {
};
}
case RECEIVE_SHOW_PAGE: {
const showPage = payload.response;
const pageData = payload.response;

return { ...state, currentShowPage: showPage };
const currentShowPage = {
...pageData,
modules: pageData.modules.map((m) => ({
...m,
...(m.upload_deadline
? {
upload_deadline: epochToMomentTimeZone(
m.upload_deadline,
state.summitTZ || "UTC"
)
}
: {})
}))
};

return { ...state, currentShowPage };
}
case SHOW_PAGE_DELETED: {
const { pageId } = payload;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {}) => {
Expand Down