database search

This commit is contained in:
Jan Prochazka
2021-09-28 09:15:14 +02:00
parent 1c8e69225d
commit 8ef8685e4e
2 changed files with 116 additions and 54 deletions

View File

@@ -352,6 +352,24 @@
{ forceNewTab } { forceNewTab }
); );
} }
export function handleDatabaseObjectClick(data, forceNewTab = false) {
const { schemaName, pureName, conid, database, objectTypeField } = data;
openDatabaseObjectDetail(
defaultTabs[objectTypeField],
defaultTabs[objectTypeField] ? null : 'CREATE OBJECT',
{
schemaName,
pureName,
conid,
database,
objectTypeField,
},
forceNewTab,
null
);
}
</script> </script>
<script lang="ts"> <script lang="ts">
@@ -378,34 +396,7 @@
export let data; export let data;
function handleClick(forceNewTab = false) { function handleClick(forceNewTab = false) {
const { schemaName, pureName, conid, database, objectTypeField } = data; handleDatabaseObjectClick(data, forceNewTab);
openDatabaseObjectDetail(
defaultTabs[objectTypeField],
defaultTabs[objectTypeField] ? null : 'CREATE OBJECT',
{
schemaName,
pureName,
conid,
database,
objectTypeField,
},
forceNewTab,
null
);
// openNewTab({
// title: data.pureName,
// icon: 'img table',
// tabComponent: 'TableDataTab',
// props: {
// schemaName,
// pureName,
// conid,
// database,
// objectTypeField,
// },
// });
} }
const getDriver = async () => { const getDriver = async () => {

View File

@@ -12,6 +12,19 @@
onClick: () => visibleCommandPalette.set(true), onClick: () => visibleCommandPalette.set(true),
testEnabled: () => !getVisibleCommandPalette(), testEnabled: () => !getVisibleCommandPalette(),
}); });
registerCommand({
id: 'database.search',
category: 'Database',
name: 'Search',
keyText: 'Ctrl+P',
onClick: () => visibleCommandPalette.set(true),
testEnabled: () => !getVisibleCommandPalette(),
});
function extractDbItems(db) {
return db?.tables?.map(table => ({ text: table.pureName, onClick: () => handleDatabaseObjectClick(table) }));
}
</script> </script>
<script> <script>
@@ -19,13 +32,22 @@
import _ from 'lodash'; import _ from 'lodash';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import { commands, commandsCustomized, getVisibleCommandPalette, visibleCommandPalette } from '../stores'; import FontIcon from '../icons/FontIcon.svelte';
import {
commands,
commandsCustomized,
currentDatabase,
getVisibleCommandPalette,
visibleCommandPalette,
} from '../stores';
import clickOutside from '../utility/clickOutside'; import clickOutside from '../utility/clickOutside';
import keycodes from '../utility/keycodes'; import keycodes from '../utility/keycodes';
import { useDatabaseInfo } from '../utility/metadataLoaders';
import registerCommand from './registerCommand'; import registerCommand from './registerCommand';
let domInput; let domInput;
let filter = ''; let filter = '';
let selectedPage = 'menu';
const domItems = {}; const domItems = {};
$: selectedIndex = true ? 0 : filter; $: selectedIndex = true ? 0 : filter;
@@ -44,9 +66,16 @@
'text' 'text'
); );
$: filteredItems = (parentCommand ? parentCommand.getSubCommands() : sortedComands).filter( $: conid = _.get($currentDatabase, 'connection._id');
x => !x.isGroupCommand && filterName(filter, x.text) $: database = _.get($currentDatabase, 'name');
); $: databaseInfo = useDatabaseInfo({ conid, database });
$: filteredItems = (selectedPage == 'database'
? extractDbItems($databaseInfo)
: parentCommand
? parentCommand.getSubCommands()
: sortedComands
).filter(x => !x.isGroupCommand && filterName(filter, x.text));
function handleCommand(command) { function handleCommand(command) {
if (command.getSubCommands) { if (command.getSubCommands) {
@@ -78,29 +107,53 @@
</script> </script>
<div class="main" use:clickOutside on:clickOutside={() => ($visibleCommandPalette = false)}> <div class="main" use:clickOutside on:clickOutside={() => ($visibleCommandPalette = false)}>
<div class="search"> <div class="pages">
<input <div
type="text" class="page"
bind:this={domInput} class:selected={selectedPage == 'menu'}
bind:value={filter} on:click={() => {
on:keydown={handleKeyDown} selectedPage = 'menu';
placeholder={parentCommand?.text || ''} domInput.focus();
/> }}
>
<FontIcon icon="icon menu" /> Commands
</div>
<div
class="page"
class:selected={selectedPage == 'database'}
on:click={() => {
selectedPage = 'database';
domInput.focus();
}}
>
<FontIcon icon="icon database" /> Database
</div>
</div> </div>
<div class="content"> <div class="mainInner">
{#each filteredItems as command, index} <div class="search">
<div <input
class="command" type="text"
class:selected={index == selectedIndex} bind:this={domInput}
on:click={() => handleCommand(command)} bind:value={filter}
bind:this={domItems[index]} on:keydown={handleKeyDown}
> placeholder={parentCommand?.text || ''}
<div>{command.text}</div> />
{#if command.keyText} </div>
<div class="shortcut">{command.keyText}</div> <div class="content">
{/if} {#each filteredItems as command, index}
</div> <div
{/each} class="command"
class:selected={index == selectedIndex}
on:click={() => handleCommand(command)}
bind:this={domItems[index]}
>
<div>{command.text}</div>
{#if command.keyText}
<div class="shortcut">{command.keyText}</div>
{/if}
</div>
{/each}
</div>
</div> </div>
</div> </div>
@@ -108,6 +161,9 @@
.main { .main {
width: 500px; width: 500px;
background: var(--theme-bg-2); background: var(--theme-bg-2);
}
.mainInner {
padding: 5px; padding: 5px;
} }
@@ -135,4 +191,19 @@
.shortcut { .shortcut {
background: var(--theme-bg-3); background: var(--theme-bg-3);
} }
.pages {
display: flex;
}
.page {
padding: 5px;
border: 1px solid var(--theme-border);
cursor: pointer;
}
.page:hover {
color: var(--theme-font-hover);
}
.page.selected {
background: var(--theme-bg-1);
}
</style> </style>