diff --git a/changelog/entries/unreleased/bug/3434_fix_automatically_upd.json b/changelog/entries/unreleased/bug/3434_fix_automatically_upd.json new file mode 100644 index 000000000..376495454 --- /dev/null +++ b/changelog/entries/unreleased/bug/3434_fix_automatically_upd.json @@ -0,0 +1,7 @@ +{ + "type": "bug", + "message": "[Builder] Fix updating of page parameters when URL query parameters change.", + "issue_number": 3434, + "bullet_points": [], + "created_at": "2025-02-19" +} diff --git a/web-frontend/modules/builder/dataProviderTypes.js b/web-frontend/modules/builder/dataProviderTypes.js index 6840709f8..7cea464d4 100644 --- a/web-frontend/modules/builder/dataProviderTypes.js +++ b/web-frontend/modules/builder/dataProviderTypes.js @@ -313,10 +313,18 @@ export class PageParameterDataProviderType extends DataProviderType { const validators = queryParamNames.includes(name) ? QUERY_PARAM_TYPE_VALIDATION_FUNCTIONS : PAGE_PARAM_TYPE_VALIDATION_FUNCTIONS + let value + try { + value = validators[type](pageParamsValue[name]) + } catch { + // Skip setting the parameter if the user-provided value + // doesn't pass our parameter `type` validation. + return null + } return this.app.store.dispatch('pageParameter/setParameter', { page, name, - value: validators[type](pageParamsValue[name]), + value, }) }) ) diff --git a/web-frontend/modules/builder/pages/publicPage.vue b/web-frontend/modules/builder/pages/publicPage.vue index 2dc862d1e..b0ac087d3 100644 --- a/web-frontend/modules/builder/pages/publicPage.vue +++ b/web-frontend/modules/builder/pages/publicPage.vue @@ -27,6 +27,7 @@ import { userSourceCookieTokenName, setToken, } from '@baserow/modules/core/utils/auth' +import { QUERY_PARAM_TYPE_VALIDATION_FUNCTIONS } from '@baserow/modules/builder/enums' const logOffAndReturnToLogin = async ({ builder, store, redirect }) => { await store.dispatch('userSourceUser/logoff', { @@ -341,6 +342,34 @@ export default { }, }, watch: { + '$route.query': { + immediate: true, + deep: true, + handler(newQuery) { + // when query string changed due to user action, + // update the page's query parameters in the store + Promise.all( + this.currentPage.query_params.map(({ name, type }) => { + if (!newQuery[name]) return null + let value + try { + value = QUERY_PARAM_TYPE_VALIDATION_FUNCTIONS[type]( + newQuery[name] + ) + } catch { + // Skip setting the parameter if the user-provided value + // doesn't pass our parameter `type` validation. + return null + } + return this.$store.dispatch('pageParameter/setParameter', { + page: this.currentPage, + name, + value, + }) + }) + ) + }, + }, dispatchContext: { deep: true, /**