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
15 changes: 2 additions & 13 deletions Caddyfile
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,8 @@
}

handle @is_baserow_tool {
handle /api/* {
reverse_proxy {$PRIVATE_BACKEND_URL:localhost:8000}
}

handle /ws/* {
reverse_proxy {$PRIVATE_BACKEND_URL:localhost:8000}
}

handle /mcp/* {
reverse_proxy {$PRIVATE_BACKEND_URL:localhost:8000}
}

handle /assistant/* {
@backend_routes path /api/* /ws/* /mcp/* /assistant/* {$BASEROW_CADDY_BACKEND_EXTRA_ROUTES:}
handle @backend_routes {
reverse_proxy {$PRIVATE_BACKEND_URL:localhost:8000}
}

Expand Down
8 changes: 4 additions & 4 deletions backend/justfile
Original file line number Diff line number Diff line change
Expand Up @@ -204,17 +204,17 @@ check: _check-dev
set -euo pipefail
{{ _load_env }}

{{ uv_run }} ruff check {{ backend_source_dirs }} {{ backend_tests_dirs }}
{{ uv_run }} ruff format --check {{ backend_source_dirs }} {{ backend_tests_dirs }}
{{ uv_run }} ruff check --config pyproject.toml {{ backend_source_dirs }} {{ backend_tests_dirs }}
{{ uv_run }} ruff format --config pyproject.toml --check {{ backend_source_dirs }} {{ backend_tests_dirs }}

alias lint := check
alias l := check

# Fix code style (sort imports + format)
[group('4 - code-quality')]
fix: _check-dev
{{ uv_run }} ruff check --fix {{ backend_source_dirs }} {{ backend_tests_dirs }}
{{ uv_run }} ruff format {{ backend_source_dirs }} {{ backend_tests_dirs }}
{{ uv_run }} ruff check --config pyproject.toml --fix {{ backend_source_dirs }} {{ backend_tests_dirs }}
{{ uv_run }} ruff format --config pyproject.toml {{ backend_source_dirs }} {{ backend_tests_dirs }}

alias format := fix
alias f := fix
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"type": "bug",
"message": "Fixed a bug where a previously tested node's sample data would disappear in the UI after adding a new node.",
"issue_origin": "github",
"issue_number": null,
"domain": "automation",
"bullet_points": [],
"created_at": "2026-02-16"
}
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,9 @@ export default {
this.loading = false
},
valuesChanged() {
this.isValid = this.$refs.form.isFormValid()
if (this.$refs.form) {
this.isValid = this.$refs.form.isFormValid()
}
},
},
}
Expand Down
2 changes: 1 addition & 1 deletion web-frontend/i18n.config.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export default defineI18nConfig(() => ({
legacy: true,
fallbackLocale: 'en',
//fallbackLocale: 'en', the i18n fallback is managed in /core/plugins/i18n.js. Enabling it here would have no effect.
}))
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,11 @@ const mutations = {
{ workflow, node: nodeToUpdate, values, override = false }
) {
if (override) {
workflow.nodeMap[nodeToUpdate.id] = populateNode(values)
const index = workflow.nodes.findIndex(
(item) => item.id === nodeToUpdate.id
)
workflow.nodes[index] = populateNode(values)
updateCachedValues(workflow)
} else {
Object.assign(workflow.nodeMap[nodeToUpdate.id], values)
}
Expand Down
2 changes: 1 addition & 1 deletion web-frontend/modules/core/layouts/app.vue
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ function keyDown(event) {

if (!avoid) {
const actionName = event.shiftKey ? 'undoRedo/redo' : 'undoRedo/undo'
store.dispatch(actionName, { showLoadingToast: false }).catch(notifyIf)
store.dispatch(actionName, { showLoadingToast: true }).catch(notifyIf)
event.preventDefault()
}
}
Expand Down
1 change: 0 additions & 1 deletion web-frontend/modules/core/module.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import { locales } from '../../config/locales.js'

const require = createRequire(import.meta.url)

const langDir = '../../locales'
export default defineNuxtModule({
meta: {
// Usually the npm package name of your module
Expand Down
11 changes: 10 additions & 1 deletion web-frontend/modules/core/plugins/i18n.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,22 @@ import moment from '@baserow/modules/core/moment'

export default defineNuxtPlugin({
name: 'i18n',
setup(nuxtApp) {
async setup(nuxtApp) {
const { $i18n } = nuxtApp

moment.locale($i18n.locale.value)

$i18n.onLanguageSwitched = (oldLocale, newLocale) => {
moment.locale(newLocale)
}

if ($i18n.locale.value !== 'en') {
try {
$i18n.fallbackLocale.value = 'en'
await $i18n.loadLocaleMessages('en')
} catch (error) {
console.warn('Failed to load fallback locale messages:', error)
}
}
},
})
23 changes: 23 additions & 0 deletions web-frontend/modules/dashboard/middleware/dashboardLoading.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import { StoreItemLookupError } from '@baserow/modules/core/errors'

/**
* Middleware that changes the dashboard loading state to true before the route
* changes.
*/
export default defineNuxtRouteMiddleware(async (to, from) => {
const nuxtApp = useNuxtApp()
const store = nuxtApp.$store
const { $i18n } = nuxtApp

function parseIntOrNull(x) {
return x != null ? parseInt(x) : null
Expand All @@ -14,6 +17,26 @@ export default defineNuxtRouteMiddleware(async (to, from) => {
const fromDashboardId = parseIntOrNull(from?.params?.dashboardId)
const differentDashboardId = fromDashboardId !== toDashboardId

if (toDashboardId) {
try {
const dashboard = await store.dispatch(
'application/selectById',
toDashboardId
)
await store.dispatch('workspace/selectById', dashboard.workspace.id)
} catch (e) {
if (e.response === undefined && !(e instanceof StoreItemLookupError)) {
throw e
}

throw createError({
statusCode: 404,
message: 'Dashboard not found.',
fatal: false,
})
}
}

// If it's the first page or the server side rendered page, then always put the
// dashboard in the loading state for the correct animation.
if (import.meta.server || !from || differentDashboardId) {
Expand Down
29 changes: 10 additions & 19 deletions web-frontend/modules/dashboard/pages/dashboard.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import { computed, onMounted, onBeforeUnmount } from 'vue'
import { useStore } from 'vuex'
import { useRoute, useRouter, onBeforeRouteLeave } from 'vue-router'
import { useNuxtApp, useAsyncData, createError } from '#app'
import { useNuxtApp, useAsyncData, createError, useHead } from '#app'

import DashboardHeader from '@baserow/modules/dashboard/components/DashboardHeader'
import DashboardContent from '@baserow/modules/dashboard/components/DashboardContent'
Expand All @@ -35,24 +35,11 @@ const {
} = await useAsyncData(
`dashboard-data-${route.params.dashboardId}`,
async () => {
const dashboardId = parseInt(route.params.dashboardId)

try {
const dashboard = await store.dispatch(
'application/selectById',
dashboardId
)
const workspace = await store.dispatch(
'workspace/selectById',
dashboard.workspace.id
)

return {
workspace,
dashboard,
}
} catch (e) {
throw createError({ statusCode: 404, message: 'Dashboard not found.' })
const dashboard = store.getters['application/getSelected']
const workspace = store.getters['workspace/getSelected']
return {
workspace,
dashboard,
}
}
)
Expand All @@ -64,6 +51,10 @@ if (fetchError.value) {
const dashboard = computed(() => data.value?.dashboard)
const workspace = computed(() => data.value?.workspace)

useHead(() => ({
title: dashboard.value?.name || '',
}))

// Mounted logic
onMounted(() => {
const forEditing = $hasPermission(
Expand Down
8 changes: 4 additions & 4 deletions web-frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -124,9 +124,9 @@
"@nuxt/eslint": "^1.12.1",
"@nuxt/test-utils": "^3.21.0",
"@nuxtjs/storybook": "latest",
"@storybook/addon-designs": "10.0.2",
"@storybook/addon-docs": "9.1.2",
"@storybook/addon-links": "9.1.2",
"@storybook/addon-designs": "^11.1.0",
"@storybook/addon-docs": "^9.1.16",
"@storybook/addon-links": "^9.1.16",
"@vitest/coverage-istanbul": "^4.0.17",
"@vitest/coverage-v8": "^4.0.17",
"@vue/test-utils": "^2.4.6",
Expand All @@ -138,7 +138,7 @@
"node-mocks-http": "^1.17.2",
"postcss-scss": "^4.0.9",
"prettier": "^3.7.4",
"storybook": "9.1.17",
"storybook": "^9.1.17",
"stylelint": "^16.26.1",
"stylelint-config-standard": "^39.0.1",
"stylelint-config-standard-scss": "^16.0.0",
Expand Down
Loading
Loading