mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-27 20:46:00 +00:00
use keyboard for navigation between searchbox and table list
This commit is contained in:
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
$: searchValue = value || '';
|
$: searchValue = value || '';
|
||||||
export let isDebounced = false;
|
export let isDebounced = false;
|
||||||
|
export let onFocusFilteredList = null;
|
||||||
|
|
||||||
let domInput;
|
let domInput;
|
||||||
|
|
||||||
@@ -14,9 +15,17 @@
|
|||||||
if (e.keyCode == keycodes.escape) {
|
if (e.keyCode == keycodes.escape) {
|
||||||
value = '';
|
value = '';
|
||||||
}
|
}
|
||||||
|
if (e.keyCode == keycodes.downArrow) {
|
||||||
|
onFocusFilteredList?.();
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const debouncedSet = _.debounce(x => (value = x), 500);
|
const debouncedSet = _.debounce(x => (value = x), 500);
|
||||||
|
|
||||||
|
export function focus() {
|
||||||
|
domInput.focus();
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<input
|
<input
|
||||||
|
|||||||
@@ -9,13 +9,21 @@
|
|||||||
export let module;
|
export let module;
|
||||||
|
|
||||||
export let onScrollTop = null;
|
export let onScrollTop = null;
|
||||||
|
export let onFocusFilterBox = null;
|
||||||
|
|
||||||
let isListFocused = false;
|
let isListFocused = false;
|
||||||
|
let domDiv = null;
|
||||||
|
|
||||||
function handleKeyDown(ev) {
|
function handleKeyDown(ev) {
|
||||||
function selectByDiff(diff) {
|
function selectByDiff(diff) {
|
||||||
const selected = getSelectedObject();
|
const selected = getSelectedObject();
|
||||||
const index = _.findIndex(list, x => selectedObjectMatcher(x, selected));
|
const index = _.findIndex(list, x => selectedObjectMatcher(x, selected));
|
||||||
|
|
||||||
|
if (index == 0 && diff < 0) {
|
||||||
|
onFocusFilterBox?.();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
let newIndex = index + diff;
|
let newIndex = index + diff;
|
||||||
if (newIndex >= list.length) {
|
if (newIndex >= list.length) {
|
||||||
@@ -30,8 +38,8 @@
|
|||||||
module.handleObjectClick(list[newIndex], { tabPreviewMode: true });
|
module.handleObjectClick(list[newIndex], { tabPreviewMode: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newIndex == 0 && onScrollTop) {
|
if (newIndex == 0) {
|
||||||
onScrollTop();
|
onScrollTop?.();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -69,6 +77,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function focusFirst() {
|
||||||
|
domDiv?.focus();
|
||||||
|
if (list[0]) {
|
||||||
|
selectedObjectStore.set(list[0]);
|
||||||
|
module.handleObjectClick(list[0], { tabPreviewMode: true });
|
||||||
|
onScrollTop?.();
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@@ -82,6 +99,7 @@
|
|||||||
on:blur={() => {
|
on:blur={() => {
|
||||||
isListFocused = false;
|
isListFocused = false;
|
||||||
}}
|
}}
|
||||||
|
bind:this={domDiv}
|
||||||
>
|
>
|
||||||
<slot />
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -56,6 +56,8 @@
|
|||||||
|
|
||||||
let filter = '';
|
let filter = '';
|
||||||
let domContainer = null;
|
let domContainer = null;
|
||||||
|
let domFilter = null;
|
||||||
|
let domListHandler;
|
||||||
|
|
||||||
$: objects = useDatabaseInfo({ conid, database });
|
$: objects = useDatabaseInfo({ conid, database });
|
||||||
$: status = useDatabaseStatus({ conid, database });
|
$: status = useDatabaseStatus({ conid, database });
|
||||||
@@ -159,7 +161,14 @@
|
|||||||
</WidgetsInnerContainer>
|
</WidgetsInnerContainer>
|
||||||
{:else}
|
{:else}
|
||||||
<SearchBoxWrapper>
|
<SearchBoxWrapper>
|
||||||
<SearchInput placeholder="Search in tables, objects, # prefix in columns" bind:value={filter} />
|
<SearchInput
|
||||||
|
placeholder="Search in tables, objects, # prefix in columns"
|
||||||
|
bind:value={filter}
|
||||||
|
bind:this={domFilter}
|
||||||
|
onFocusFilteredList={() => {
|
||||||
|
domListHandler?.focusFirst();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
<CloseSearchButton bind:filter />
|
<CloseSearchButton bind:filter />
|
||||||
<DropDownButton icon="icon plus-thick" menu={createAddMenu} />
|
<DropDownButton icon="icon plus-thick" menu={createAddMenu} />
|
||||||
<InlineButton on:click={handleRefreshDatabase} title="Refresh database connection and object list" square>
|
<InlineButton on:click={handleRefreshDatabase} title="Refresh database connection and object list" square>
|
||||||
@@ -181,6 +190,7 @@
|
|||||||
<LoadingInfo message={$status?.feedback?.analysingMessage || 'Loading database structure'} />
|
<LoadingInfo message={$status?.feedback?.analysingMessage || 'Loading database structure'} />
|
||||||
{:else}
|
{:else}
|
||||||
<AppObjectListHandler
|
<AppObjectListHandler
|
||||||
|
bind:this={domListHandler}
|
||||||
list={flatFilteredList.map(x => ({ ...x, conid, database }))}
|
list={flatFilteredList.map(x => ({ ...x, conid, database }))}
|
||||||
selectedObjectStore={selectedDatabaseObjectAppObject}
|
selectedObjectStore={selectedDatabaseObjectAppObject}
|
||||||
getSelectedObject={getSelectedDatabaseObjectAppObject}
|
getSelectedObject={getSelectedDatabaseObjectAppObject}
|
||||||
@@ -189,6 +199,9 @@
|
|||||||
onScrollTop={() => {
|
onScrollTop={() => {
|
||||||
domContainer?.scrollTop();
|
domContainer?.scrollTop();
|
||||||
}}
|
}}
|
||||||
|
onFocusFilterBox={() => {
|
||||||
|
domFilter?.focus();
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<AppObjectList
|
<AppObjectList
|
||||||
list={objectList
|
list={objectList
|
||||||
|
|||||||
Reference in New Issue
Block a user