clickAction refactor, settings - open detail after keyboard navigation

This commit is contained in:
Jan Prochazka
2024-12-18 08:08:45 +01:00
parent 57da9c9885
commit e63f1f8f09
7 changed files with 87 additions and 31 deletions

View File

@@ -887,7 +887,35 @@
return createDatabaseObjectMenu(data); return createDatabaseObjectMenu(data);
} }
export function handleObjectClick(data, { forceNewTab = false, tabPreviewMode = false, focusTab = false }) { export function handleObjectClick(data, clickAction) {
// on:click={() => handleObjectClick(data, { tabPreviewMode: true })}
// on:middleclick={() => handleObjectClick(data, { forceNewTab: true })}
// on:dblclick={() => handleObjectClick(data, { tabPreviewMode: false, focusTab: true })}
const openDetailOnArrows = getOpenDetailOnArrowsSettings();
let forceNewTab = false;
let tabPreviewMode = false;
let focusTab = false;
switch (clickAction) {
case 'leftClick':
tabPreviewMode = true;
break;
case 'middleClick':
forceNewTab = true;
break;
case 'dblClick':
focusTab = true;
break;
case 'keyEnter':
focusTab = true;
break;
case 'keyArrow':
if (!openDetailOnArrows) return;
tabPreviewMode = true;
break;
}
return handleDatabaseObjectClick(data, { forceNewTab, tabPreviewMode, focusTab }); return handleDatabaseObjectClick(data, { forceNewTab, tabPreviewMode, focusTab });
} }
</script> </script>
@@ -939,16 +967,12 @@
import { openImportExportTab } from '../utility/importExportTools'; import { openImportExportTab } from '../utility/importExportTools';
import { defaultDatabaseObjectAppObjectActions, matchDatabaseObjectAppObject } from './appObjectTools'; import { defaultDatabaseObjectAppObjectActions, matchDatabaseObjectAppObject } from './appObjectTools';
import { getSupportedScriptTemplates } from '../utility/applyScriptTemplate'; import { getSupportedScriptTemplates } from '../utility/applyScriptTemplate';
import { getBoolSettingsValue } from '../settings/settingsTools'; import { getBoolSettingsValue, getOpenDetailOnArrowsSettings } from '../settings/settingsTools';
import { isProApp } from '../utility/proTools'; import { isProApp } from '../utility/proTools';
export let data; export let data;
export let passProps; export let passProps;
function handleClick({ forceNewTab = false, tabPreviewMode = false, focusTab = false } = {}) {
handleDatabaseObjectClick(data, { forceNewTab, tabPreviewMode, focusTab });
}
function createMenu() { function createMenu() {
return createDatabaseObjectMenu(data, passProps?.connection); return createDatabaseObjectMenu(data, passProps?.connection);
} }
@@ -983,9 +1007,9 @@
onUnpin={isPinned ? () => pinnedTables.update(list => list.filter(x => !testEqual(x, data))) : null} onUnpin={isPinned ? () => pinnedTables.update(list => list.filter(x => !testEqual(x, data))) : null}
extInfo={getExtInfo(data)} extInfo={getExtInfo(data)}
isChoosed={matchDatabaseObjectAppObject($selectedDatabaseObjectAppObject, data)} isChoosed={matchDatabaseObjectAppObject($selectedDatabaseObjectAppObject, data)}
on:click={() => handleClick({ tabPreviewMode: true })} on:click={() => handleObjectClick(data, 'leftClick')}
on:middleclick={() => handleClick({ forceNewTab: true })} on:middleclick={() => handleObjectClick(data, 'middleClick')}
on:dblclick={() => handleClick({ tabPreviewMode: false, focusTab: true })} on:dblclick={() => handleObjectClick(data, 'dblClick')}
on:expand on:expand
on:dragstart on:dragstart
on:dragenter on:dragenter

View File

@@ -344,6 +344,13 @@ ORDER BY
to open the table from the "Tables" view, a new tab is dedicated to that table. to open the table from the "Tables" view, a new tab is dedicated to that table.
</div> </div>
<FormCheckboxField
name="behaviour.openDetailOnArrows"
label="Open detail on keyboard navigation"
defaultValue={true}
disabled={values['behaviour.useTabPreviewMode'] === false}
/>
<div class="heading">Confirmations</div> <div class="heading">Confirmations</div>
<FormCheckboxField name="skipConfirm.tableDataSave" label="Skip confirmation when saving table data (SQL)" /> <FormCheckboxField name="skipConfirm.tableDataSave" label="Skip confirmation when saving table data (SQL)" />

View File

@@ -36,3 +36,10 @@ export function getConnectionClickActionSetting(): 'connect' | 'openDetails' | '
export function getDatabaseClickActionSetting(): 'switch' | 'none' { export function getDatabaseClickActionSetting(): 'switch' | 'none' {
return getStringSettingsValue('defaultAction.databaseClick', 'switch'); return getStringSettingsValue('defaultAction.databaseClick', 'switch');
} }
export function getOpenDetailOnArrowsSettings(): boolean {
return (
getBoolSettingsValue('behaviour.useTabPreviewMode', true) &&
getBoolSettingsValue('behaviour.openDetailOnArrows', true)
);
}

View File

@@ -41,7 +41,7 @@
if (listInstance[newIndex]) { if (listInstance[newIndex]) {
selectedObjectStore.set(listInstance[newIndex]); selectedObjectStore.set(listInstance[newIndex]);
handleObjectClick?.(listInstance[newIndex], { tabPreviewMode: true }); handleObjectClick?.(listInstance[newIndex], 'keyArrow');
} }
if (newIndex == 0) { if (newIndex == 0) {
@@ -58,7 +58,7 @@
ev.preventDefault(); ev.preventDefault();
} }
if (ev.keyCode == keycodes.enter) { if (ev.keyCode == keycodes.enter) {
handleObjectClick?.(getSelectedObject(), { tabPreviewMode: false, focusTab: true }); handleObjectClick?.(getSelectedObject(), 'keyEnter');
ev.preventDefault(); ev.preventDefault();
} }
if (ev.keyCode == keycodes.pageDown) { if (ev.keyCode == keycodes.pageDown) {
@@ -72,14 +72,14 @@
if (ev.keyCode == keycodes.home) { if (ev.keyCode == keycodes.home) {
if (listInstance[0]) { if (listInstance[0]) {
selectedObjectStore.set(listInstance[0]); selectedObjectStore.set(listInstance[0]);
handleObjectClick?.(listInstance[0], { tabPreviewMode: true }); handleObjectClick?.(listInstance[0], 'keyArrow');
onScrollTop?.(); onScrollTop?.();
} }
} }
if (ev.keyCode == keycodes.end) { if (ev.keyCode == keycodes.end) {
if (listInstance[listInstance.length - 1]) { if (listInstance[listInstance.length - 1]) {
selectedObjectStore.set(listInstance[listInstance.length - 1]); selectedObjectStore.set(listInstance[listInstance.length - 1]);
handleObjectClick?.(listInstance[listInstance.length - 1], { tabPreviewMode: true }); handleObjectClick?.(listInstance[listInstance.length - 1], 'keyArrow');
} }
} }
if (ev.keyCode == keycodes.numPadAdd) { if (ev.keyCode == keycodes.numPadAdd) {
@@ -110,7 +110,7 @@
domDiv?.focus(); domDiv?.focus();
if (listInstance[0]) { if (listInstance[0]) {
selectedObjectStore.set(listInstance[0]); selectedObjectStore.set(listInstance[0]);
handleObjectClick?.(listInstance[0], { tabPreviewMode: true }); handleObjectClick?.(listInstance[0], 'keyArrow');
onScrollTop?.(); onScrollTop?.();
} }
} }
@@ -130,7 +130,7 @@
const index2 = _.findIndex(listInstance, x => selectedObjectMatcher(x, focused)); const index2 = _.findIndex(listInstance, x => selectedObjectMatcher(x, focused));
if (index2 >= 0) { if (index2 >= 0) {
selectedObjectStore.set(focused); selectedObjectStore.set(focused);
handleObjectClick?.(focused, { tabPreviewMode: true }); handleObjectClick?.(focused, 'keyArrow');
return; return;
} }
} }

View File

@@ -40,7 +40,12 @@
import { switchCurrentDatabase } from '../utility/common'; import { switchCurrentDatabase } from '../utility/common';
import openNewTab from '../utility/openNewTab'; import openNewTab from '../utility/openNewTab';
import { openConnection } from '../appobj/ConnectionAppObject.svelte'; import { openConnection } from '../appobj/ConnectionAppObject.svelte';
import { getConnectionClickActionSetting } from '../settings/settingsTools'; import {
getBoolSettingsValue,
getConnectionClickActionSetting,
getDatabaseClickActionSetting,
getOpenDetailOnArrowsSettings,
} from '../settings/settingsTools';
import DropDownButton from '../buttons/DropDownButton.svelte'; import DropDownButton from '../buttons/DropDownButton.svelte';
const connections = useConnectionList(); const connections = useConnectionList();
@@ -258,30 +263,35 @@
onFocusFilterBox={text => { onFocusFilterBox={text => {
domFilter?.focus(text); domFilter?.focus(text);
}} }}
handleObjectClick={(data, options) => { handleObjectClick={(data, clickAction) => {
const connectionClickAction = getConnectionClickActionSetting(); const connectionClickAction = getConnectionClickActionSetting();
const databaseClickAction = getDatabaseClickActionSetting();
const openDetailOnArrows = getOpenDetailOnArrowsSettings();
if (data.database) { if (data.database) {
if (options.focusTab) { if (databaseClickAction == 'switch' && clickAction == 'leftClick') {
if ($openedSingleDatabaseConnections.includes(data.conid)) {
switchCurrentDatabase({ connection: data.connection, name: data.database });
} else {
switchCurrentDatabase({ connection: data.connection, name: data.database }); switchCurrentDatabase({ connection: data.connection, name: data.database });
} }
// console.log('FOCUSING DB', passProps);
// passProps?.onFocusSqlObjectList?.(); if (clickAction == 'keyEnter' || clickAction == 'dblClick') {
switchCurrentDatabase({ connection: data.connection, name: data.database });
} }
} else { } else {
if (options.focusTab) { if (clickAction == 'keyEnter' || clickAction == 'dblClick') {
openConnection(data.connection); openConnection(data.connection);
} else { } else {
const config = getCurrentConfig(); const config = getCurrentConfig();
if (config.runAsPortal == false && !config.storageDatabase && connectionClickAction == 'openDetails') { if (
config.runAsPortal == false &&
!config.storageDatabase &&
connectionClickAction == 'openDetails' &&
(clickAction == 'leftClick' || (clickAction == 'keyArrow' && openDetailOnArrows))
) {
openNewTab({ openNewTab({
title: getConnectionLabel(data.connection), title: getConnectionLabel(data.connection),
icon: 'img connection', icon: 'img connection',
tabComponent: 'ConnectionTab', tabComponent: 'ConnectionTab',
tabPreviewMode: options.tabPreviewMode, tabPreviewMode: true,
props: { props: {
conid: data.conid, conid: data.conid,
}, },

View File

@@ -13,6 +13,7 @@
import { filterName } from 'dbgate-tools'; import { filterName } from 'dbgate-tools';
import { currentDatabase, focusedConnectionOrDatabase, getFocusedConnectionOrDatabase } from '../stores'; import { currentDatabase, focusedConnectionOrDatabase, getFocusedConnectionOrDatabase } from '../stores';
import { switchCurrentDatabase } from '../utility/common'; import { switchCurrentDatabase } from '../utility/common';
import { getConnectionClickActionSetting, getDatabaseClickActionSetting } from '../settings/settingsTools';
export let connection; export let connection;
@@ -81,9 +82,16 @@
onFocusFilterBox={text => { onFocusFilterBox={text => {
domFilter?.focus(text); domFilter?.focus(text);
}} }}
handleObjectClick={(data, options) => { handleObjectClick={(data, clickAction) => {
const connectionClickAction = getConnectionClickActionSetting();
const databaseClickAction = getDatabaseClickActionSetting();
if (data.database) { if (data.database) {
if (options.focusTab) { if (databaseClickAction == 'switch' && clickAction == 'leftClick') {
switchCurrentDatabase({ connection: data.connection, name: data.database });
}
if (clickAction == 'keyEnter' || clickAction == 'dblClick') {
switchCurrentDatabase({ connection: data.connection, name: data.database }); switchCurrentDatabase({ connection: data.connection, name: data.database });
} }
} }

View File

@@ -249,7 +249,7 @@
selectedObjectStore={selectedDatabaseObjectAppObject} selectedObjectStore={selectedDatabaseObjectAppObject}
getSelectedObject={getSelectedDatabaseObjectAppObject} getSelectedObject={getSelectedDatabaseObjectAppObject}
selectedObjectMatcher={matchDatabaseObjectAppObject} selectedObjectMatcher={matchDatabaseObjectAppObject}
handleObjectClick={(data, options) => databaseObjectAppObject.handleObjectClick(data, options)} handleObjectClick={(data, clickAction) => databaseObjectAppObject.handleObjectClick(data, clickAction)}
onScrollTop={() => { onScrollTop={() => {
domContainer?.scrollTop(); domContainer?.scrollTop();
}} }}