database content UX

This commit is contained in:
SPRINX0\prochazka
2025-05-26 12:58:20 +02:00
parent 366ab2e0cd
commit b3497c7306
6 changed files with 57 additions and 7 deletions

View File

@@ -1,6 +1,6 @@
DEVMODE=1 DEVMODE=1
SHELL_SCRIPTING=1 SHELL_SCRIPTING=1
LOCAL_DBGATE_CLOUD=1 # LOCAL_DBGATE_CLOUD=1
# LOCAL_DBGATE_IDENTITY=1 # LOCAL_DBGATE_IDENTITY=1
# CLOUD_UPGRADE_FILE=c:\test\upg\upgrade.zip # CLOUD_UPGRADE_FILE=c:\test\upg\upgrade.zip

View File

@@ -43,5 +43,5 @@
</WidgetColumnBarItem> </WidgetColumnBarItem>
{/if} {/if}
<DatabaseWidgetDetailContent bind:domSqlObjectList /> <DatabaseWidgetDetailContent bind:domSqlObjectList showCloudConnection={false} />
</WidgetColumnBar> </WidgetColumnBar>

View File

@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import { findEngineDriver } from 'dbgate-tools'; import { findEngineDriver } from 'dbgate-tools';
import { currentDatabase, extensions, pinnedDatabases, pinnedTables } from '../stores'; import { currentDatabase, extensions, pinnedDatabases, pinnedTables, selectedWidget } from '../stores';
import { useConnectionInfo } from '../utility/metadataLoaders'; import { useConnectionInfo } from '../utility/metadataLoaders';
import PinnedObjectsList from './PinnedObjectsList.svelte'; import PinnedObjectsList from './PinnedObjectsList.svelte';
@@ -13,14 +13,21 @@
import _ from 'lodash'; import _ from 'lodash';
import FocusedConnectionInfoWidget from './FocusedConnectionInfoWidget.svelte'; import FocusedConnectionInfoWidget from './FocusedConnectionInfoWidget.svelte';
import { _t } from '../translations'; import { _t } from '../translations';
import FormStyledButton from '../buttons/FormStyledButton.svelte';
export let domSqlObjectList = null; export let domSqlObjectList = null;
export let showCloudConnection;
$: conid = $currentDatabase?.connection?._id; $: conid = $currentDatabase?.connection?._id;
$: connection = useConnectionInfo({ conid }); $: connection = useConnectionInfo({ conid });
$: driver = findEngineDriver($connection, $extensions); $: driver = findEngineDriver($connection, $extensions);
$: singleDatabase = $currentDatabase?.connection?.singleDatabase; $: singleDatabase = $currentDatabase?.connection?.singleDatabase;
$: database = $currentDatabase?.name; $: database = $currentDatabase?.name;
$: correctCloudStatus =
!conid ||
(!showCloudConnection && !conid?.startsWith('cloud://')) ||
(showCloudConnection && conid?.startsWith('cloud://'));
</script> </script>
<WidgetColumnBarItem <WidgetColumnBarItem
@@ -30,6 +37,7 @@
storageName="pinnedItemsWidget" storageName="pinnedItemsWidget"
skip={!_.compact($pinnedDatabases).length && skip={!_.compact($pinnedDatabases).length &&
!$pinnedTables.some(x => x && x.conid == conid && x.database == $currentDatabase?.name)} !$pinnedTables.some(x => x && x.conid == conid && x.database == $currentDatabase?.name)}
positiveCondition={correctCloudStatus}
> >
<PinnedObjectsList /> <PinnedObjectsList />
</WidgetColumnBarItem> </WidgetColumnBarItem>
@@ -45,6 +53,7 @@
(database || singleDatabase) && (database || singleDatabase) &&
(driver?.databaseEngineTypes?.includes('sql') || driver?.databaseEngineTypes?.includes('document')) (driver?.databaseEngineTypes?.includes('sql') || driver?.databaseEngineTypes?.includes('document'))
)} )}
positiveCondition={correctCloudStatus}
> >
<SqlObjectList {conid} {database} bind:this={domSqlObjectList} /> <SqlObjectList {conid} {database} bind:this={domSqlObjectList} />
</WidgetColumnBarItem> </WidgetColumnBarItem>
@@ -54,6 +63,7 @@
name="dbObjects" name="dbObjects"
storageName="dbObjectsWidget" storageName="dbObjectsWidget"
skip={!(conid && (database || singleDatabase) && driver?.databaseEngineTypes?.includes('keyvalue'))} skip={!(conid && (database || singleDatabase) && driver?.databaseEngineTypes?.includes('keyvalue'))}
positiveCondition={correctCloudStatus}
> >
<DbKeysTree {conid} {database} treeKeySeparator={$connection?.treeKeySeparator || ':'} /> <DbKeysTree {conid} {database} treeKeySeparator={$connection?.treeKeySeparator || ':'} />
</WidgetColumnBarItem> </WidgetColumnBarItem>
@@ -63,6 +73,7 @@
name="dbObjects" name="dbObjects"
storageName="dbObjectsWidget" storageName="dbObjectsWidget"
skip={conid && (database || singleDatabase)} skip={conid && (database || singleDatabase)}
positiveCondition={correctCloudStatus}
> >
<WidgetsInnerContainer> <WidgetsInnerContainer>
<FocusedConnectionInfoWidget {conid} {database} connection={$connection} /> <FocusedConnectionInfoWidget {conid} {database} connection={$connection} />
@@ -76,6 +87,7 @@
name="dbObjects" name="dbObjects"
storageName="dbObjectsWidget" storageName="dbObjectsWidget"
skip={!(conid && (database || singleDatabase) && !driver)} skip={!(conid && (database || singleDatabase) && !driver)}
positiveCondition={correctCloudStatus}
> >
<WidgetsInnerContainer> <WidgetsInnerContainer>
<FocusedConnectionInfoWidget {conid} {database} connection={$connection} /> <FocusedConnectionInfoWidget {conid} {database} connection={$connection} />
@@ -85,3 +97,39 @@
/> />
</WidgetsInnerContainer> </WidgetsInnerContainer>
</WidgetColumnBarItem> </WidgetColumnBarItem>
<WidgetColumnBarItem
title={_t('widget.databaseContent', { defaultMessage: 'Database content' })}
name="incorrectClaudStatus"
height="15%"
storageName="incorrectClaudStatusWidget"
skip={correctCloudStatus}
>
<WidgetsInnerContainer>
<ErrorInfo
message={showCloudConnection
? _t('error.selectedNotCloudConnection', { defaultMessage: 'Selected connection is not from DbGate cloud' })
: _t('error.selectedCloudConnection', { defaultMessage: 'Selected connection is from DbGate cloud' })}
/>
<div class="incorrect-cloud-status-wrapper">
<FormStyledButton
value={`Show database content`}
skipWidth
on:click={() => {
$selectedWidget = conid?.startsWith('cloud://') ? 'cloud-private' : 'database';
}}
/>
</div>
</WidgetsInnerContainer>
</WidgetColumnBarItem>
<style>
.incorrect-cloud-status-wrapper {
flex: 1;
display: flex;
flex-direction: column;
align-items: stretch;
margin-top: 10px;
}
</style>

View File

@@ -225,5 +225,5 @@
</WidgetsInnerContainer> </WidgetsInnerContainer>
</WidgetColumnBarItem> </WidgetColumnBarItem>
<DatabaseWidgetDetailContent bind:domSqlObjectList /> <DatabaseWidgetDetailContent bind:domSqlObjectList showCloudConnection={true} />
</WidgetColumnBar> </WidgetColumnBar>

View File

@@ -29,7 +29,7 @@
const visibleItemsCount = defs.filter(x => !x.collapsed && !x.skip).length; const visibleItemsCount = defs.filter(x => !x.collapsed && !x.skip).length;
for (let index = 0; index < defs.length; index++) { for (let index = 0; index < defs.length; index++) {
const definition = defs[index]; const definition = defs[index];
const splitterVisible = !!defs.slice(index + 1).find(x => x && !x.collapsed && !x.skip); const splitterVisible = !!defs.slice(index + 1).find(x => x && !x.collapsed && !x.skip && x.positiveCondition);
dynamicPropsCollection[index].set({ splitterVisible, visibleItemsCount }); dynamicPropsCollection[index].set({ splitterVisible, visibleItemsCount });
} }
} }

View File

@@ -12,6 +12,7 @@
export let title; export let title;
export let name; export let name;
export let skip = false; export let skip = false;
export let positiveCondition = true;
export let height = null; export let height = null;
export let collapsed = null; export let collapsed = null;
@@ -33,11 +34,12 @@
collapsed, collapsed,
height, height,
skip, skip,
positiveCondition,
}, },
dynamicProps dynamicProps
); );
$: updateWidgetItemDefinition(widgetItemIndex, { collapsed: !visible, height, skip }); $: updateWidgetItemDefinition(widgetItemIndex, { collapsed: !visible, height, skip, positiveCondition });
$: setInitialSize(height, $widgetColumnBarHeight); $: setInitialSize(height, $widgetColumnBarHeight);
@@ -67,7 +69,7 @@
$: collapsible = $dynamicProps.visibleItemsCount != 1 || !visible; $: collapsible = $dynamicProps.visibleItemsCount != 1 || !visible;
</script> </script>
{#if !skip} {#if !skip && positiveCondition}
<WidgetTitle <WidgetTitle
clickable={collapsible} clickable={collapsible}
on:click={collapsible ? () => (visible = !visible) : null} on:click={collapsible ? () => (visible = !visible) : null}