ability to pin tables

This commit is contained in:
Jan Prochazka
2021-12-05 16:29:01 +01:00
parent 6f35bd5577
commit 7c8fe2a788
5 changed files with 49 additions and 6 deletions

View File

@@ -378,12 +378,22 @@
null null
); );
} }
function testEqual(a, b) {
return (
a.conid == b.conid &&
a.database == b.database &&
a.objectTypeField == b.objectTypeField &&
a.pureName == b.pureName &&
a.schemaName == b.schemaName
);
}
</script> </script>
<script lang="ts"> <script lang="ts">
import _ from 'lodash'; import _ from 'lodash';
import AppObjectCore from './AppObjectCore.svelte'; import AppObjectCore from './AppObjectCore.svelte';
import { currentDatabase, extensions, openedConnections } from '../stores'; import { currentDatabase, extensions, openedConnections, pinnedTables } from '../stores';
import openNewTab from '../utility/openNewTab'; import openNewTab from '../utility/openNewTab';
import { filterName, generateDbPairingId, getAlterDatabaseScript } from 'dbgate-tools'; import { filterName, generateDbPairingId, getAlterDatabaseScript } from 'dbgate-tools';
import { getConnectionInfo, getDatabaseInfo } from '../utility/metadataLoaders'; import { getConnectionInfo, getDatabaseInfo } from '../utility/metadataLoaders';
@@ -403,6 +413,7 @@
import ConfirmModal from '../modals/ConfirmModal.svelte'; import ConfirmModal from '../modals/ConfirmModal.svelte';
export let data; export let data;
export let passProps;
function handleClick(forceNewTab = false) { function handleClick(forceNewTab = false) {
handleDatabaseObjectClick(data, forceNewTab); handleDatabaseObjectClick(data, forceNewTab);
@@ -571,6 +582,8 @@
}; };
}); });
} }
$: isPinned = !!$pinnedTables.find(x => testEqual(data, x));
</script> </script>
<AppObjectCore <AppObjectCore
@@ -580,6 +593,9 @@
title={data.schemaName ? `${data.schemaName}.${data.pureName}` : data.pureName} title={data.schemaName ? `${data.schemaName}.${data.pureName}` : data.pureName}
icon={databaseObjectIcons[data.objectTypeField]} icon={databaseObjectIcons[data.objectTypeField]}
menu={createMenu} menu={createMenu}
showPinnedInsteadOfUnpin={passProps?.showPinnedInsteadOfUnpin}
onPin={isPinned ? null : () => pinnedTables.update(list => [...list, data])}
onUnpin={isPinned ? () => pinnedTables.update(list => list.filter(x => !testEqual(x, data))) : null}
on:click={() => handleClick()} on:click={() => handleClick()}
on:middleclick={() => handleClick(true)} on:middleclick={() => handleClick(true)}
on:expand on:expand

View File

@@ -0,0 +1,21 @@
<script lang="ts" context="module">
import DatabaseAppObject from './DatabaseAppObject.svelte';
import DatabaseObjectAppObject from './DatabaseObjectAppObject.svelte';
export const extractKey = data => {
if (data.objectTypeField) {
return `${data.objectTypeField}||${data.schemaName}||${data.pureName}`;
}
return data.connection._id;
};
</script>
<script lang="ts">
export let data;
</script>
{#if data.objectTypeField}
<DatabaseObjectAppObject {...$$props} />
{:else}
<DatabaseAppObject {...$$props} />
{/if}

View File

@@ -43,6 +43,7 @@ export const activeTabId = derived([openedTabs], ([$openedTabs]) => $openedTabs.
export const activeTab = derived([openedTabs], ([$openedTabs]) => $openedTabs.find(x => x.selected)); export const activeTab = derived([openedTabs], ([$openedTabs]) => $openedTabs.find(x => x.selected));
export const recentDatabases = writableWithStorage([], 'recentDatabases'); export const recentDatabases = writableWithStorage([], 'recentDatabases');
export const pinnedDatabases = writableWithStorage([], 'pinnedDatabases'); export const pinnedDatabases = writableWithStorage([], 'pinnedDatabases');
export const pinnedTables = writableWithStorage([], 'pinnedTables');
export const commandsSettings = derived(useSettings(), (config: any) => (config || {}).commands || {}); export const commandsSettings = derived(useSettings(), (config: any) => (config || {}).commands || {});
export const allResultsInOneTabDefault = writableWithStorage(false, 'allResultsInOneTabDefault'); export const allResultsInOneTabDefault = writableWithStorage(false, 'allResultsInOneTabDefault');
export const commandsCustomized = derived([commands, commandsSettings], ([$commands, $commandsSettings]) => export const commandsCustomized = derived([commands, commandsSettings], ([$commands, $commandsSettings]) =>

View File

@@ -2,17 +2,22 @@
import _ from 'lodash'; import _ from 'lodash';
import WidgetsInnerContainer from './WidgetsInnerContainer.svelte'; import WidgetsInnerContainer from './WidgetsInnerContainer.svelte';
import AppObjectList from '../appobj/AppObjectList.svelte'; import AppObjectList from '../appobj/AppObjectList.svelte';
import { pinnedDatabases } from '../stores'; import { currentDatabase, pinnedDatabases, pinnedTables } from '../stores';
import * as databaseAppObject from '../appobj/DatabaseAppObject.svelte'; import * as pinnedAppObject from '../appobj/PinnedAppObject.svelte';
import { useConnectionColorFactory } from '../utility/useConnectionColor'; import { useConnectionColorFactory } from '../utility/useConnectionColor';
import AboutModal from '../modals/AboutModal.svelte';
const connectionColorFactory = useConnectionColorFactory(3); const connectionColorFactory = useConnectionColorFactory(3);
$: filteredTables = $pinnedTables.filter(
x => x.conid == $currentDatabase?.connection?._id && x.database == $currentDatabase?.name
);
</script> </script>
<WidgetsInnerContainer> <WidgetsInnerContainer>
<AppObjectList <AppObjectList
list={$pinnedDatabases} list={[...$pinnedDatabases, ...filteredTables]}
module={databaseAppObject} module={pinnedAppObject}
passProps={{ connectionColorFactory: $connectionColorFactory }} passProps={{ connectionColorFactory: $connectionColorFactory }}
/> />
</WidgetsInnerContainer> </WidgetsInnerContainer>

View File

@@ -54,7 +54,6 @@
const handleRefreshDatabase = () => { const handleRefreshDatabase = () => {
axiosInstance.post('database-connections/refresh', { conid, database }); axiosInstance.post('database-connections/refresh', { conid, database });
}; };
</script> </script>
{#if $status && $status.name == 'error'} {#if $status && $status.name == 'error'}
@@ -88,6 +87,7 @@
data.objectTypeField == 'tables' || data.objectTypeField == 'views' || data.objectTypeField == 'matviews'} data.objectTypeField == 'tables' || data.objectTypeField == 'views' || data.objectTypeField == 'matviews'}
expandIconFunc={chevronExpandIcon} expandIconFunc={chevronExpandIcon}
{filter} {filter}
passProps={{ showPinnedInsteadOfUnpin: true }}
/> />
{/if} {/if}
</WidgetsInnerContainer> </WidgetsInnerContainer>