diff --git a/frontend/src/lib/components/AppConnectDrawer.svelte b/frontend/src/lib/components/AppConnectDrawer.svelte
index 67c19b0fe7..a6a55f7392 100644
--- a/frontend/src/lib/components/AppConnectDrawer.svelte
+++ b/frontend/src/lib/components/AppConnectDrawer.svelte
@@ -6,7 +6,7 @@
import DrawerContent from './common/drawer/DrawerContent.svelte'
import AppConnectInner from './AppConnectInner.svelte'
- import DarkModeObserver from './DarkModeObserver.svelte'
+ import GoogleSigninButton from './GoogleSigninButton.svelte'
import IconedResourceType from './IconedResourceType.svelte'
import { addResourceTitle } from './resourceTypeDisplay'
@@ -22,6 +22,10 @@
disableChatOffset = false
}: Props = $props()
+ /** Set by `open(rt, fillPath)`, not by the parent: which resource this run fills is a
+ * property of the click, and a prop would go stale between two different rows. */
+ let fillPath: string | undefined = $state(undefined)
+
let drawer: Drawer | undefined = $state()
let resourceType = $state('')
let step = $state(1)
@@ -32,29 +36,39 @@
let appConnectInner: AppConnectInner | undefined = $state(undefined)
let rtToLoad: string | undefined = $state('')
- export async function open(rt?: string) {
+ /** `fill` connects into a resource that already exists, instead of creating one. */
+ export async function open(rt?: string, fill?: string) {
+ fillPath = fill
rtToLoad = rt
drawer?.openDrawer?.()
}
+ /**
+ * Once per opening. The reactive statement below re-runs both when `rtToLoad` changes and
+ * when `appConnectInner` binds, and a second `open()` runs `next()` a second time — which
+ * walks a resource type opened with one straight past the Connect button and into
+ * `window.open`. A popup opened from a reactive effect rather than the click is blocked,
+ * so the drawer then sits on "Finish connection in popup window" with no popup.
+ */
+ let openedFor: string | undefined = undefined
function onRtToLoadChange(rtToLoad: string | undefined) {
+ if (openedFor === rtToLoad) return
+ openedFor = rtToLoad
appConnectInner?.open(rtToLoad)
}
const dispatch = createEventDispatcher()
- let darkMode: boolean = $state(false)
run(() => {
appConnectInner && onRtToLoadChange(rtToLoad)
})
-
-
{
step = 1
+ openedFor = undefined
dispatch('close')
}}
size="700px"
@@ -83,22 +97,26 @@
on:refresh
express={expressOAuthSetup}
{workspace}
+ {fillPath}
/>
{#snippet actions()}