mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-28 15:16:00 +00:00
clickAction refactor, settings - open detail after keyboard navigation
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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)" />
|
||||||
|
|||||||
@@ -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)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}}
|
}}
|
||||||
|
|||||||
Reference in New Issue
Block a user