query designer context menu

This commit is contained in:
Jan Prochazka
2020-12-30 09:50:46 +01:00
parent b87f51c5b5
commit 2f6c749941
4 changed files with 64 additions and 21 deletions

View File

@@ -11,6 +11,7 @@ import useShowModal from '../modals/showModal';
import { findEngineDriver } from 'dbgate-tools'; import { findEngineDriver } from 'dbgate-tools';
import useExtensions from '../utility/useExtensions'; import useExtensions from '../utility/useExtensions';
import useOpenNewTab from '../utility/useOpenNewTab'; import useOpenNewTab from '../utility/useOpenNewTab';
import uuidv1 from 'uuid/v1';
const icons = { const icons = {
tables: 'img table', tables: 'img table',
@@ -45,6 +46,10 @@ const menus = {
label: 'Open active chart', label: 'Open active chart',
isActiveChart: true, isActiveChart: true,
}, },
{
label: 'Query designer',
isQueryDesigner: true,
},
], ],
views: [ views: [
{ {
@@ -75,6 +80,10 @@ const menus = {
label: 'Open active chart', label: 'Open active chart',
isActiveChart: true, isActiveChart: true,
}, },
{
label: 'Query designer',
isQueryDesigner: true,
},
], ],
procedures: [ procedures: [
{ {
@@ -199,6 +208,30 @@ function Menu({ data }) {
}, },
} }
); );
} else if (menu.isQueryDesigner) {
openNewTab(
{
title: data.pureName,
icon: 'img query-design',
tabComponent: 'QueryDesignTab',
props: {
conid: data.conid,
database: data.database,
},
},
{
editor: {
tables: [
{
...data,
designerId: uuidv1(),
left: 50,
top: 50,
},
],
},
}
);
} else { } else {
openDatabaseObjectDetail(openNewTab, menu.tab, menu.sqlTemplate, data); openDatabaseObjectDetail(openNewTab, menu.tab, menu.sqlTemplate, data);
} }

View File

@@ -37,13 +37,15 @@ export default function Designer({ value, onChange, conid, database }) {
if (!data) return; if (!data) return;
const rect = e.target.getBoundingClientRect(); const rect = e.target.getBoundingClientRect();
var json = JSON.parse(data); var json = JSON.parse(data);
const { objectTypeField } = json;
if (objectTypeField != 'tables' && objectTypeField != 'views') return;
json.designerId = uuidv1(); json.designerId = uuidv1();
json.left = e.clientX - rect.left; json.left = e.clientX - rect.left;
json.top = e.clientY - rect.top; json.top = e.clientY - rect.top;
onChange((current) => { onChange((current) => {
const foreignKeys = _.compact([ const foreignKeys = _.compact([
...json.foreignKeys.map((fk) => { ...(json.foreignKeys || []).map((fk) => {
const tables = (current.tables || []).filter( const tables = (current.tables || []).filter(
(tbl) => fk.refTableName == tbl.pureName && fk.refSchemaName == tbl.schemaName (tbl) => fk.refTableName == tbl.pureName && fk.refSchemaName == tbl.schemaName
); );

View File

@@ -2,6 +2,7 @@ import React from 'react';
import DataFilterControl from '../datagrid/DataFilterControl'; import DataFilterControl from '../datagrid/DataFilterControl';
import { CheckboxField, SelectField, TextField } from '../utility/inputs'; import { CheckboxField, SelectField, TextField } from '../utility/inputs';
import TableControl, { TableColumn } from '../utility/TableControl'; import TableControl, { TableColumn } from '../utility/TableControl';
import InlineButton from '../widgets/InlineButton';
import { findDesignerFilterType } from './designerTools'; import { findDesignerFilterType } from './designerTools';
function getTableDisplayName(column, tables) { function getTableDisplayName(column, tables) {
@@ -15,15 +16,26 @@ export default function QueryDesignColumns({ value, onChange }) {
const changeColumn = React.useCallback( const changeColumn = React.useCallback(
(col) => { (col) => {
const newValue = { onChange((current) => ({
...value, ...current,
columns: (value.columns || []).map((x) => columns: (current.columns || []).map((x) =>
x.designerId == col.designerId && x.columnName == col.columnName ? col : x x.designerId == col.designerId && x.columnName == col.columnName ? col : x
), ),
}; }));
onChange(newValue);
}, },
[onChange, value] [onChange]
);
const removeColumn = React.useCallback(
(col) => {
onChange((current) => ({
...current,
columns: (current.columns || []).filter(
(x) => x.designerId != col.designerId || x.columnName != col.columnName
),
}));
},
[onChange]
); );
return ( return (
@@ -124,6 +136,15 @@ export default function QueryDesignColumns({ value, onChange }) {
/> />
)} )}
/> />
<TableColumn
fieldName="actions"
header=""
formatter={(row) => (
<>
<InlineButton onClick={() => removeColumn(row)}>Remove</InlineButton>
</>
)}
/>
</TableControl> </TableControl>
); );
} }

View File

@@ -18,7 +18,6 @@ import SaveTabModal from '../modals/SaveTabModal';
import useModalState from '../modals/useModalState'; import useModalState from '../modals/useModalState';
import sqlFormatter from 'sql-formatter'; import sqlFormatter from 'sql-formatter';
import useEditorData from '../utility/useEditorData'; import useEditorData from '../utility/useEditorData';
import applySqlTemplate from '../utility/applySqlTemplate';
import LoadingInfo from '../widgets/LoadingInfo'; import LoadingInfo from '../widgets/LoadingInfo';
import useExtensions from '../utility/useExtensions'; import useExtensions from '../utility/useExtensions';
import QueryDesigner from '../designer/QueryDesigner'; import QueryDesigner from '../designer/QueryDesigner';
@@ -26,15 +25,7 @@ import QueryDesignColumns from '../designer/QueryDesignColumns';
import { findEngineDriver } from 'dbgate-tools'; import { findEngineDriver } from 'dbgate-tools';
import { generateDesignedQuery } from '../designer/designerTools'; import { generateDesignedQuery } from '../designer/designerTools';
export default function QueryDesignTab({ export default function QueryDesignTab({ tabid, conid, database, tabVisible, toolbarPortalRef, ...other }) {
tabid,
conid,
database,
initialArgs,
tabVisible,
toolbarPortalRef,
...other
}) {
const [sessionId, setSessionId] = React.useState(null); const [sessionId, setSessionId] = React.useState(null);
const [executeNumber, setExecuteNumber] = React.useState(0); const [executeNumber, setExecuteNumber] = React.useState(0);
const setOpenedTabs = useSetOpenedTabs(); const setOpenedTabs = useSetOpenedTabs();
@@ -47,10 +38,6 @@ export default function QueryDesignTab({
const [sqlPreview, setSqlPreview] = React.useState(''); const [sqlPreview, setSqlPreview] = React.useState('');
const { editorData, setEditorData, isLoading } = useEditorData({ const { editorData, setEditorData, isLoading } = useEditorData({
tabid, tabid,
loadFromArgs:
initialArgs && initialArgs.sqlTemplate
? () => applySqlTemplate(initialArgs.sqlTemplate, extensions, { conid, database, ...other })
: null,
}); });
const editorRef = React.useRef(null); const editorRef = React.useRef(null);