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,6 +107,29 @@
</script> </script>
<div class="main" use:clickOutside on:clickOutside={() => ($visibleCommandPalette = false)}> <div class="main" use:clickOutside on:clickOutside={() => ($visibleCommandPalette = false)}>
<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="mainInner">
<div class="search"> <div class="search">
<input <input
type="text" type="text"
@@ -103,11 +155,15 @@
{/each} {/each}
</div> </div>
</div> </div>
</div>
<style> <style>
.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>