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 }
);
}
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 lang="ts">
@@ -378,34 +396,7 @@
export let data;
function handleClick(forceNewTab = false) {
const { schemaName, pureName, conid, database, objectTypeField } = data;
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,
// },
// });
handleDatabaseObjectClick(data, forceNewTab);
}
const getDriver = async () => {

View File

@@ -12,6 +12,19 @@
onClick: () => visibleCommandPalette.set(true),
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>
@@ -19,13 +32,22 @@
import _ from 'lodash';
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 keycodes from '../utility/keycodes';
import { useDatabaseInfo } from '../utility/metadataLoaders';
import registerCommand from './registerCommand';
let domInput;
let filter = '';
let selectedPage = 'menu';
const domItems = {};
$: selectedIndex = true ? 0 : filter;
@@ -44,9 +66,16 @@
'text'
);
$: filteredItems = (parentCommand ? parentCommand.getSubCommands() : sortedComands).filter(
x => !x.isGroupCommand && filterName(filter, x.text)
);
$: conid = _.get($currentDatabase, 'connection._id');
$: 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) {
if (command.getSubCommands) {
@@ -78,29 +107,53 @@
</script>
<div class="main" use:clickOutside on:clickOutside={() => ($visibleCommandPalette = false)}>
<div class="search">
<input
type="text"
bind:this={domInput}
bind:value={filter}
on:keydown={handleKeyDown}
placeholder={parentCommand?.text || ''}
/>
<div class="pages">
<div
class="page"
class:selected={selectedPage == 'menu'}
on:click={() => {
selectedPage = 'menu';
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 class="content">
{#each filteredItems as command, index}
<div
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 class="mainInner">
<div class="search">
<input
type="text"
bind:this={domInput}
bind:value={filter}
on:keydown={handleKeyDown}
placeholder={parentCommand?.text || ''}
/>
</div>
<div class="content">
{#each filteredItems as command, index}
<div
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>
@@ -108,6 +161,9 @@
.main {
width: 500px;
background: var(--theme-bg-2);
}
.mainInner {
padding: 5px;
}
@@ -135,4 +191,19 @@
.shortcut {
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>