mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-29 04:06:00 +00:00
tab preview mode - basic concept #767
This commit is contained in:
@@ -701,7 +701,8 @@
|
|||||||
forceNewTab?,
|
forceNewTab?,
|
||||||
initialData?,
|
initialData?,
|
||||||
icon?,
|
icon?,
|
||||||
appObjectData?
|
appObjectData?,
|
||||||
|
preventPreviewMode?
|
||||||
) {
|
) {
|
||||||
const connection = await getConnectionInfo({ conid });
|
const connection = await getConnectionInfo({ conid });
|
||||||
const tooltip = `${getConnectionLabel(connection)}\n${database}\n${fullDisplayName({
|
const tooltip = `${getConnectionLabel(connection)}\n${database}\n${fullDisplayName({
|
||||||
@@ -717,6 +718,7 @@
|
|||||||
tabComponent: scriptTemplate ? 'QueryTab' : tabComponent,
|
tabComponent: scriptTemplate ? 'QueryTab' : tabComponent,
|
||||||
appObject: 'DatabaseObjectAppObject',
|
appObject: 'DatabaseObjectAppObject',
|
||||||
appObjectData,
|
appObjectData,
|
||||||
|
tabPreviewMode: !preventPreviewMode,
|
||||||
props: {
|
props: {
|
||||||
schemaName,
|
schemaName,
|
||||||
pureName,
|
pureName,
|
||||||
@@ -731,7 +733,7 @@
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function handleDatabaseObjectClick(data, forceNewTab = false) {
|
export function handleDatabaseObjectClick(data, forceNewTab = false, preventPreviewMode = false) {
|
||||||
const { schemaName, pureName, conid, database, objectTypeField } = data;
|
const { schemaName, pureName, conid, database, objectTypeField } = data;
|
||||||
const driver = findEngineDriver(data, getExtensions());
|
const driver = findEngineDriver(data, getExtensions());
|
||||||
|
|
||||||
@@ -755,7 +757,8 @@
|
|||||||
forceNewTab,
|
forceNewTab,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
data
|
data,
|
||||||
|
preventPreviewMode
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -881,8 +884,8 @@
|
|||||||
export let data;
|
export let data;
|
||||||
export let passProps;
|
export let passProps;
|
||||||
|
|
||||||
function handleClick(forceNewTab = false) {
|
function handleClick(forceNewTab = false, preventPreviewMode = false) {
|
||||||
handleDatabaseObjectClick(data, forceNewTab);
|
handleDatabaseObjectClick(data, forceNewTab, preventPreviewMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
function createMenu() {
|
function createMenu() {
|
||||||
@@ -917,6 +920,7 @@
|
|||||||
extInfo={getExtInfo(data)}
|
extInfo={getExtInfo(data)}
|
||||||
on:click={() => handleClick()}
|
on:click={() => handleClick()}
|
||||||
on:middleclick={() => handleClick(true)}
|
on:middleclick={() => handleClick(true)}
|
||||||
|
on:dblclick={() => handleClick(false, true)}
|
||||||
on:expand
|
on:expand
|
||||||
on:dragstart
|
on:dragstart
|
||||||
on:dragenter
|
on:dragenter
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ export interface TabDefinition {
|
|||||||
tabOrder?: number;
|
tabOrder?: number;
|
||||||
multiTabIndex?: number;
|
multiTabIndex?: number;
|
||||||
unsaved?: boolean;
|
unsaved?: boolean;
|
||||||
|
tabPreviewMode?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function writableWithStorage<T>(defaultValue: T, storageName) {
|
export function writableWithStorage<T>(defaultValue: T, storageName) {
|
||||||
|
|||||||
@@ -349,6 +349,17 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleDoubleClick = (e, tabid) => {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
openedTabs.update(tabs =>
|
||||||
|
tabs.map(x => ({
|
||||||
|
...x,
|
||||||
|
tabPreviewMode: x.tabid == tabid ? false : x.tabPreviewMode,
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const getContextMenu = tab => () => {
|
const getContextMenu = tab => () => {
|
||||||
const { tabid, props, tabComponent, appObject, appObjectData } = tab;
|
const { tabid, props, tabComponent, appObject, appObjectData } = tab;
|
||||||
|
|
||||||
@@ -568,9 +579,11 @@
|
|||||||
class:selected={$draggingTab || $draggingDbGroup
|
class:selected={$draggingTab || $draggingDbGroup
|
||||||
? tab.tabid == $draggingTabTarget?.tabid
|
? tab.tabid == $draggingTabTarget?.tabid
|
||||||
: tab.tabid == shownTab?.tabid}
|
: tab.tabid == shownTab?.tabid}
|
||||||
|
class:preview={!!tab.tabPreviewMode}
|
||||||
on:click={e => handleTabClick(e, tab.tabid)}
|
on:click={e => handleTabClick(e, tab.tabid)}
|
||||||
on:mousedown={e => handleMouseDown(e, tab.tabid)}
|
on:mousedown={e => handleMouseDown(e, tab.tabid)}
|
||||||
on:mouseup={e => handleMouseUp(e, tab.tabid)}
|
on:mouseup={e => handleMouseUp(e, tab.tabid)}
|
||||||
|
on:dblclick={e => handleDoubleClick(e, tab.tabid)}
|
||||||
use:contextMenu={getContextMenu(tab)}
|
use:contextMenu={getContextMenu(tab)}
|
||||||
draggable={true}
|
draggable={true}
|
||||||
on:dragstart={async e => {
|
on:dragstart={async e => {
|
||||||
@@ -714,6 +727,9 @@
|
|||||||
.file-tab-item.selected {
|
.file-tab-item.selected {
|
||||||
background-color: var(--theme-bg-0);
|
background-color: var(--theme-bg-0);
|
||||||
}
|
}
|
||||||
|
.file-tab-item.preview {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
.file-name {
|
.file-name {
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
|||||||
@@ -30,10 +30,12 @@ export function markTabSaved(tabid) {
|
|||||||
openedTabs.update(files => files.map(tab => (tab.tabid == tabid ? { ...tab, unsaved: false } : tab)));
|
openedTabs.update(files => files.map(tab => (tab.tabid == tabid ? { ...tab, unsaved: false } : tab)));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function setSelectedTabFunc(files, tabid) {
|
export function setSelectedTabFunc(files, tabid, previewModeValue = undefined) {
|
||||||
return [
|
return [
|
||||||
...(files || []).filter(x => x.tabid != tabid).map(x => ({ ...x, selected: false })),
|
...(files || []).filter(x => x.tabid != tabid).map(x => ({ ...x, selected: false })),
|
||||||
...(files || []).filter(x => x.tabid == tabid).map(x => ({ ...x, selected: true })),
|
...(files || [])
|
||||||
|
.filter(x => x.tabid == tabid)
|
||||||
|
.map(x => ({ ...x, selected: true, tabPreviewMode: previewModeValue ?? x.tabPreviewMode })),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ export default async function openNewTab(newTab, initialData: any = undefined, o
|
|||||||
let existing = null;
|
let existing = null;
|
||||||
|
|
||||||
const { savedFile, savedFolder, savedFilePath } = newTab.props || {};
|
const { savedFile, savedFolder, savedFilePath } = newTab.props || {};
|
||||||
|
const { tabPreviewMode } = newTab;
|
||||||
if (savedFile || savedFilePath) {
|
if (savedFile || savedFilePath) {
|
||||||
existing = oldTabs.find(
|
existing = oldTabs.find(
|
||||||
x =>
|
x =>
|
||||||
@@ -49,7 +50,7 @@ export default async function openNewTab(newTab, initialData: any = undefined, o
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (existing) {
|
if (existing) {
|
||||||
openedTabs.update(tabs => setSelectedTabFunc(tabs, existing.tabid));
|
openedTabs.update(tabs => setSelectedTabFunc(tabs, existing.tabid, !tabPreviewMode ? false : undefined));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,8 +93,14 @@ export default async function openNewTab(newTab, initialData: any = undefined, o
|
|||||||
items.push(newItem);
|
items.push(newItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const filesFiltered = tabPreviewMode ? (files || []).filter(x => !x.tabPreviewMode) : files;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
...(files || []).map(x => ({ ...x, selected: false, tabOrder: _.findIndex(items, y => y.tabid == x.tabid) })),
|
...(filesFiltered || []).map(x => ({
|
||||||
|
...x,
|
||||||
|
selected: false,
|
||||||
|
tabOrder: _.findIndex(items, y => y.tabid == x.tabid),
|
||||||
|
})),
|
||||||
{
|
{
|
||||||
...newTab,
|
...newTab,
|
||||||
tabid,
|
tabid,
|
||||||
|
|||||||
Reference in New Issue
Block a user