diff --git a/packages/api/src/controllers/connections.js b/packages/api/src/controllers/connections.js index 8480c24a6..4252cc4a5 100644 --- a/packages/api/src/controllers/connections.js +++ b/packages/api/src/controllers/connections.js @@ -222,7 +222,7 @@ module.exports = { }, test_meta: true, - test(connection) { + test({ connection, requestDbList }) { const subprocess = fork( global['API_PACKAGE'] || process.argv[1], [ @@ -237,7 +237,7 @@ module.exports = { } ); pipeForkLogs(subprocess); - subprocess.send(connection); + subprocess.send({ connection, requestDbList }); return new Promise(resolve => { subprocess.on('message', resp => { if (handleProcessCommunication(resp, subprocess)) return; diff --git a/packages/api/src/proc/connectProcess.js b/packages/api/src/proc/connectProcess.js index f575acdd4..a0dbf910c 100644 --- a/packages/api/src/proc/connectProcess.js +++ b/packages/api/src/proc/connectProcess.js @@ -16,13 +16,19 @@ Platform: ${process.platform} function start() { childProcessChecker(); - process.on('message', async connection => { + process.on('message', async args => { + // @ts-ignore + const { connection, requestDbList } = args; if (handleProcessCommunication(connection)) return; try { const driver = requireEngineDriver(connection); const dbhan = await connectUtility(driver, connection, 'app'); const res = await driver.getVersion(dbhan); - process.send({ msgtype: 'connected', ...res }); + let databases = undefined; + if (requestDbList) { + databases = await driver.listDatabases(dbhan); + } + process.send({ msgtype: 'connected', ...res, databases }); await driver.close(dbhan); } catch (e) { console.error(e); diff --git a/packages/web/src/buttons/DropDownButton.svelte b/packages/web/src/buttons/DropDownButton.svelte index 07b339022..beb4a0c81 100644 --- a/packages/web/src/buttons/DropDownButton.svelte +++ b/packages/web/src/buttons/DropDownButton.svelte @@ -7,21 +7,32 @@ export let icon = 'icon chevron-down'; export let menu; + export let asyncMenu = undefined; export let narrow = false; export let square = true; export let disabled = false; - let domButton; - function handleClick() { + let domButton; + let isLoading = false; + + async function handleClick() { if (disabled) return; + let items = menu; + + if (asyncMenu) { + isLoading = true; + items = await asyncMenu(); + isLoading = false; + } + const rect = domButton.getBoundingClientRect(); const left = rect.left; const top = rect.bottom; - currentDropDownMenu.set({ left, top, items: menu }); + currentDropDownMenu.set({ left, top, items }); } - + diff --git a/packages/web/src/forms/FormDropDownTextFieldRaw.svelte b/packages/web/src/forms/FormDropDownTextFieldRaw.svelte index 8bc3ac85e..319f41680 100644 --- a/packages/web/src/forms/FormDropDownTextFieldRaw.svelte +++ b/packages/web/src/forms/FormDropDownTextFieldRaw.svelte @@ -9,6 +9,7 @@ export let disabled = false; export let defaultValue; export let menu; + export let asyncMenu; const { values, setFieldValue } = getFormContext(); @@ -26,5 +27,5 @@ value={$values[name] ?? defaultValue} on:input={e => setFieldValue(name, e.target['value'])} /> - + diff --git a/packages/web/src/settings/ConnectionDriverFields.svelte b/packages/web/src/settings/ConnectionDriverFields.svelte index 40de755ee..b88aaf147 100644 --- a/packages/web/src/settings/ConnectionDriverFields.svelte +++ b/packages/web/src/settings/ConnectionDriverFields.svelte @@ -17,7 +17,9 @@ import FontIcon from '../icons/FontIcon.svelte'; import FormDropDownTextField from '../forms/FormDropDownTextField.svelte'; - const { values } = getFormContext(); + export let getDatabaseList; + + const { values, setFieldValue } = getFormContext(); const electron = getElectron(); $: authType = $values.authType; @@ -69,6 +71,14 @@ 'me-central-1', 'sa-east-1', ]; + + async function createDatabasesMenu() { + const databases = await getDatabaseList(); + return databases.map(db => ({ + text: db.name, + onClick: () => setFieldValue('defaultDatabase', db.name), + })); + } {/if} @@ -412,7 +423,7 @@ templateProps={{ noMargin: true }} disabled={isConnected} data-testid="ConnectionDriverFields_displayName" - /> + />
x + 1); const testid = testIdRef.get(); - const resp = await apiCall('connections/test', e.detail); + const resp = await apiCall('connections/test', { connection: e.detail, requestDbList }); if (testIdRef.get() != testid) return; isTesting = false; sqlConnectResult = resp; + return resp; } function handleCancelTest() { @@ -190,6 +191,14 @@ $: isConnected = $openedConnections.includes($values._id) || $openedSingleDatabaseConnections.includes($values._id); // $: console.log('CONN VALUES', $values); + + async function getDatabaseList() { + const resp = await handleTest({ detail: getCurrentConnection() }, true); + if (resp && resp.msgtype == 'connected') { + return resp.databases; + } + return []; + } @@ -202,6 +211,7 @@ { label: 'General', component: ConnectionDriverFields, + props: { getDatabaseList }, }, driver?.showConnectionTab('sshTunnel', $values) && { label: 'SSH Tunnel', @@ -223,20 +233,24 @@
{#if onlyTestButton} {#if isTesting} - + {:else} {/if} {:else if isConnected} - + {:else} - + {#if isTesting} {:else} - + {/if} - + {/if}