tables keyboard navigation

This commit is contained in:
Jan Prochazka
2024-11-22 09:45:01 +01:00
parent a497467137
commit 1a930acf0a
4 changed files with 56 additions and 8 deletions

View File

@@ -28,6 +28,7 @@
export let emptyGroupNames = []; export let emptyGroupNames = [];
export let collapsedGroupNames = writable([]); export let collapsedGroupNames = writable([]);
export let onChangeFilteredList;
$: filtered = !groupFunc $: filtered = !groupFunc
? list.filter(data => { ? list.filter(data => {

View File

@@ -8,15 +8,31 @@
export let selectedObjectMatcher; export let selectedObjectMatcher;
export let module; export let module;
export let onScrollTop = null;
let isListFocused = false; let isListFocused = false;
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 && list[index + diff]) { if (index >= 0) {
selectedObjectStore.set(list[index + diff]); let newIndex = index + diff;
module.handleObjectClick(list[index + diff], { tabPreviewMode: true }); if (newIndex >= list.length) {
newIndex = list.length - 1;
}
if (newIndex < 0) {
newIndex = 0;
}
if (list[newIndex]) {
selectedObjectStore.set(list[newIndex]);
module.handleObjectClick(list[newIndex], { tabPreviewMode: true });
}
if (newIndex == 0 && onScrollTop) {
onScrollTop();
}
} }
} }
if (ev.keyCode == keycodes.upArrow) { if (ev.keyCode == keycodes.upArrow) {
@@ -31,6 +47,27 @@
module.handleObjectClick(getSelectedObject(), { tabPreviewMode: false, focusTab: true }); module.handleObjectClick(getSelectedObject(), { tabPreviewMode: false, focusTab: true });
ev.preventDefault(); ev.preventDefault();
} }
if (ev.keyCode == keycodes.pageDown) {
selectByDiff(10);
ev.preventDefault();
}
if (ev.keyCode == keycodes.pageUp) {
selectByDiff(-10);
ev.preventDefault();
}
if (ev.keyCode == keycodes.home) {
if (list[0]) {
selectedObjectStore.set(list[0]);
module.handleObjectClick(list[0], { tabPreviewMode: true });
onScrollTop?.();
}
}
if (ev.keyCode == keycodes.end) {
if (list[list.length - 1]) {
selectedObjectStore.set(list[list.length - 1]);
module.handleObjectClick(list[list.length - 1], { tabPreviewMode: true });
}
}
} }
</script> </script>

View File

@@ -55,6 +55,7 @@
export let database; export let database;
let filter = ''; let filter = '';
let domContainer = null;
$: objects = useDatabaseInfo({ conid, database }); $: objects = useDatabaseInfo({ conid, database });
$: status = useDatabaseStatus({ conid, database }); $: status = useDatabaseStatus({ conid, database });
@@ -175,18 +176,19 @@
negativeMarginTop negativeMarginTop
/> />
<WidgetsInnerContainer> <WidgetsInnerContainer bind:this={domContainer}>
{#if ($status && ($status.name == 'pending' || $status.name == 'checkStructure' || $status.name == 'loadStructure') && $objects) || !$objects} {#if ($status && ($status.name == 'pending' || $status.name == 'checkStructure' || $status.name == 'loadStructure') && $objects) || !$objects}
<LoadingInfo message={$status?.feedback?.analysingMessage || 'Loading database structure'} /> <LoadingInfo message={$status?.feedback?.analysingMessage || 'Loading database structure'} />
{:else} {:else}
<AppObjectListHandler <AppObjectListHandler
list={objectList list={flatFilteredList.map(x => ({ ...x, conid, database }))}
.filter(x => ($appliedCurrentSchema ? x.schemaName == $appliedCurrentSchema : true))
.map(x => ({ ...x, conid, database }))}
selectedObjectStore={selectedDatabaseObjectAppObject} selectedObjectStore={selectedDatabaseObjectAppObject}
getSelectedObject={getSelectedDatabaseObjectAppObject} getSelectedObject={getSelectedDatabaseObjectAppObject}
selectedObjectMatcher={matchDatabaseObjectAppObject} selectedObjectMatcher={matchDatabaseObjectAppObject}
module={databaseObjectAppObject} module={databaseObjectAppObject}
onScrollTop={() => {
domContainer?.scrollTop();
}}
> >
<AppObjectList <AppObjectList
list={objectList list={objectList

View File

@@ -1,4 +1,12 @@
<div on:drop><slot /></div> <script lang="ts">
let domDiv;
export function scrollTop() {
domDiv.scrollTop = 0;
}
</script>
<div on:drop bind:this={domDiv}><slot /></div>
<style> <style>
div { div {