single connection mode list handler

This commit is contained in:
SPRINX0\prochazka
2024-11-26 12:47:36 +01:00
parent 27e70e8031
commit bc9df9750f
2 changed files with 67 additions and 5 deletions

View File

@@ -12,6 +12,6 @@ DBCONFIG_mysql=[{"name":"Chinook","connectionColor":"cyan"}]
SINGLE_CONNECTION=mysql SINGLE_CONNECTION=mysql
SINGLE_DATABASE=Chinook # SINGLE_DATABASE=Chinook
PERMISSIONS=files/charts/read PERMISSIONS=files/charts/read

View File

@@ -5,28 +5,90 @@
import WidgetsInnerContainer from './WidgetsInnerContainer.svelte'; import WidgetsInnerContainer from './WidgetsInnerContainer.svelte';
import SearchBoxWrapper from '../elements/SearchBoxWrapper.svelte'; import SearchBoxWrapper from '../elements/SearchBoxWrapper.svelte';
import SubDatabaseList from '../appobj/SubDatabaseList.svelte'; import SubDatabaseList from '../appobj/SubDatabaseList.svelte';
import { openedConnections } from '../stores';
import { useConnectionColorFactory } from '../utility/useConnectionColor';
import FontIcon from '../icons/FontIcon.svelte'; import FontIcon from '../icons/FontIcon.svelte';
import CloseSearchButton from '../buttons/CloseSearchButton.svelte'; import CloseSearchButton from '../buttons/CloseSearchButton.svelte';
import { apiCall } from '../utility/api'; import { apiCall } from '../utility/api';
import AppObjectListHandler from './AppObjectListHandler.svelte';
import { useDatabaseList } from '../utility/metadataLoaders';
import { filterName } from 'dbgate-tools';
import { currentDatabase, focusedConnectionOrDatabase, getFocusedConnectionOrDatabase } from '../stores';
import { switchCurrentDatabase } from '../utility/common';
export let connection; export let connection;
let filter = ''; let filter = '';
let domListHandler;
let domContainer = null;
let domFilter = null;
$: databases = useDatabaseList({ conid: connection?._id });
const handleRefreshDatabases = () => { const handleRefreshDatabases = () => {
apiCall('server-connections/refresh', { conid: connection._id }); apiCall('server-connections/refresh', { conid: connection._id });
}; };
function getFocusFlatList() {
const res = [];
for (const db of $databases) {
if (!filterName(filter, db.name)) {
continue;
}
res.push({
connection,
conid: connection._id,
database: db.name,
});
}
return res;
}
</script> </script>
<SearchBoxWrapper> <SearchBoxWrapper>
<SearchInput placeholder="Search connection or database" bind:value={filter} /> <SearchInput
placeholder="Search connection or database"
bind:value={filter}
bind:this={domFilter}
onFocusFilteredList={() => {
domListHandler?.focusFirst();
}}
/>
<CloseSearchButton bind:filter /> <CloseSearchButton bind:filter />
<InlineButton on:click={handleRefreshDatabases} title="Refresh database list"> <InlineButton on:click={handleRefreshDatabases} title="Refresh database list">
<FontIcon icon="icon refresh" /> <FontIcon icon="icon refresh" />
</InlineButton> </InlineButton>
</SearchBoxWrapper> </SearchBoxWrapper>
<WidgetsInnerContainer> <WidgetsInnerContainer>
<SubDatabaseList data={connection} {filter} passProps={{}} /> <AppObjectListHandler
bind:this={domListHandler}
list={getFocusFlatList}
selectedObjectStore={focusedConnectionOrDatabase}
getSelectedObject={getFocusedConnectionOrDatabase}
selectedObjectMatcher={(o1, o2) => o1?.conid == o2?.conid && o1?.database == o2?.database}
getDefaultFocusedItem={() =>
$currentDatabase
? {
conid: $currentDatabase?.connection?._id,
database: $currentDatabase?.name,
connection: $currentDatabase?.connection,
}
: null}
onScrollTop={() => {
domContainer?.scrollTop();
}}
onFocusFilterBox={text => {
domFilter?.focus(text);
}}
handleObjectClick={(data, options) => {
if (data.database) {
if (options.focusTab) {
switchCurrentDatabase({ connection: data.connection, name: data.database });
}
}
}}
>
<SubDatabaseList data={connection} {filter} passProps={{}} />
</AppObjectListHandler>
</WidgetsInnerContainer> </WidgetsInnerContainer>