From e3b2cbbdb257f0fc0e3aaad5d536a20ef85f4021 Mon Sep 17 00:00:00 2001 From: Santiago Palenque Date: Thu, 11 Dec 2025 14:47:55 -0300 Subject: [PATCH 1/2] feat: page templates grid and menu --- .env.example | 2 + src/actions/page-template-actions.js | 254 +++++++++++++++++ src/app.js | 1 + src/components/menu/index.js | 4 + src/i18n/en.json | 23 +- src/layouts/page-template-layout.js | 55 ++++ src/layouts/primary-layout.js | 2 + .../edit-page-template-page.js | 85 ++++++ .../page-template-list-page.js | 257 ++++++++++++++++++ .../page-template-list-reducer.js | 124 +++++++++ src/store.js | 4 +- 11 files changed, 809 insertions(+), 2 deletions(-) create mode 100644 src/actions/page-template-actions.js create mode 100644 src/layouts/page-template-layout.js create mode 100644 src/pages/sponsors_inventory/edit-page-template-page.js create mode 100644 src/pages/sponsors_inventory/page-template-list-page.js create mode 100644 src/reducers/sponsors_inventory/page-template-list-reducer.js diff --git a/.env.example b/.env.example index b71ae142b..1a059072b 100644 --- a/.env.example +++ b/.env.example @@ -17,6 +17,8 @@ SPONSOR_USERS_API_SCOPES="show-medata/read show-medata/write access-requests/rea EMAIL_SCOPES="clients/read templates/read templates/write emails/read" FILE_UPLOAD_SCOPES="files/upload" SCOPES="profile openid offline_access ${SPONSOR_USERS_API_SCOPES} ${PURCHASES_API_SCOPES} ${EMAIL_SCOPES} ${FILE_UPLOAD_SCOPES} ${SCOPES_BASE_REALM}/summits/delete-event ${SCOPES_BASE_REALM}/summits/write ${SCOPES_BASE_REALM}/summits/write-event ${SCOPES_BASE_REALM}/summits/read/all ${SCOPES_BASE_REALM}/summits/read ${SCOPES_BASE_REALM}/summits/publish-event ${SCOPES_BASE_REALM}/members/read ${SCOPES_BASE_REALM}/members/read/me ${SCOPES_BASE_REALM}/speakers/write ${SCOPES_BASE_REALM}/attendees/write ${SCOPES_BASE_REALM}/members/write ${SCOPES_BASE_REALM}/organizations/write ${SCOPES_BASE_REALM}/organizations/read ${SCOPES_BASE_REALM}/summits/write-presentation-materials ${SCOPES_BASE_REALM}/summits/registration-orders/update ${SCOPES_BASE_REALM}/summits/registration-orders/delete ${SCOPES_BASE_REALM}/summits/registration-orders/create/offline ${SCOPES_BASE_REALM}/summits/badge-scans/read entity-updates/publish ${SCOPES_BASE_REALM}/audit-logs/read" +SPONSOR_PAGES_API_URL=https://sponsor-pages-api.dev.fnopen.com +SPONSOR_PAGES_SCOPES=page-template/read page-template/write GOOGLE_API_KEY= ALLOWED_USER_GROUPS="super-admins administrators summit-front-end-administrators summit-room-administrators track-chairs-admins sponsors" APP_CLIENT_NAME = "openstack" diff --git a/src/actions/page-template-actions.js b/src/actions/page-template-actions.js new file mode 100644 index 000000000..44c341bd2 --- /dev/null +++ b/src/actions/page-template-actions.js @@ -0,0 +1,254 @@ +/** + * Copyright 2024 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 T from "i18n-react/dist/i18n-react"; +import { + getRequest, + putRequest, + postRequest, + deleteRequest, + createAction, + stopLoading, + startLoading, + showMessage, + showSuccessMessage, + authErrorHandler, + escapeFilterValue +} from "openstack-uicore-foundation/lib/utils/actions"; +import history from "../history"; +import { getAccessTokenSafely } from "../utils/methods"; +import { + DEFAULT_CURRENT_PAGE, + DEFAULT_ORDER_DIR, + DEFAULT_PER_PAGE +} from "../utils/constants"; +import { snackbarErrorHandler } from "./base-actions"; + + + +export const ADD_PAGE_TEMPLATE = "ADD_PAGE_TEMPLATE"; +export const PAGE_TEMPLATE_ADDED = "PAGE_TEMPLATE_ADDED"; +export const PAGE_TEMPLATE_DELETED = "PAGE_TEMPLATE_DELETED"; +export const PAGE_TEMPLATE_UPDATED = "PAGE_TEMPLATE_UPDATED"; +export const RECEIVE_PAGE_TEMPLATE = "RECEIVE_PAGE_TEMPLATE"; +export const RECEIVE_PAGE_TEMPLATES = "RECEIVE_PAGE_TEMPLATES"; +export const REQUEST_PAGE_TEMPLATES = "REQUEST_PAGE_TEMPLATES"; +export const RESET_PAGE_TEMPLATE_FORM = "RESET_PAGE_TEMPLATE_FORM"; +export const UPDATE_PAGE_TEMPLATE = "UPDATE_PAGE_TEMPLATE"; +export const PAGE_TEMPLATE_ARCHIVED = "PAGE_TEMPLATE_ARCHIVED"; +export const PAGE_TEMPLATE_UNARCHIVED = "PAGE_TEMPLATE_UNARCHIVED"; + +export const getPageTemplates = + ( + term = null, + page = DEFAULT_CURRENT_PAGE, + perPage = DEFAULT_PER_PAGE, + order = "id", + orderDir = DEFAULT_ORDER_DIR, + hideArchived = false + ) => + async (dispatch) => { + const accessToken = await getAccessTokenSafely(); + const filter = []; + + dispatch(startLoading()); + + if (term) { + const escapedTerm = escapeFilterValue(term); + filter.push(`name=@${escapedTerm},code=@${escapedTerm}`); + } + + const params = { + page, + /* + expand: "modules", + fields: "id,code,name,modules,is_archived,modules.kind,modules.id,modules.content", + relations: "modules,modules.none", + */ + per_page: perPage, + access_token: accessToken + }; + + if (hideArchived) filter.push("is_archived==0"); + + if (filter.length > 0) { + params["filter[]"] = filter; + } + + // order + if (order != null && orderDir != null) { + const orderDirSign = orderDir === 1 ? "" : "-"; + params.order = `${orderDirSign}${order}`; + } + + return getRequest( + createAction(REQUEST_PAGE_TEMPLATES), + createAction(RECEIVE_PAGE_TEMPLATES), + `${window.SPONSOR_PAGES_API_URL}/api/v1/page-templates`, + authErrorHandler, + { order, orderDir, page, perPage, term, hideArchived } + )(params)(dispatch).then(() => { + dispatch(stopLoading()); + }); + }; + +export const getPageTemplate = (formTemplateId) => async (dispatch) => { + const accessToken = await getAccessTokenSafely(); + + dispatch(startLoading()); + + const params = { + access_token: accessToken, + expand: "materials,meta_fields,meta_fields.values" + }; + + return getRequest( + null, + createAction(RECEIVE_PAGE_TEMPLATE), + `${window.SPONSOR_PAGES_API_URL}/api/v1/page-templates/${formTemplateId}`, + authErrorHandler + )(params)(dispatch).then(() => { + dispatch(stopLoading()); + }); +}; + +export const deletePageTemplate = (formTemplateId) => async (dispatch) => { + const accessToken = await getAccessTokenSafely(); + + dispatch(startLoading()); + + const params = { + access_token: accessToken + }; + + return deleteRequest( + null, + createAction(PAGE_TEMPLATE_DELETED)({ formTemplateId }), + `${window.SPONSOR_PAGES_API_URL}/api/v1/page-templates/${formTemplateId}`, + null, + authErrorHandler + )(params)(dispatch).then(() => { + dispatch(stopLoading()); + }); +}; + +export const resetPageTemplateForm = () => (dispatch) => { + dispatch(createAction(RESET_PAGE_TEMPLATE_FORM)({})); +}; + +const normalizeEntity = (entity) => { + const normalizedEntity = { ...entity }; + normalizedEntity.meta_fields = normalizedEntity.meta_fields?.filter( + (mf) => mf.name + ); + normalizedEntity.materials = normalizedEntity.materials?.filter( + (mat) => mat.file_path + ); + return normalizedEntity; +}; + +export const savePageTemplate = (entity) => async (dispatch) => { + const accessToken = await getAccessTokenSafely(); + const params = { + access_token: accessToken, + expand: "materials,meta_fields,meta_fields.values" + }; + + dispatch(startLoading()); + + const normalizedEntity = normalizeEntity(entity); + + if (entity.id) { + return putRequest( + createAction(UPDATE_PAGE_TEMPLATE), + createAction(PAGE_TEMPLATE_UPDATED), + `${window.SPONSOR_PAGES_API_URL}/api/v1/page-templates/${entity.id}`, + normalizedEntity, + authErrorHandler, + entity + )(params)(dispatch) + .then(() => { + dispatch( + showSuccessMessage( + T.translate("edit_form_template.form_template_saved") + ) + ); + }) + .catch((err) => { + console.error(err); + }) + .finally(() => { + dispatch(stopLoading()); + }); + } + + const success_message = { + title: T.translate("general.done"), + html: T.translate("edit_form_template.form_template_created"), + type: "success" + }; + + return postRequest( + createAction(ADD_PAGE_TEMPLATE), + createAction(PAGE_TEMPLATE_ADDED), + `${window.SPONSOR_PAGES_API_URL}/api/v1/page-templates`, + normalizedEntity, + authErrorHandler, + entity + )(params)(dispatch) + .then(() => { + dispatch( + showMessage(success_message, () => { + history.push("/app/page-templates"); + }) + ); + }) + .catch((err) => { + console.error(err); + }) + .finally(() => { + dispatch(stopLoading()); + }); +}; + +/* ************************************** ARCHIVE ************************************** */ + +export const archivePageTemplate = (pageTemplateId) => async (dispatch) => { + const accessToken = await getAccessTokenSafely(); + const params = { access_token: accessToken }; + + return putRequest( + null, + createAction(PAGE_TEMPLATE_ARCHIVED), + `${window.SPONSOR_PAGES_API_URL}/api/v1/page-templates/${pageTemplateId}/archive`, + null, + snackbarErrorHandler + )(params)(dispatch); +}; + +export const unarchivePageTemplate = (pageTemplateId) => async (dispatch) => { + const accessToken = await getAccessTokenSafely(); + const params = { access_token: accessToken }; + + dispatch(startLoading()); + + return deleteRequest( + null, + createAction(PAGE_TEMPLATE_UNARCHIVED)({ pageTemplateId }), + `${window.SPONSOR_PAGES_API_URL}/api/v1/page-templates/${pageTemplateId}/archive`, + null, + snackbarErrorHandler + )(params)(dispatch).then(() => { + dispatch(stopLoading()); + }); +}; diff --git a/src/app.js b/src/app.js index edf4be49d..eb5b5e2b2 100644 --- a/src/app.js +++ b/src/app.js @@ -81,6 +81,7 @@ window.MARKETING_API_BASE_URL = process.env.MARKETING_API_BASE_URL; window.EMAIL_API_BASE_URL = process.env.EMAIL_API_BASE_URL; window.PURCHASES_API_URL = process.env.PURCHASES_API_URL; window.SPONSOR_USERS_API_URL = process.env.SPONSOR_USERS_API_URL; +window.SPONSOR_PAGES_API_URL = process.env.SPONSOR_PAGES_API_URL; window.FILE_UPLOAD_API_BASE_URL = process.env.FILE_UPLOAD_API_BASE_URL; window.SIGNAGE_BASE_URL = process.env.SIGNAGE_BASE_URL; window.INVENTORY_API_BASE_URL = process.env.INVENTORY_API_BASE_URL; diff --git a/src/components/menu/index.js b/src/components/menu/index.js index 61177a4a4..83e492498 100644 --- a/src/components/menu/index.js +++ b/src/components/menu/index.js @@ -61,6 +61,10 @@ const getGlobalItems = () => [ { name: "form_templates", linkUrl: "form-templates" + }, + { + name: "page_templates", + linkUrl: "page-templates" } ] }, diff --git a/src/i18n/en.json b/src/i18n/en.json index 8a04b78c8..c38c72f8a 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -187,7 +187,8 @@ "submission_invitations": "Submission Invitations", "sponsors_inventory": "Sponsors", "form_templates": "Form Templates", - "inventory": "Inventory" + "inventory": "Inventory", + "page_templates": "Pages" }, "schedule": { "schedule": "Schedule", @@ -3828,5 +3829,25 @@ "seat_type": "Select a Seat Type", "status": "Select a Status" } + }, + "page_template_list": { + "page_templates": "Page Templates", + "alert_info": "You can create or archive Pages from the list. To edit a Page click on the item's Edit botton.", + "code": "Code", + "name": "Name", + "info_mod": "Info Mod", + "upload_mod": "Upload Mod", + "download_mod": "Download Mod", + "hide_archived": "Hide archived pages", + "no_pages": "No pages found.", + "add_new": "New Page", + "add_template": "Using Template", + "delete_form_template_warning": "Are you sure you want to delete form template ", + "using_duplicate": "Using Duplicate", + "add_form_template": "New Form", + "add_using_global_template": "Using Global Template", + "placeholders": { + "search": "Search" + } } } diff --git a/src/layouts/page-template-layout.js b/src/layouts/page-template-layout.js new file mode 100644 index 000000000..ab4fc6e13 --- /dev/null +++ b/src/layouts/page-template-layout.js @@ -0,0 +1,55 @@ +/** + * Copyright 2024 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 { Switch, Route, withRouter } from "react-router-dom"; +import T from "i18n-react/dist/i18n-react"; +import { Breadcrumb } from "react-breadcrumbs"; +import Restrict from "../routes/restrict"; +import NoMatchPage from "../pages/no-match-page"; +import EditPageTemplatePage from "../pages/sponsors_inventory/edit-page-template-page"; +import PageTemplateListPage from "../pages/sponsors_inventory/page-template-list-page"; + +const PageTemplateLayout = ({ match }) => ( +
+ + + + + + + +
+); + +export default Restrict(withRouter(PageTemplateLayout), "page-template"); diff --git a/src/layouts/primary-layout.js b/src/layouts/primary-layout.js index 29f46f0b4..086398890 100644 --- a/src/layouts/primary-layout.js +++ b/src/layouts/primary-layout.js @@ -29,6 +29,7 @@ import MediaFileTypeLayout from "./media-file-type-layout"; import SponsoredProjectLayout from "./sponsored-project-layout"; import TagLayout from "./tag-layout"; import SponsorshipLayout from "./sponsorship-layout"; +import PageTemplateLayout from "./page-template-layout"; const PrimaryLayout = ({ match, currentSummit, location, member }) => { let extraClass = "container"; @@ -65,6 +66,7 @@ const PrimaryLayout = ({ match, currentSummit, location, member }) => { + { + const { + match, + entity, + errors, + getFormTemplate, + resetFormTemplateForm, + saveFormTemplate, + deleteFormTemplateMetaFieldType, + deleteFormTemplateMetaFieldTypeValue, + deleteFormTemplateMaterial + } = props; + const formTemplateId = match.params.form_template_id; + + useEffect(() => { + if (!formTemplateId) { + resetFormTemplateForm(); + } else { + getFormTemplate(formTemplateId); + } + }, [formTemplateId, getFormTemplate, resetFormTemplateForm]); + + const title = entity.id + ? T.translate("general.edit") + : T.translate("general.add"); + const breadcrumb = entity.id ? entity.name : T.translate("general.new"); + + return ( +
+ +

+ {title} {T.translate("edit_form_template.form_template")} +

+
+ +
+ ); +}; + +const mapStateToProps = ({ currentFormTemplateState }) => ({ + ...currentFormTemplateState +}); + +export default connect(mapStateToProps, { + getFormTemplate, + resetFormTemplateForm, + saveFormTemplate, + deleteFormTemplateMetaFieldType, + deleteFormTemplateMetaFieldTypeValue, + deleteFormTemplateMaterial +})(EditPageTemplatePage); diff --git a/src/pages/sponsors_inventory/page-template-list-page.js b/src/pages/sponsors_inventory/page-template-list-page.js new file mode 100644 index 000000000..893c03e05 --- /dev/null +++ b/src/pages/sponsors_inventory/page-template-list-page.js @@ -0,0 +1,257 @@ +/** + * Copyright 2024 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 { + Alert, + Button, + Checkbox, + FormControlLabel, + FormGroup, + Grid2 +} from "@mui/material"; +import Box from "@mui/material/Box"; +import AddIcon from "@mui/icons-material/Add"; +import { connect } from "react-redux"; +import T from "i18n-react/dist/i18n-react"; +import { + archivePageTemplate, + getPageTemplates, + unarchivePageTemplate +} from "../../actions/page-template-actions"; +import MuiTable from "../../components/mui/table/mui-table"; +import SearchInput from "../../components/mui/search-input"; +import { DEFAULT_CURRENT_PAGE } from "../../utils/constants"; + +const PageTemplateListPage = ({ + pageTemplates, + currentPage, + perPage, + term, + order, + orderDir, + hideArchived, + totalPageTemplates, + getPageTemplates, + archivePageTemplate, + unarchivePageTemplate +}) => { + useEffect(() => { + getPageTemplates(); + }, []); + + const handlePageChange = (page) => { + getPageTemplates(term, page, perPage, order, orderDir, hideArchived); + }; + + const handlePerPageChange = (newPerPage) => { + getPageTemplates( + term, + DEFAULT_CURRENT_PAGE, + newPerPage, + order, + orderDir, + hideArchived + ); + }; + + const handleSort = (key, dir) => { + getPageTemplates(term, currentPage, perPage, key, dir, hideArchived); + }; + + const handleSearch = (searchTerm) => { + getPageTemplates( + searchTerm, + currentPage, + perPage, + order, + orderDir, + hideArchived + ); + }; + + const handleHideArchived = (ev) => { + getPageTemplates( + term, + currentPage, + perPage, + order, + orderDir, + ev.target.checked + ); + }; + + const handleNewPageTemplate = () => { + console.log("NEW PAGE"); + }; + + const handleClonePageTemplate = () => { + console.log("CLONE PAGE"); + }; + + const handleArchive = (item) => + item.is_archived + ? unarchivePageTemplate(item.id) + : archivePageTemplate(item.id); + + const handleEdit = (row) => { + console.log("EDIT", row); + }; + + const handleDelete = (row) => { + console.log("DELETE", row); + }; + + const columns = [ + { + columnKey: "code", + header: T.translate("page_template_list.code"), + sortable: true + }, + { + columnKey: "name", + header: T.translate("page_template_list.name"), + sortable: true + }, + { + columnKey: "info_mod", + header: T.translate("page_template_list.info_mod"), + sortable: false + }, + { + columnKey: "upload_mod", + header: T.translate("page_template_list.upload_mod"), + sortable: false + }, + { + columnKey: "download_mod", + header: T.translate("page_template_list.download_mod"), + sortable: false + } + ]; + + const tableOptions = { + sortCol: order, + sortDir: orderDir + }; + + return ( +
+

+ {T.translate("page_template_list.page_templates")} ({totalPageTemplates} + ) +

+ + {T.translate("page_template_list.alert_info")} + + + + + {totalPageTemplates} pages + + + + } + label={T.translate("page_template_list.hide_archived")} + /> + + + + + + + + + + + {pageTemplates.length === 0 && ( + + {T.translate("page_template_list.no_pages")} + + )} + + {pageTemplates.length > 0 && ( +
+ +
+ )} +
+
+ ); +}; + +const mapStateToProps = ({ pageTemplateListState }) => ({ + ...pageTemplateListState +}); + +export default connect(mapStateToProps, { + getPageTemplates, + archivePageTemplate, + unarchivePageTemplate +})(PageTemplateListPage); diff --git a/src/reducers/sponsors_inventory/page-template-list-reducer.js b/src/reducers/sponsors_inventory/page-template-list-reducer.js new file mode 100644 index 000000000..e2ff363d0 --- /dev/null +++ b/src/reducers/sponsors_inventory/page-template-list-reducer.js @@ -0,0 +1,124 @@ +/** + * Copyright 2024 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 { LOGOUT_USER } from "openstack-uicore-foundation/lib/security/actions"; +import { + REQUEST_PAGE_TEMPLATES, + RECEIVE_PAGE_TEMPLATES, + PAGE_TEMPLATE_DELETED, + PAGE_TEMPLATE_ARCHIVED, + PAGE_TEMPLATE_UNARCHIVED +} from "../../actions/page-template-actions"; + +const DEFAULT_STATE = { + pageTemplates: [], + term: null, + order: "name", + orderDir: 1, + currentPage: 1, + lastPage: 1, + perPage: 10, + totalPageTemplates: 0, + hideArchived: false +}; + +const pageTemplateListReducer = (state = DEFAULT_STATE, action = {}) => { + const { type, payload } = action; + switch (type) { + case LOGOUT_USER: { + return DEFAULT_STATE; + } + case REQUEST_PAGE_TEMPLATES: { + const { order, orderDir, page, perPage, ...rest } = payload; + + if ( + order !== state.order || + orderDir !== state.orderDir || + page !== state.currentPage + ) { + // if the change was in page or order, keep selection + return { + ...state, + order, + orderDir, + currentPage: page, + ...rest + }; + } + + return { + ...state, + order, + orderDir, + pageTemplates: [], + currentPage: page, + perPage, + ...rest + }; + } + case RECEIVE_PAGE_TEMPLATES: { + const { current_page, total, last_page } = payload.response; + + const pageTemplates = payload.response.data.map((a) => ({ + id: a.id, + code: a.code, + name: a.name, + info_mod: a.modules.filter((m) => m.kind === "Info").length, + upload_mod: a.modules.filter((m) => m.kind === "Upload").length, + download_mod: a.modules.filter((m) => m.kind === "Download").length, + is_archived: a.is_archived + })); + + return { + ...state, + pageTemplates, + currentPage: current_page, + totalPageTemplates: total, + lastPage: last_page + }; + } + case PAGE_TEMPLATE_DELETED: { + const { pageTemplateId } = payload; + return { + ...state, + pageTemplates: state.pageTemplates.filter( + (a) => a.id !== pageTemplateId + ) + }; + } + case PAGE_TEMPLATE_ARCHIVED: { + const updatedFormTemplate = payload.response; + + const updatedPageTemplates = state.pageTemplates.map((item) => + item.id === updatedFormTemplate.id + ? { ...item, is_archived: true } + : item + ); + return { ...state, pageTemplates: updatedPageTemplates }; + } + case PAGE_TEMPLATE_UNARCHIVED: { + const updatedFormTemplateId = payload; + + const updatedPageTemplates = state.pageTemplates.map((item) => + item.id === updatedFormTemplateId + ? { ...item, is_archived: false } + : item + ); + return { ...state, pageTemplates: updatedPageTemplates }; + } + default: + return state; + } +}; + +export default pageTemplateListReducer; diff --git a/src/store.js b/src/store.js index 64762f8ac..e61a3c172 100644 --- a/src/store.js +++ b/src/store.js @@ -158,6 +158,7 @@ import formTemplateReducer from "./reducers/sponsors_inventory/form-template-red import formTemplateListReducer from "./reducers/sponsors_inventory/form-template-list-reducer.js"; import formTemplateItemReducer from "./reducers/sponsors_inventory/form-template-item-reducer.js"; import formTemplateItemListReducer from "./reducers/sponsors_inventory/form-template-item-list-reducer.js"; +import pageTemplateListReducer from "./reducers/sponsors_inventory/page-template-list-reducer.js"; import sponsorSettingsReducer from "./reducers/sponsor_settings/sponsor-settings-reducer"; import eventRSVPListReducer from "./reducers/rsvps/event-rsvp-list-reducer.js"; import eventRSVPInvitationListReducer from "./reducers/rsvps/event-rsvp-invitation-list-reducer.js"; @@ -322,7 +323,8 @@ const reducers = persistCombineReducers(config, { currentFormTemplateListState: formTemplateListReducer, currentFormTemplateItemState: formTemplateItemReducer, currentFormTemplateItemListState: formTemplateItemListReducer, - sponsorSettingsState: sponsorSettingsReducer + sponsorSettingsState: sponsorSettingsReducer, + pageTemplateListState: pageTemplateListReducer }); const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; From 5dc9876093df0f3e57bc09c04e7f73ed04758677 Mon Sep 17 00:00:00 2001 From: Santiago Palenque Date: Thu, 11 Dec 2025 15:42:12 -0300 Subject: [PATCH 2/2] feat: pages grid - fix api fields --- src/actions/page-template-actions.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/actions/page-template-actions.js b/src/actions/page-template-actions.js index 44c341bd2..998932b7b 100644 --- a/src/actions/page-template-actions.js +++ b/src/actions/page-template-actions.js @@ -34,8 +34,6 @@ import { } from "../utils/constants"; import { snackbarErrorHandler } from "./base-actions"; - - export const ADD_PAGE_TEMPLATE = "ADD_PAGE_TEMPLATE"; export const PAGE_TEMPLATE_ADDED = "PAGE_TEMPLATE_ADDED"; export const PAGE_TEMPLATE_DELETED = "PAGE_TEMPLATE_DELETED"; @@ -70,11 +68,10 @@ export const getPageTemplates = const params = { page, - /* expand: "modules", - fields: "id,code,name,modules,is_archived,modules.kind,modules.id,modules.content", + fields: + "id,code,name,modules,is_archived,modules.kind,modules.id,modules.content", relations: "modules,modules.none", - */ per_page: perPage, access_token: accessToken };