diff --git a/.env.local-dev.example b/.env.local-dev.example index 065eeca33f..169866e3b0 100644 --- a/.env.local-dev.example +++ b/.env.local-dev.example @@ -67,4 +67,4 @@ EMAIL_PORT=1025 # Media files (path relative to the backend folder) # ============================================================================= MEDIA_ROOT=media -MEDIA_URL=http://localhost:4000/media/ +MEDIA_URL=http://localhost:8000/media/ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 907f1f1596..58a680a657 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -476,13 +476,13 @@ jobs: EXTRA_VITEST_PARAMS: --shard=${{ matrix.shard }}/3 --reporter=junit --outputFile=./reports/junit.xml run: | mkdir -p reports + set -o pipefail docker run \ --name=webfrontend_test \ -e EXTRA_VITEST_PARAMS="$EXTRA_VITEST_PARAMS" \ ${{ needs.build-frontend.outputs.image }} ci-test | tee reports/stdout.txt docker cp webfrontend_test:/baserow/web-frontend/reports/junit.xml ./reports docker rm webfrontend_test - ls ./reports - name: Upload test reports uses: actions/upload-artifact@v4 @@ -756,7 +756,7 @@ jobs: CI: 1 run: | cd e2e-tests - CI=1 npx playwright test --timeout=30000 --grep-invert=@slow --shard=${{ matrix.shard }}/2 --project=firefox + npx playwright test --timeout=30000 --grep-invert=@slow --shard=${{ matrix.shard }}/2 --project=firefox - name: Upload E2E test results uses: actions/upload-artifact@v4 diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 43445b4eec..0bb9bea89c 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -31,7 +31,7 @@ services: - BASEROW_BACKEND_DEBUGGER_PORT=${BASEROW_BACKEND_DEBUGGER_PORT:-5678} - BASEROW_DANGEROUS_SILKY_ANALYZE_QUERIES - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318 - - BASEROW_EMBEDDINGS_API_URL=${BASEROW_EMBEDDINGS_API_URL:-http://embeddings:80} + - BASEROW_EMBEDDINGS_API_URL=${BASEROW_EMBEDDINGS_API_URL} build: dockerfile: ./backend/Dockerfile context: . @@ -225,7 +225,7 @@ services: local: ports: - "4318:4318" - + embeddings: profiles: ["ai"] build: @@ -254,4 +254,3 @@ volumes: nuxt: storybook: cache: - diff --git a/e2e-tests/pages/baserowPage.ts b/e2e-tests/pages/baserowPage.ts index 3268eabcdc..bf666e6b78 100644 --- a/e2e-tests/pages/baserowPage.ts +++ b/e2e-tests/pages/baserowPage.ts @@ -24,6 +24,7 @@ export class BaserowPage { } async goto(params = {}) { + await this.page.waitForTimeout(100); // Small delay before navigation to help with Firefox timing issues await this._goto(this.getFullUrl(), { waitUntil: "hydration", ...params, @@ -37,7 +38,7 @@ export class BaserowPage { async changeDropdown( currentValue: string, newValue: string, - location?: Locator + location?: Locator, ) { await (location ? location : this.page) .locator(".dropdown__selected-text") diff --git a/e2e-tests/tests/builder/builder.spec.ts b/e2e-tests/tests/builder/builder.spec.ts index 080bf392a9..0e970ee50f 100644 --- a/e2e-tests/tests/builder/builder.spec.ts +++ b/e2e-tests/tests/builder/builder.spec.ts @@ -1,9 +1,8 @@ import { expect, test } from "../baserowTest"; test.describe("Builder application test suite", () => { - test.beforeEach(async ({ workspacePage, goto }) => { - await goto(workspacePage.getFullUrl(), { waitUntil: "hydration" }); - //await workspacePage.goto(); + test.beforeEach(async ({ workspacePage }) => { + await workspacePage.goto(); }); test("Can create builder application", async ({ page }) => { @@ -14,7 +13,7 @@ test.describe("Builder application test suite", () => { await expect( page.locator(".page-editor").getByText("Page settings"), - "Check we see the default page." + "Check we see the default page.", ).toBeVisible(); }); @@ -28,7 +27,7 @@ test.describe("Builder application test suite", () => { await expect( page.locator(".tree__link").getByText("My super application"), - "Checks the name of the application is displayed in the sidebar." + "Checks the name of the application is displayed in the sidebar.", ).toBeVisible(); }); }); diff --git a/e2e-tests/tests/builder/builderPage.spec.ts b/e2e-tests/tests/builder/builderPage.spec.ts index f34157b3c3..7c1067fc86 100644 --- a/e2e-tests/tests/builder/builderPage.spec.ts +++ b/e2e-tests/tests/builder/builderPage.spec.ts @@ -23,7 +23,7 @@ test.describe("Builder page test suite", () => { await expect( page .locator(".preview-navigation-bar__address-bar-path") - .getByText("/complex/path") + .getByText("/complex/path"), ).toBeVisible(); }); @@ -46,7 +46,7 @@ test.describe("Builder page test suite", () => { await page.locator(".button").getByText("Save").click(); await expect( - page.getByText("The page settings have been updated.") + page.getByText("The page settings have been updated."), ).toBeVisible(); await page.locator(".modal__close", { title: "Close" }).click(); @@ -55,7 +55,7 @@ test.describe("Builder page test suite", () => { await expect( page .locator(".preview-navigation-bar__address-bar-path") - .getByText("/new/path") + .getByText("/new/path"), ).toBeVisible(); }); @@ -64,10 +64,10 @@ test.describe("Builder page test suite", () => { await page.getByText("Heading", { exact: true }).click(); await expect( - page.locator(".modal__box").getByText("Add new element") + page.locator(".modal__box").getByText("Add new element"), ).toBeHidden(); await expect( - page.locator(".element-preview__name-tag").getByText("Heading") + page.locator(".element-preview__name-tag").getByText("Heading"), ).toBeVisible(); }); @@ -80,10 +80,10 @@ test.describe("Builder page test suite", () => { await page.getByText("Heading", { exact: true }).click(); await expect( - page.locator(".modal__box").getByText("Add new element") + page.locator(".modal__box").getByText("Add new element"), ).toBeHidden(); await expect( - page.locator(".element-preview__name-tag").getByText("Heading") + page.locator(".element-preview__name-tag").getByText("Heading"), ).toBeVisible(); }); @@ -131,7 +131,7 @@ test.describe("Builder page test suite", () => { // Save the page await page.getByRole("button", { name: "Save" }).click(); await expect( - page.getByText("The page settings have been updated.") + page.getByText("The page settings have been updated."), ).toBeVisible(); // Close the modal @@ -157,7 +157,10 @@ test.describe("Builder page test suite", () => { ], }); - await page.getByText("linkim"); + // Reload the page to see the newly created element + await builderPagePage.goto(); + + await expect(page.getByRole("link", { name: "linkim" })).toBeVisible(); // Set the value of page parameters await page.getByLabel("my_param=").fill("foo"); @@ -165,7 +168,7 @@ test.describe("Builder page test suite", () => { await expect(page.getByRole("link", { name: "linkim" })).toHaveAttribute( "href", - /\?my_param2=15&my_param=foo/ + /\?my_param2=15&my_param=foo/, ); }); }); diff --git a/enterprise/web-frontend/modules/baserow_enterprise/components/crudTable/fields/HighestPaidRoleField.vue b/enterprise/web-frontend/modules/baserow_enterprise/components/crudTable/fields/HighestPaidRoleField.vue index 67ce1f61b6..a6387cf4b9 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/components/crudTable/fields/HighestPaidRoleField.vue +++ b/enterprise/web-frontend/modules/baserow_enterprise/components/crudTable/fields/HighestPaidRoleField.vue @@ -6,7 +6,7 @@ href="https://baserow.io/user-docs/subscriptions-overview#who-is-considered-a-user-for-billing-purposes" target="_blank" > - {{ $t('highestPaidRoleField.billable') }} @@ -33,6 +33,9 @@ export default { roleName() { return this.role ? this.role.name : '' }, + roleIsBillable() { + return this.role ? this.role.isBillable : false + }, role() { return this.roles.find((r) => r.uid === this.roleUID) }, diff --git a/enterprise/web-frontend/modules/baserow_enterprise/integrations/common/components/CommonOIDCSettingForm.vue b/enterprise/web-frontend/modules/baserow_enterprise/integrations/common/components/CommonOIDCSettingForm.vue index e054c066e8..87b53ae539 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/integrations/common/components/CommonOIDCSettingForm.vue +++ b/enterprise/web-frontend/modules/baserow_enterprise/integrations/common/components/CommonOIDCSettingForm.vue @@ -9,7 +9,12 @@