From 779cc10b52a5c9632e0c48811848aae5fe66aa13 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Wed, 16 Apr 2025 12:05:05 +0100 Subject: [PATCH 01/31] fix animation --- .../components/common/CodeEditor/AIGen.svelte | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/packages/builder/src/components/common/CodeEditor/AIGen.svelte b/packages/builder/src/components/common/CodeEditor/AIGen.svelte index 199c7aa42a..287145b433 100644 --- a/packages/builder/src/components/common/CodeEditor/AIGen.svelte +++ b/packages/builder/src/components/common/CodeEditor/AIGen.svelte @@ -63,6 +63,10 @@ containerWidth = "auto" } + $: initiallyExpanded = + expandedOnly || + (parentWidth !== null && parentWidth > thresholdExpansionWidth) + async function generateJs(prompt: string) { if (!prompt.trim()) return @@ -169,6 +173,7 @@ class="spectrum-ActionButton fade" class:expanded class:animate-border={animateBorder} + class:static-border={initiallyExpanded && !animateBorder} on:click={!expanded ? toggleExpand : undefined} >
@@ -292,18 +297,17 @@ position: absolute; top: -1px; left: -1px; - width: calc(100% + 2px); + width: 50%; height: calc(100% + 2px); border-radius: inherit; background: linear-gradient( - 125deg, - transparent -10%, - #6e56ff 2%, - #9f8fff 15%, - #9f8fff 25%, - transparent 35%, - transparent 110% + to right, + #6e56ff, + #9f8fff 40%, + transparent 100% ); + background-size: 200% 100%; + background-position: 100% 0; pointer-events: none; z-index: 0; } @@ -313,16 +317,18 @@ } .animate-border::before { - animation: border-fade-in 1s cubic-bezier(0.17, 0.67, 0.83, 0.67); + animation: border-expand 1s cubic-bezier(0.17, 0.67, 0.83, 0.67); animation-fill-mode: forwards; } - @keyframes border-fade-in { - from { - opacity: 0; + @keyframes border-expand { + 0% { + transform: scaleX(0); + transform-origin: left; } - to { - opacity: 1; + 100% { + transform: scaleX(1); + transform-origin: left; } } @@ -378,9 +384,9 @@ .ai-icon { width: 18px; height: 18px; - margin-right: 8px; - flex-shrink: 0; - cursor: var(--ai-icon-cursor, pointer); + margin-right: var(--spacing-s); + cursor: pointer; + margin-left: var(--spacing-xs); } .ai-gen-text { @@ -437,4 +443,10 @@ filter: grayscale(1) brightness(1.5); opacity: 0.5; } + + .spectrum-ActionButton.static-border::before { + content: ""; + transform: scaleX(1); + transform-origin: left; + } From 999c0b49a33a788a5718c84b57aeff8bcaafac6e Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Wed, 16 Apr 2025 13:59:11 +0100 Subject: [PATCH 02/31] UX review updates --- .../components/common/CodeEditor/AIGen.svelte | 1 - .../common/CodeEditor/CodeEditor.svelte | 20 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/builder/src/components/common/CodeEditor/AIGen.svelte b/packages/builder/src/components/common/CodeEditor/AIGen.svelte index 287145b433..3f0927171b 100644 --- a/packages/builder/src/components/common/CodeEditor/AIGen.svelte +++ b/packages/builder/src/components/common/CodeEditor/AIGen.svelte @@ -349,7 +349,6 @@ display: flex; gap: var(--spacing-s); bottom: calc(100% + 5px); - left: 5px; z-index: 2; animation: fade-in 0.2s ease-out forwards; } diff --git a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte index c159804e47..e48f0c2cee 100644 --- a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte +++ b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte @@ -88,6 +88,7 @@ let isEditorInitialised = false let queuedRefresh = false let editorWidth: number | null = null + let isAIGeneratedContent = false // Theming! let currentTheme = $themeStore?.theme @@ -429,6 +430,7 @@ editor.dispatch({ changes: { from: 0, to: editor.state.doc.length, insert: code }, }) + isAIGeneratedContent = true } onMount(() => { @@ -462,7 +464,12 @@
{/if} -
+
@@ -475,6 +482,7 @@ on:accept={() => { dispatch("change", editor.state.doc.toString()) dispatch("blur", editor.state.doc.toString()) + isAIGeneratedContent = false }} on:reject={event => { const { code } = event.detail @@ -482,6 +490,7 @@ editor.dispatch({ changes: { from: 0, to: editor.state.doc.length, insert: code || "" }, }) + isAIGeneratedContent = false }} /> {/if} @@ -691,4 +700,13 @@ text-overflow: ellipsis !important; white-space: nowrap !important; } + + /* Add styling for AI-generated content */ + .code-editor.ai-generated :global(.cm-editor) { + background: var(--spectrum-global-color-blue-50) !important; + } + + .code-editor.ai-generated :global(.cm-content) { + background: #765ffe1a !important; + } From f603657bbe4662c5443614e06a7a7a16e172a910 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Wed, 16 Apr 2025 14:08:29 +0100 Subject: [PATCH 03/31] suggestion highlighting --- .../src/components/common/CodeEditor/CodeEditor.svelte | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte index e48f0c2cee..3369d12c31 100644 --- a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte +++ b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte @@ -707,6 +707,13 @@ } .code-editor.ai-generated :global(.cm-content) { + background: transparent !important; + } + + .code-editor.ai-generated :global(.cm-line) { background: #765ffe1a !important; + display: inline-block; + min-width: fit-content; + padding-right: 2px !important; } From d261b91a659bece60d7169ca66c4a9e910c03287 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Thu, 24 Apr 2025 12:32:26 +0100 Subject: [PATCH 04/31] New endpoint to set feature flag overrides. --- packages/backend-core/src/constants/misc.ts | 1 + packages/backend-core/src/context/mainContext.ts | 11 +++++++++++ packages/backend-core/src/context/types.ts | 1 + .../src/middleware/featureFlagCookie.ts | 13 +++++++++++++ packages/backend-core/src/middleware/index.ts | 1 + packages/server/src/api/controllers/features | 7 +++++++ packages/server/src/api/index.ts | 1 + packages/server/src/api/routes/features.ts | 8 ++++++++ packages/types/src/api/web/app/features.ts | 3 +++ packages/types/src/api/web/app/index.ts | 1 + packages/types/src/api/web/cookies.ts | 4 ++++ packages/types/src/sdk/featureFlag.ts | 3 +++ 12 files changed, 54 insertions(+) create mode 100644 packages/backend-core/src/middleware/featureFlagCookie.ts create mode 100644 packages/server/src/api/controllers/features create mode 100644 packages/server/src/api/routes/features.ts create mode 100644 packages/types/src/api/web/app/features.ts diff --git a/packages/backend-core/src/constants/misc.ts b/packages/backend-core/src/constants/misc.ts index e2fd975e40..1fa8d6e926 100644 --- a/packages/backend-core/src/constants/misc.ts +++ b/packages/backend-core/src/constants/misc.ts @@ -9,6 +9,7 @@ export enum Cookie { ACCOUNT_RETURN_URL = "budibase:account:returnurl", DatasourceAuth = "budibase:datasourceauth", OIDC_CONFIG = "budibase:oidc:config", + FeatureFlags = "budibase:featureflags", } export { Header } from "@budibase/shared-core" diff --git a/packages/backend-core/src/context/mainContext.ts b/packages/backend-core/src/context/mainContext.ts index 22b937db88..c04be33dcb 100644 --- a/packages/backend-core/src/context/mainContext.ts +++ b/packages/backend-core/src/context/mainContext.ts @@ -460,6 +460,17 @@ export function setFeatureFlags(key: string, value: Record) { context.featureFlagCache[key] = value } +export function getFeatureFlagOverrides(): Record { + return getCurrentContext()?.featureFlagOverrides || {} +} + +export function doInFeatureFlagOverrideContext( + value: Record, + callback: () => Promise +) { + return newContext({ featureFlagOverrides: value }, callback) +} + export function getTableForView(viewId: string): Table | undefined { const context = getCurrentContext() if (!context) { diff --git a/packages/backend-core/src/context/types.ts b/packages/backend-core/src/context/types.ts index c2cb966731..b34ef8c1b7 100644 --- a/packages/backend-core/src/context/types.ts +++ b/packages/backend-core/src/context/types.ts @@ -24,5 +24,6 @@ export type ContextMap = { featureFlagCache?: { [key: string]: Record } + featureFlagOverrides?: Record viewToTableCache?: Record } diff --git a/packages/backend-core/src/middleware/featureFlagCookie.ts b/packages/backend-core/src/middleware/featureFlagCookie.ts new file mode 100644 index 0000000000..070e2161af --- /dev/null +++ b/packages/backend-core/src/middleware/featureFlagCookie.ts @@ -0,0 +1,13 @@ +import { Ctx, FeatureFlagCookie } from "@budibase/types" +import { Middleware, Next } from "koa" +import { getCookie } from "../utils" +import { Cookie } from "../constants" +import { doInFeatureFlagOverrideContext } from "../context" + +export default (async (ctx: Ctx, next: Next) => { + const cookie = getCookie(ctx, Cookie.FeatureFlags) + const flags = cookie?.flags || {} + await doInFeatureFlagOverrideContext(flags, async () => { + await next() + }) +}) as Middleware diff --git a/packages/backend-core/src/middleware/index.ts b/packages/backend-core/src/middleware/index.ts index 9ee51db45b..0d16ae52e3 100644 --- a/packages/backend-core/src/middleware/index.ts +++ b/packages/backend-core/src/middleware/index.ts @@ -20,5 +20,6 @@ export { default as correlation } from "../logging/correlation/middleware" export { default as errorHandling } from "./errorHandling" export { default as querystringToBody } from "./querystringToBody" export { default as csp } from "./contentSecurityPolicy" +export { default as featureFlagCookie } from "./featureFlagCookie" export * as joiValidator from "./joi-validator" export { default as ip } from "./ip" diff --git a/packages/server/src/api/controllers/features b/packages/server/src/api/controllers/features new file mode 100644 index 0000000000..7760970bd6 --- /dev/null +++ b/packages/server/src/api/controllers/features @@ -0,0 +1,7 @@ +import { UserCtx, OverrideFeatureFlagRequest } from "@budibase/types" +import { Cookie, utils } from "@budibase/backend-core" + +export async function override(ctx: UserCtx) { + const { flags = {} } = ctx.request.body + utils.setCookie(ctx, flags, Cookie.FeatureFlags) +} diff --git a/packages/server/src/api/index.ts b/packages/server/src/api/index.ts index 4f88b77147..c73a48de47 100644 --- a/packages/server/src/api/index.ts +++ b/packages/server/src/api/index.ts @@ -71,6 +71,7 @@ if (apiEnabled()) { ) .use(pro.licensing()) .use(currentApp) + .use(middleware.featureFlagCookie) // Add CSP as soon as possible - depends on licensing and currentApp if (!coreEnv.DISABLE_CONTENT_SECURITY_POLICY) { diff --git a/packages/server/src/api/routes/features.ts b/packages/server/src/api/routes/features.ts new file mode 100644 index 0000000000..aaf9835ac0 --- /dev/null +++ b/packages/server/src/api/routes/features.ts @@ -0,0 +1,8 @@ +import Router from "@koa/router" +import * as controller from "../controllers/features" + +const router: Router = new Router() + +router.patch("/api/features", controller.override) + +export default router diff --git a/packages/types/src/api/web/app/features.ts b/packages/types/src/api/web/app/features.ts new file mode 100644 index 0000000000..018251a71e --- /dev/null +++ b/packages/types/src/api/web/app/features.ts @@ -0,0 +1,3 @@ +export interface OverrideFeatureFlagRequest { + flags: Record +} diff --git a/packages/types/src/api/web/app/index.ts b/packages/types/src/api/web/app/index.ts index b2243452c5..612f4bbc32 100644 --- a/packages/types/src/api/web/app/index.ts +++ b/packages/types/src/api/web/app/index.ts @@ -5,6 +5,7 @@ export * from "./backup" export * from "./component" export * from "./datasource" export * from "./deployment" +export * from "./features" export * from "./integration" export * from "./layout" export * from "./metadata" diff --git a/packages/types/src/api/web/cookies.ts b/packages/types/src/api/web/cookies.ts index 27954a36a1..b189863e60 100644 --- a/packages/types/src/api/web/cookies.ts +++ b/packages/types/src/api/web/cookies.ts @@ -7,3 +7,7 @@ export interface SessionCookie { sessionId: string userId: string } + +export interface FeatureFlagCookie { + flags: Record +} diff --git a/packages/types/src/sdk/featureFlag.ts b/packages/types/src/sdk/featureFlag.ts index 83376e1d6a..8be6b532c0 100644 --- a/packages/types/src/sdk/featureFlag.ts +++ b/packages/types/src/sdk/featureFlag.ts @@ -1,4 +1,5 @@ export enum FeatureFlag { + DEBUG_UI = "DEBUG_UI", USE_ZOD_VALIDATOR = "USE_ZOD_VALIDATOR", AI_JS_GENERATION = "AI_JS_GENERATION", AI_TABLE_GENERATION = "AI_TABLE_GENERATION", @@ -14,6 +15,8 @@ export const FeatureFlagDefaults: Record = { // Account-portal [FeatureFlag.DIRECT_LOGIN_TO_ACCOUNT_PORTAL]: false, + + [FeatureFlag.DEBUG_UI]: false, } export type FeatureFlags = typeof FeatureFlagDefaults From eb2acdf99e3cd14e25625fc767f0acc4e8f747dd Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Thu, 24 Apr 2025 17:49:13 +0100 Subject: [PATCH 05/31] Feature flag overriding UI. --- .../backend-core/src/context/mainContext.ts | 4 +- .../backend-core/src/features/features.ts | 15 +++++ .../src/components/debug/DebugUI.svelte | 56 +++++++++++++++++++ .../src/pages/builder/portal/_layout.svelte | 29 +++++++++- packages/frontend-core/src/api/features.ts | 19 +++++++ packages/frontend-core/src/api/index.ts | 2 + packages/frontend-core/src/api/types.ts | 2 + packages/server/src/api/controllers/features | 7 --- .../server/src/api/controllers/features.ts | 26 +++++++++ packages/server/src/api/index.ts | 3 +- packages/server/src/api/routes/features.ts | 8 ++- packages/server/src/api/routes/index.ts | 2 + packages/worker/src/api/index.ts | 1 + 13 files changed, 159 insertions(+), 15 deletions(-) create mode 100644 packages/builder/src/components/debug/DebugUI.svelte create mode 100644 packages/frontend-core/src/api/features.ts delete mode 100644 packages/server/src/api/controllers/features create mode 100644 packages/server/src/api/controllers/features.ts diff --git a/packages/backend-core/src/context/mainContext.ts b/packages/backend-core/src/context/mainContext.ts index c04be33dcb..9bea94de29 100644 --- a/packages/backend-core/src/context/mainContext.ts +++ b/packages/backend-core/src/context/mainContext.ts @@ -464,11 +464,11 @@ export function getFeatureFlagOverrides(): Record { return getCurrentContext()?.featureFlagOverrides || {} } -export function doInFeatureFlagOverrideContext( +export async function doInFeatureFlagOverrideContext( value: Record, callback: () => Promise ) { - return newContext({ featureFlagOverrides: value }, callback) + return await newContext({ featureFlagOverrides: value }, callback) } export function getTableForView(viewId: string): Table | undefined { diff --git a/packages/backend-core/src/features/features.ts b/packages/backend-core/src/features/features.ts index 7106777084..a76ffe8a7b 100644 --- a/packages/backend-core/src/features/features.ts +++ b/packages/backend-core/src/features/features.ts @@ -175,6 +175,21 @@ export class FlagSet { } } + const overrides = context.getFeatureFlagOverrides() + for (const [key, value] of Object.entries(overrides)) { + if (!this.isFlagName(key)) { + continue + } + + if (typeof value !== "boolean") { + continue + } + + // @ts-expect-error - TS does not like you writing into a generic type. + flagValues[key] = value + tags[`flags.${key}.source`] = "override" + } + context.setFeatureFlags(this.setId, flagValues) for (const [key, value] of Object.entries(flagValues)) { tags[`flags.${key}.value`] = value diff --git a/packages/builder/src/components/debug/DebugUI.svelte b/packages/builder/src/components/debug/DebugUI.svelte new file mode 100644 index 0000000000..8df7e9c1b0 --- /dev/null +++ b/packages/builder/src/components/debug/DebugUI.svelte @@ -0,0 +1,56 @@ + + + +
+ {#each Object.entries($featureFlags) as [key, value]} +
+ setFlag(key, value.detail)} + /> +
+ {/each} +
+
+ + diff --git a/packages/builder/src/pages/builder/portal/_layout.svelte b/packages/builder/src/pages/builder/portal/_layout.svelte index 323b231037..2fe4312da1 100644 --- a/packages/builder/src/pages/builder/portal/_layout.svelte +++ b/packages/builder/src/pages/builder/portal/_layout.svelte @@ -1,6 +1,6 @@ - - -
- {#each Object.entries($featureFlags) as [key, value]} -
- setFlag(key, value.detail)} - /> -
- {/each} -
-
- - diff --git a/packages/builder/src/pages/builder/app/[application]/data/new.svelte b/packages/builder/src/pages/builder/app/[application]/data/new.svelte index 5b1209046e..f79a292d6c 100644 --- a/packages/builder/src/pages/builder/app/[application]/data/new.svelte +++ b/packages/builder/src/pages/builder/app/[application]/data/new.svelte @@ -16,8 +16,7 @@ import CreationPage from "@/components/common/CreationPage.svelte" import ICONS from "@/components/backend/DatasourceNavigator/icons/index.js" import AiTableGeneration from "./_components/AITableGeneration.svelte" - import { featureFlag } from "@/helpers" - import { FeatureFlag } from "@budibase/types" + import { featureFlags } from "@/stores/portal" let internalTableModal: CreateInternalTableModal let externalDatasourceModal: CreateExternalDatasourceModal @@ -26,10 +25,7 @@ let externalDatasourceLoading = false $: disabled = sampleDataLoading || externalDatasourceLoading - - $: aiTableGenerationEnabled = featureFlag.isEnabled( - FeatureFlag.AI_TABLE_GENERATION - ) + $: aiTableGenerationEnabled = $featureFlags.AI_TABLE_GENERATION const createSampleData = async () => { sampleDataLoading = true diff --git a/packages/builder/src/pages/builder/portal/_layout.svelte b/packages/builder/src/pages/builder/portal/_layout.svelte index 2fe4312da1..e49dc8b3f3 100644 --- a/packages/builder/src/pages/builder/portal/_layout.svelte +++ b/packages/builder/src/pages/builder/portal/_layout.svelte @@ -1,6 +1,6 @@ + + + + + {#if loaded} {/if} diff --git a/packages/builder/src/pages/builder/app/[application]/_layout.svelte b/packages/builder/src/pages/builder/app/[application]/_layout.svelte index a799553aca..668aca657e 100644 --- a/packages/builder/src/pages/builder/app/[application]/_layout.svelte +++ b/packages/builder/src/pages/builder/app/[application]/_layout.svelte @@ -14,7 +14,6 @@ Tabs, Tab, Heading, - Modal, notifications, TooltipPosition, } from "@budibase/bbui" @@ -24,7 +23,6 @@ import { capitalise } from "@/helpers" import { onMount, onDestroy } from "svelte" import VerificationPromptBanner from "@/components/common/VerificationPromptBanner.svelte" - import CommandPalette from "@/components/commandPalette/CommandPalette.svelte" import TourWrap from "@/components/portal/onboarding/TourWrap.svelte" import TourPopover from "@/components/portal/onboarding/TourPopover.svelte" import BuilderSidePanel from "./_components/BuilderSidePanel.svelte" @@ -38,7 +36,6 @@ let promise = getPackage() let hasSynced = false - let commandPaletteModal let loaded = false $: loaded && initTour() @@ -79,14 +76,6 @@ $goto($builderStore.previousTopNavPath[path] || path) } - // Event handler for the command palette - const handleKeyDown = e => { - if (e.key === "k" && (e.ctrlKey || e.metaKey)) { - e.preventDefault() - commandPaletteModal.toggle() - } - } - const initTour = async () => { // Check if onboarding is enabled. if (!$auth.user?.onboardedAt) { @@ -184,11 +173,6 @@ {/if} - - - - - From d2fddfbbf84eb2a8eec3e9a4af6463c812e674e2 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Tue, 29 Apr 2025 11:44:49 +0100 Subject: [PATCH 21/31] lint --- .../builder/src/components/common/CodeEditor/CodeEditor.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte index 3369d12c31..9efbef2c8d 100644 --- a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte +++ b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte @@ -701,7 +701,6 @@ white-space: nowrap !important; } - /* Add styling for AI-generated content */ .code-editor.ai-generated :global(.cm-editor) { background: var(--spectrum-global-color-blue-50) !important; } From b18cf3060ca6e1bf6ee87ef237fa87641cd1261d Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Tue, 29 Apr 2025 11:45:28 +0100 Subject: [PATCH 22/31] Update pro reference. --- packages/pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pro b/packages/pro index 53a8d40273..72655ddbe0 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit 53a8d402736f24f34ad104b5cb3f26ffabce6187 +Subproject commit 72655ddbe0f4350d937fed48f6685f3250c1b7d6 From f08d93dc03900e04bfc0bb5368d745656118ddc9 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Tue, 29 Apr 2025 11:52:22 +0100 Subject: [PATCH 23/31] pro --- packages/pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pro b/packages/pro index f27612865c..72655ddbe0 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit f27612865cd5f689b75b8f4e148293dff3b77bc4 +Subproject commit 72655ddbe0f4350d937fed48f6685f3250c1b7d6 From 341d1daa4b5a9550e79d20b052ba7bd17ba40102 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Tue, 29 Apr 2025 12:05:13 +0100 Subject: [PATCH 24/31] Respond to feedback. --- packages/builder/src/components/common/ai/AIInput.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/builder/src/components/common/ai/AIInput.svelte b/packages/builder/src/components/common/ai/AIInput.svelte index f553cf8ded..079d0344b3 100644 --- a/packages/builder/src/components/common/ai/AIInput.svelte +++ b/packages/builder/src/components/common/ai/AIInput.svelte @@ -28,7 +28,7 @@ $: aiEnabled = $auth?.user?.llm $: creditsExceeded = $licensing.aiCreditsExceeded - $: disabled = !aiEnabled || creditsExceeded || readonly || promptLoading + $: disabled = !aiEnabled || creditsExceeded || readonly $: animateBorder = !disabled && expanded $: canSubmit = !readonly && !!value @@ -106,7 +106,7 @@ class="prompt-input" {placeholder} on:keydown={handleKeyPress} - {disabled} + disabled={disabled || promptLoading} /> {:else} @@ -331,7 +331,7 @@ } .ai-icon.loading { - animation: spin 1s cubic-bezier(0.075, 0.82, 0.165, 1) infinite; + animation: spin 1s ease-in-out infinite; } @keyframes spin { @@ -339,7 +339,7 @@ transform: rotate(0deg); } to { - transform: rotate(90deg); + transform: rotate(360deg); } } From a18c1deaffadad0a7c0c3339ce153a6e743f773b Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Tue, 29 Apr 2025 12:17:16 +0100 Subject: [PATCH 25/31] Update pro reference. --- packages/pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pro b/packages/pro index 6c9ccbb8a5..72655ddbe0 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit 6c9ccbb8a5737733448f6b0e23696de1ed343015 +Subproject commit 72655ddbe0f4350d937fed48f6685f3250c1b7d6 From 96b17b313e0d29bf61965183c5ee1910b335b01b Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Tue, 29 Apr 2025 12:25:09 +0100 Subject: [PATCH 26/31] active submit button when prompt has characters --- packages/builder/src/components/common/ai/AIInput.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/builder/src/components/common/ai/AIInput.svelte b/packages/builder/src/components/common/ai/AIInput.svelte index c2cb259383..9f75e5d2ef 100644 --- a/packages/builder/src/components/common/ai/AIInput.svelte +++ b/packages/builder/src/components/common/ai/AIInput.svelte @@ -153,7 +153,7 @@ {:else} Date: Tue, 29 Apr 2025 12:29:22 +0100 Subject: [PATCH 27/31] Quiet lint warning. --- .../builder/src/components/commandPalette/CommandPalette.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/builder/src/components/commandPalette/CommandPalette.svelte b/packages/builder/src/components/commandPalette/CommandPalette.svelte index e1d8f5f6a4..427b1e960f 100644 --- a/packages/builder/src/components/commandPalette/CommandPalette.svelte +++ b/packages/builder/src/components/commandPalette/CommandPalette.svelte @@ -376,6 +376,7 @@ {command.type}: 
+ {@html command.name}
From a5eefbff3ddfe52ecbe9afa629e2281d4797c129 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 29 Apr 2025 12:48:03 +0100 Subject: [PATCH 28/31] Revert changes to layout --- .../builder/src/pages/builder/portal/_layout.svelte | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/builder/src/pages/builder/portal/_layout.svelte b/packages/builder/src/pages/builder/portal/_layout.svelte index e49dc8b3f3..323b231037 100644 --- a/packages/builder/src/pages/builder/portal/_layout.svelte +++ b/packages/builder/src/pages/builder/portal/_layout.svelte @@ -93,10 +93,8 @@
-
- +
@@ -158,13 +156,6 @@ .desktop { display: contents; } - .right { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - gap: var(--spacing-m); - } @media (max-width: 640px) { .mobile { From 234bb3bc9590db107a1e13bac079b68cf19037f5 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 29 Apr 2025 14:06:32 +0200 Subject: [PATCH 29/31] Submodule update --- packages/pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pro b/packages/pro index d633ccabd7..cf45e608e3 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit d633ccabd774b9ed0e674a49b99696d0c7df912e +Subproject commit cf45e608e393a7fc33d69e7a37b918aecac51100 From d4f96400ca9ce8188dbffbe416ed1f35d2899f12 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 29 Apr 2025 14:10:19 +0200 Subject: [PATCH 30/31] fix after merge --- packages/server/src/api/controllers/row/internal.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/server/src/api/controllers/row/internal.ts b/packages/server/src/api/controllers/row/internal.ts index e193f2e968..07c72490ac 100644 --- a/packages/server/src/api/controllers/row/internal.ts +++ b/packages/server/src/api/controllers/row/internal.ts @@ -91,6 +91,7 @@ export async function patch(ctx: UserCtx) { const result = await finaliseRow(source, row, { updateFormula: true, + updateAIColumns: true, }) return { ...result, oldRow } From eb47c2818ff7608a098828bbdbea2fa407eddf69 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 29 Apr 2025 14:18:04 +0200 Subject: [PATCH 31/31] Fix test --- packages/server/src/api/routes/tests/ai.spec.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/server/src/api/routes/tests/ai.spec.ts b/packages/server/src/api/routes/tests/ai.spec.ts index 3919f599c3..8628fa505d 100644 --- a/packages/server/src/api/routes/tests/ai.spec.ts +++ b/packages/server/src/api/routes/tests/ai.spec.ts @@ -470,7 +470,9 @@ describe("BudibaseAI", () => { ) => mockChatGPTResponse(JSON.stringify(aiColumnGeneration), { format: zodResponseFormat( - ai.aiColumnSchemas(generationStructure), + ai.aiColumnSchemas( + ai.aiTableResponseToTableSchema(generationStructure) + ), "key" ), }) @@ -684,7 +686,7 @@ describe("BudibaseAI", () => { }, }, ], - "Employees 2": [ + Employees: [ { "First Name": "Joshua", "Last Name": "Lee",