mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-27 19:36:00 +00:00
openNewTab refactor
This commit is contained in:
@@ -1,13 +1,12 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
||||||
import { openNewTab } from '../utility/common';
|
|
||||||
import { filterName } from 'dbgate-datalib';
|
import { filterName } from 'dbgate-datalib';
|
||||||
import axios from '../utility/axios';
|
import axios from '../utility/axios';
|
||||||
import { useSetOpenedTabs } from '../utility/globalState';
|
|
||||||
import { AppObjectCore } from './AppObjectCore';
|
import { AppObjectCore } from './AppObjectCore';
|
||||||
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
|
|
||||||
function openArchive(setOpenedTabs, fileName, folderName) {
|
function openArchive(openNewTab, fileName, folderName) {
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab({
|
||||||
title: fileName,
|
title: fileName,
|
||||||
icon: 'img archive',
|
icon: 'img archive',
|
||||||
tooltip: `${folderName}\n${fileName}`,
|
tooltip: `${folderName}\n${fileName}`,
|
||||||
@@ -19,18 +18,19 @@ function openArchive(setOpenedTabs, fileName, folderName) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function Menu({ data, setOpenedTabs }) {
|
function Menu({ data }) {
|
||||||
|
const openNewTab = useOpenNewTab();
|
||||||
const handleDelete = () => {
|
const handleDelete = () => {
|
||||||
axios.post('archive/delete-file', { file: data.fileName, folder: data.folderName });
|
axios.post('archive/delete-file', { file: data.fileName, folder: data.folderName });
|
||||||
// setOpenedTabs((tabs) => tabs.filter((x) => x.tabid != data.tabid));
|
// setOpenedTabs((tabs) => tabs.filter((x) => x.tabid != data.tabid));
|
||||||
};
|
};
|
||||||
const handleOpenRead = () => {
|
const handleOpenRead = () => {
|
||||||
openArchive(setOpenedTabs, data.fileName, data.folderName);
|
openArchive(openNewTab, data.fileName, data.folderName);
|
||||||
};
|
};
|
||||||
const handleOpenWrite = async () => {
|
const handleOpenWrite = async () => {
|
||||||
// const resp = await axios.post('archive/load-free-table', { file: data.fileName, folder: data.folderName });
|
// const resp = await axios.post('archive/load-free-table', { file: data.fileName, folder: data.folderName });
|
||||||
|
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab({
|
||||||
title: data.fileName,
|
title: data.fileName,
|
||||||
icon: 'img archive',
|
icon: 'img archive',
|
||||||
tabComponent: 'FreeTableTab',
|
tabComponent: 'FreeTableTab',
|
||||||
@@ -59,9 +59,9 @@ function Menu({ data, setOpenedTabs }) {
|
|||||||
|
|
||||||
function ArchiveFileAppObject({ data, commonProps }) {
|
function ArchiveFileAppObject({ data, commonProps }) {
|
||||||
const { fileName, folderName } = data;
|
const { fileName, folderName } = data;
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
const onClick = () => {
|
const onClick = () => {
|
||||||
openArchive(setOpenedTabs, fileName, folderName);
|
openArchive(openNewTab, fileName, folderName);
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -1,24 +1,25 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
||||||
import { openNewTab } from '../utility/common';
|
|
||||||
import ImportExportModal from '../modals/ImportExportModal';
|
import ImportExportModal from '../modals/ImportExportModal';
|
||||||
import { getDefaultFileFormat } from '../utility/fileformats';
|
import { getDefaultFileFormat } from '../utility/fileformats';
|
||||||
import { useCurrentDatabase, useSetOpenedTabs } from '../utility/globalState';
|
import { useCurrentDatabase } from '../utility/globalState';
|
||||||
import { AppObjectCore } from './AppObjectCore';
|
import { AppObjectCore } from './AppObjectCore';
|
||||||
import useShowModal from '../modals/showModal';
|
import useShowModal from '../modals/showModal';
|
||||||
import useExtensions from '../utility/useExtensions';
|
import useExtensions from '../utility/useExtensions';
|
||||||
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
|
|
||||||
function Menu({ data }) {
|
function Menu({ data }) {
|
||||||
const { connection, name } = data;
|
const { connection, name } = data;
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
|
|
||||||
const extensions = useExtensions();
|
const extensions = useExtensions();
|
||||||
const showModal = useShowModal();
|
const showModal = useShowModal();
|
||||||
|
|
||||||
const tooltip = `${connection.displayName || connection.server}\n${name}`;
|
const tooltip = `${connection.displayName || connection.server}\n${name}`;
|
||||||
|
|
||||||
const handleNewQuery = () => {
|
const handleNewQuery = () => {
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab({
|
||||||
title: 'Query',
|
title: 'Query',
|
||||||
icon: 'img sql-file',
|
icon: 'img sql-file',
|
||||||
tooltip,
|
tooltip,
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
||||||
import { openNewTab } from '../utility/common';
|
|
||||||
import { getConnectionInfo } from '../utility/metadataLoaders';
|
import { getConnectionInfo } from '../utility/metadataLoaders';
|
||||||
import fullDisplayName from '../utility/fullDisplayName';
|
import fullDisplayName from '../utility/fullDisplayName';
|
||||||
import { filterName } from 'dbgate-datalib';
|
import { filterName } from 'dbgate-datalib';
|
||||||
@@ -11,6 +10,7 @@ import { AppObjectCore } from './AppObjectCore';
|
|||||||
import useShowModal from '../modals/showModal';
|
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';
|
||||||
|
|
||||||
const icons = {
|
const icons = {
|
||||||
tables: 'img table',
|
tables: 'img table',
|
||||||
@@ -100,7 +100,7 @@ const defaultTabs = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export async function openDatabaseObjectDetail(
|
export async function openDatabaseObjectDetail(
|
||||||
setOpenedTabs,
|
openNewTab,
|
||||||
tabComponent,
|
tabComponent,
|
||||||
sqlTemplate,
|
sqlTemplate,
|
||||||
{ schemaName, pureName, conid, database, objectTypeField }
|
{ schemaName, pureName, conid, database, objectTypeField }
|
||||||
@@ -111,7 +111,7 @@ export async function openDatabaseObjectDetail(
|
|||||||
pureName,
|
pureName,
|
||||||
})}`;
|
})}`;
|
||||||
|
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab({
|
||||||
title: pureName,
|
title: pureName,
|
||||||
tooltip,
|
tooltip,
|
||||||
icon: sqlTemplate ? 'img sql-file' : icons[objectTypeField],
|
icon: sqlTemplate ? 'img sql-file' : icons[objectTypeField],
|
||||||
@@ -129,7 +129,7 @@ export async function openDatabaseObjectDetail(
|
|||||||
|
|
||||||
function Menu({ data }) {
|
function Menu({ data }) {
|
||||||
const showModal = useShowModal();
|
const showModal = useShowModal();
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
const extensions = useExtensions();
|
const extensions = useExtensions();
|
||||||
|
|
||||||
const getDriver = async () => {
|
const getDriver = async () => {
|
||||||
@@ -160,7 +160,7 @@ function Menu({ data }) {
|
|||||||
));
|
));
|
||||||
} else if (menu.isOpenFreeTable) {
|
} else if (menu.isOpenFreeTable) {
|
||||||
const coninfo = await getConnectionInfo(data);
|
const coninfo = await getConnectionInfo(data);
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab({
|
||||||
title: data.pureName,
|
title: data.pureName,
|
||||||
icon: 'img free-table',
|
icon: 'img free-table',
|
||||||
tabComponent: 'FreeTableTab',
|
tabComponent: 'FreeTableTab',
|
||||||
@@ -183,7 +183,6 @@ function Menu({ data }) {
|
|||||||
const dmp = driver.createDumper();
|
const dmp = driver.createDumper();
|
||||||
dmp.put('^select * from %f', data);
|
dmp.put('^select * from %f', data);
|
||||||
openNewTab(
|
openNewTab(
|
||||||
setOpenedTabs,
|
|
||||||
{
|
{
|
||||||
title: data.pureName,
|
title: data.pureName,
|
||||||
icon: 'img chart',
|
icon: 'img chart',
|
||||||
@@ -199,7 +198,7 @@ function Menu({ data }) {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
openDatabaseObjectDetail(setOpenedTabs, menu.tab, menu.sqlTemplate, data);
|
openDatabaseObjectDetail(openNewTab, menu.tab, menu.sqlTemplate, data);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -212,10 +211,10 @@ function Menu({ data }) {
|
|||||||
|
|
||||||
function DatabaseObjectAppObject({ data, commonProps }) {
|
function DatabaseObjectAppObject({ data, commonProps }) {
|
||||||
const { conid, database, pureName, schemaName, objectTypeField } = data;
|
const { conid, database, pureName, schemaName, objectTypeField } = data;
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
const onClick = ({ schemaName, pureName }) => {
|
const onClick = ({ schemaName, pureName }) => {
|
||||||
openDatabaseObjectDetail(
|
openDatabaseObjectDetail(
|
||||||
setOpenedTabs,
|
openNewTab,
|
||||||
defaultTabs[objectTypeField],
|
defaultTabs[objectTypeField],
|
||||||
defaultTabs[objectTypeField] ? null : 'CREATE OBJECT',
|
defaultTabs[objectTypeField] ? null : 'CREATE OBJECT',
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,13 +4,13 @@ import _ from 'lodash';
|
|||||||
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
||||||
import { AppObjectCore } from './AppObjectCore';
|
import { AppObjectCore } from './AppObjectCore';
|
||||||
import useNewQuery from '../query/useNewQuery';
|
import useNewQuery from '../query/useNewQuery';
|
||||||
import { openNewTab } from '../utility/common';
|
|
||||||
import { useCurrentDatabase, useSetOpenedTabs } from '../utility/globalState';
|
import { useCurrentDatabase, useSetOpenedTabs } from '../utility/globalState';
|
||||||
import ScriptWriter from '../impexp/ScriptWriter';
|
import ScriptWriter from '../impexp/ScriptWriter';
|
||||||
import { extractPackageName } from 'dbgate-tools';
|
import { extractPackageName } from 'dbgate-tools';
|
||||||
import useShowModal from '../modals/showModal';
|
import useShowModal from '../modals/showModal';
|
||||||
import InputTextModal from '../modals/InputTextModal';
|
import InputTextModal from '../modals/InputTextModal';
|
||||||
import useHasPermission from '../utility/useHasPermission';
|
import useHasPermission from '../utility/useHasPermission';
|
||||||
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
|
|
||||||
function Menu({ data, menuExt = null }) {
|
function Menu({ data, menuExt = null }) {
|
||||||
const hasPermission = useHasPermission();
|
const hasPermission = useHasPermission();
|
||||||
@@ -68,7 +68,7 @@ export function SavedSqlFileAppObject({ data, commonProps }) {
|
|||||||
const { file, folder } = data;
|
const { file, folder } = data;
|
||||||
const newQuery = useNewQuery();
|
const newQuery = useNewQuery();
|
||||||
const currentDatabase = useCurrentDatabase();
|
const currentDatabase = useCurrentDatabase();
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
|
|
||||||
const connection = _.get(currentDatabase, 'connection');
|
const connection = _.get(currentDatabase, 'connection');
|
||||||
const database = _.get(currentDatabase, 'name');
|
const database = _.get(currentDatabase, 'name');
|
||||||
@@ -85,7 +85,6 @@ export function SavedSqlFileAppObject({ data, commonProps }) {
|
|||||||
script.requirePackage(extractPackageName(conn.engine));
|
script.requirePackage(extractPackageName(conn.engine));
|
||||||
|
|
||||||
openNewTab(
|
openNewTab(
|
||||||
setOpenedTabs,
|
|
||||||
{
|
{
|
||||||
title: 'Shell',
|
title: 'Shell',
|
||||||
icon: 'img shell',
|
icon: 'img shell',
|
||||||
@@ -118,7 +117,8 @@ export function SavedSqlFileAppObject({ data, commonProps }) {
|
|||||||
|
|
||||||
export function SavedShellFileAppObject({ data, commonProps }) {
|
export function SavedShellFileAppObject({ data, commonProps }) {
|
||||||
const { file, folder } = data;
|
const { file, folder } = data;
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SavedFileAppObjectBase
|
<SavedFileAppObjectBase
|
||||||
data={data}
|
data={data}
|
||||||
@@ -127,7 +127,6 @@ export function SavedShellFileAppObject({ data, commonProps }) {
|
|||||||
icon="img shell"
|
icon="img shell"
|
||||||
onLoad={(data) => {
|
onLoad={(data) => {
|
||||||
openNewTab(
|
openNewTab(
|
||||||
setOpenedTabs,
|
|
||||||
{
|
{
|
||||||
title: file,
|
title: file,
|
||||||
icon: 'img shell',
|
icon: 'img shell',
|
||||||
@@ -142,7 +141,7 @@ export function SavedShellFileAppObject({ data, commonProps }) {
|
|||||||
|
|
||||||
export function SavedChartFileAppObject({ data, commonProps }) {
|
export function SavedChartFileAppObject({ data, commonProps }) {
|
||||||
const { file, folder } = data;
|
const { file, folder } = data;
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
|
|
||||||
const currentDatabase = useCurrentDatabase();
|
const currentDatabase = useCurrentDatabase();
|
||||||
|
|
||||||
@@ -159,7 +158,6 @@ export function SavedChartFileAppObject({ data, commonProps }) {
|
|||||||
icon="img chart"
|
icon="img chart"
|
||||||
onLoad={(data) => {
|
onLoad={(data) => {
|
||||||
openNewTab(
|
openNewTab(
|
||||||
setOpenedTabs,
|
|
||||||
{
|
{
|
||||||
title: file,
|
title: file,
|
||||||
icon: 'img chart',
|
icon: 'img chart',
|
||||||
@@ -179,10 +177,10 @@ export function SavedChartFileAppObject({ data, commonProps }) {
|
|||||||
|
|
||||||
export function SavedMarkdownFileAppObject({ data, commonProps }) {
|
export function SavedMarkdownFileAppObject({ data, commonProps }) {
|
||||||
const { file, folder } = data;
|
const { file, folder } = data;
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
|
|
||||||
const showPage = () => {
|
const showPage = () => {
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab({
|
||||||
title: file,
|
title: file,
|
||||||
icon: 'img markdown',
|
icon: 'img markdown',
|
||||||
tabComponent: 'MarkdownViewTab',
|
tabComponent: 'MarkdownViewTab',
|
||||||
@@ -199,7 +197,6 @@ export function SavedMarkdownFileAppObject({ data, commonProps }) {
|
|||||||
icon="img markdown"
|
icon="img markdown"
|
||||||
onLoad={(data) => {
|
onLoad={(data) => {
|
||||||
openNewTab(
|
openNewTab(
|
||||||
setOpenedTabs,
|
|
||||||
{
|
{
|
||||||
title: file,
|
title: file,
|
||||||
icon: 'img markdown',
|
icon: 'img markdown',
|
||||||
|
|||||||
@@ -25,11 +25,11 @@ import InlineButton from '../widgets/InlineButton';
|
|||||||
import DataGridContextMenu from './DataGridContextMenu';
|
import DataGridContextMenu from './DataGridContextMenu';
|
||||||
import LoadingInfo from '../widgets/LoadingInfo';
|
import LoadingInfo from '../widgets/LoadingInfo';
|
||||||
import ErrorInfo from '../widgets/ErrorInfo';
|
import ErrorInfo from '../widgets/ErrorInfo';
|
||||||
import { openNewTab } from '../utility/common';
|
|
||||||
import { useSetOpenedTabs } from '../utility/globalState';
|
import { useSetOpenedTabs } from '../utility/globalState';
|
||||||
import { FontIcon } from '../icons';
|
import { FontIcon } from '../icons';
|
||||||
import useTheme from '../theme/useTheme';
|
import useTheme from '../theme/useTheme';
|
||||||
import { useShowMenu } from '../modals/showMenu';
|
import { useShowMenu } from '../modals/showMenu';
|
||||||
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
|
|
||||||
const GridContainer = styled.div`
|
const GridContainer = styled.div`
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -118,7 +118,7 @@ export default function DataGridCore(props) {
|
|||||||
} = props;
|
} = props;
|
||||||
// console.log('RENDER GRID', display.baseTable.pureName);
|
// console.log('RENDER GRID', display.baseTable.pureName);
|
||||||
const columns = React.useMemo(() => display.allColumns, [display]);
|
const columns = React.useMemo(() => display.allColumns, [display]);
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
|
|
||||||
// usePropsCompare(props);
|
// usePropsCompare(props);
|
||||||
|
|
||||||
@@ -335,7 +335,6 @@ export default function DataGridCore(props) {
|
|||||||
|
|
||||||
const handleOpenFreeTable = () => {
|
const handleOpenFreeTable = () => {
|
||||||
openNewTab(
|
openNewTab(
|
||||||
setOpenedTabs,
|
|
||||||
{
|
{
|
||||||
title: 'selection',
|
title: 'selection',
|
||||||
icon: 'img free-table',
|
icon: 'img free-table',
|
||||||
@@ -348,7 +347,6 @@ export default function DataGridCore(props) {
|
|||||||
|
|
||||||
const handleOpenChart = () => {
|
const handleOpenChart = () => {
|
||||||
openNewTab(
|
openNewTab(
|
||||||
setOpenedTabs,
|
|
||||||
{
|
{
|
||||||
title: 'Chart',
|
title: 'Chart',
|
||||||
icon: 'img chart',
|
icon: 'img chart',
|
||||||
|
|||||||
@@ -6,13 +6,13 @@ import useSocket from '../utility/SocketProvider';
|
|||||||
import useShowModal from '../modals/showModal';
|
import useShowModal from '../modals/showModal';
|
||||||
import ImportExportModal from '../modals/ImportExportModal';
|
import ImportExportModal from '../modals/ImportExportModal';
|
||||||
import { changeSetToSql, createChangeSet, getChangeSetInsertedRows } from 'dbgate-datalib';
|
import { changeSetToSql, createChangeSet, getChangeSetInsertedRows } from 'dbgate-datalib';
|
||||||
import { openNewTab } from '../utility/common';
|
|
||||||
import LoadingDataGridCore from './LoadingDataGridCore';
|
import LoadingDataGridCore from './LoadingDataGridCore';
|
||||||
import ChangeSetGrider from './ChangeSetGrider';
|
import ChangeSetGrider from './ChangeSetGrider';
|
||||||
import { scriptToSql } from 'dbgate-sqltree';
|
import { scriptToSql } from 'dbgate-sqltree';
|
||||||
import useModalState from '../modals/useModalState';
|
import useModalState from '../modals/useModalState';
|
||||||
import ConfirmSqlModal from '../modals/ConfirmSqlModal';
|
import ConfirmSqlModal from '../modals/ConfirmSqlModal';
|
||||||
import ErrorMessageModal from '../modals/ErrorMessageModal';
|
import ErrorMessageModal from '../modals/ErrorMessageModal';
|
||||||
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
|
|
||||||
/** @param props {import('./types').DataGridProps} */
|
/** @param props {import('./types').DataGridProps} */
|
||||||
async function loadDataPage(props, offset, limit) {
|
async function loadDataPage(props, offset, limit) {
|
||||||
@@ -62,7 +62,7 @@ async function loadRowCount(props) {
|
|||||||
export default function SqlDataGridCore(props) {
|
export default function SqlDataGridCore(props) {
|
||||||
const { conid, database, display, changeSetState, dispatchChangeSet } = props;
|
const { conid, database, display, changeSetState, dispatchChangeSet } = props;
|
||||||
const showModal = useShowModal();
|
const showModal = useShowModal();
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
|
|
||||||
const confirmSqlModalState = useModalState();
|
const confirmSqlModalState = useModalState();
|
||||||
const [confirmSql, setConfirmSql] = React.useState('');
|
const [confirmSql, setConfirmSql] = React.useState('');
|
||||||
@@ -82,7 +82,6 @@ export default function SqlDataGridCore(props) {
|
|||||||
}
|
}
|
||||||
function openActiveChart() {
|
function openActiveChart() {
|
||||||
openNewTab(
|
openNewTab(
|
||||||
setOpenedTabs,
|
|
||||||
{
|
{
|
||||||
title: 'Chart',
|
title: 'Chart',
|
||||||
icon: 'img chart',
|
icon: 'img chart',
|
||||||
@@ -101,7 +100,7 @@ export default function SqlDataGridCore(props) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
function openQuery() {
|
function openQuery() {
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab({
|
||||||
title: 'Query',
|
title: 'Query',
|
||||||
icon: 'img sql-file',
|
icon: 'img sql-file',
|
||||||
tabComponent: 'QueryTab',
|
tabComponent: 'QueryTab',
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import { useSetOpenedTabs } from '../utility/globalState';
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
import { openNewTab } from '../utility/common';
|
|
||||||
|
|
||||||
export default function useNewFreeTable() {
|
export default function useNewFreeTable() {
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
|
|
||||||
return ({ title = undefined, ...props } = {}) =>
|
return ({ title = undefined, ...props } = {}) =>
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab({
|
||||||
title: title || 'Table',
|
title: title || 'Table',
|
||||||
icon: 'img free-table',
|
icon: 'img free-table',
|
||||||
tabComponent: 'FreeTableTab',
|
tabComponent: 'FreeTableTab',
|
||||||
|
|||||||
@@ -1,19 +1,18 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useCurrentDatabase, useSetOpenedTabs } from '../utility/globalState';
|
import { useCurrentDatabase, useSetOpenedTabs } from '../utility/globalState';
|
||||||
import { openNewTab } from '../utility/common';
|
|
||||||
import axios from '../utility/axios';
|
import axios from '../utility/axios';
|
||||||
import useTheme from '../theme/useTheme';
|
import useTheme from '../theme/useTheme';
|
||||||
import { StyledThemedLink } from '../widgets/FormStyledButton';
|
import { StyledThemedLink } from '../widgets/FormStyledButton';
|
||||||
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
|
|
||||||
export default function OpenChartLink({ file, children }) {
|
export default function OpenChartLink({ file, children }) {
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
const currentDb = useCurrentDatabase();
|
const currentDb = useCurrentDatabase();
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
|
|
||||||
const handleClick = async () => {
|
const handleClick = async () => {
|
||||||
const resp = await axios.post('files/load', { folder: 'charts', file, format: 'json' });
|
const resp = await axios.post('files/load', { folder: 'charts', file, format: 'json' });
|
||||||
openNewTab(
|
openNewTab(
|
||||||
setOpenedTabs,
|
|
||||||
{
|
{
|
||||||
title: file,
|
title: file,
|
||||||
icon: 'img chart',
|
icon: 'img chart',
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import ModalFooter from './ModalFooter';
|
|||||||
import ModalContent from './ModalContent';
|
import ModalContent from './ModalContent';
|
||||||
import ImportExportConfigurator from '../impexp/ImportExportConfigurator';
|
import ImportExportConfigurator from '../impexp/ImportExportConfigurator';
|
||||||
import createImpExpScript from '../impexp/createImpExpScript';
|
import createImpExpScript from '../impexp/createImpExpScript';
|
||||||
import { openNewTab } from '../utility/common';
|
|
||||||
import { useCurrentArchive, useSetCurrentArchive, useSetCurrentWidget, useSetOpenedTabs } from '../utility/globalState';
|
import { useCurrentArchive, useSetCurrentArchive, useSetCurrentWidget, useSetOpenedTabs } from '../utility/globalState';
|
||||||
import RunnerOutputPane from '../query/RunnerOutputPane';
|
import RunnerOutputPane from '../query/RunnerOutputPane';
|
||||||
import axios from '../utility/axios';
|
import axios from '../utility/axios';
|
||||||
@@ -25,6 +24,7 @@ import { getDefaultFileFormat } from '../utility/fileformats';
|
|||||||
import useExtensions from '../utility/useExtensions';
|
import useExtensions from '../utility/useExtensions';
|
||||||
import { FormProvider, useForm } from '../utility/FormProvider';
|
import { FormProvider, useForm } from '../utility/FormProvider';
|
||||||
import { FormTextField } from '../utility/forms';
|
import { FormTextField } from '../utility/forms';
|
||||||
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
|
|
||||||
const headerHeight = '60px';
|
const headerHeight = '60px';
|
||||||
const footerHeight = '100px';
|
const footerHeight = '100px';
|
||||||
@@ -92,14 +92,13 @@ const FooterButtons = styled.div`
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
function GenerateSctriptButton({ modalState }) {
|
function GenerateSctriptButton({ modalState }) {
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
const { values } = useForm();
|
const { values } = useForm();
|
||||||
const extensions = useExtensions();
|
const extensions = useExtensions();
|
||||||
|
|
||||||
const handleGenerateScript = async () => {
|
const handleGenerateScript = async () => {
|
||||||
const code = await createImpExpScript(extensions, values);
|
const code = await createImpExpScript(extensions, values);
|
||||||
openNewTab(
|
openNewTab(
|
||||||
setOpenedTabs,
|
|
||||||
{
|
{
|
||||||
title: 'Shell',
|
title: 'Shell',
|
||||||
icon: 'img shell',
|
icon: 'img shell',
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import useTheme from '../theme/useTheme';
|
import useTheme from '../theme/useTheme';
|
||||||
import { openNewTab } from '../utility/common';
|
|
||||||
import { useSetOpenedTabs } from '../utility/globalState';
|
import { useSetOpenedTabs } from '../utility/globalState';
|
||||||
import { extractPluginIcon, extractPluginAuthor } from '../plugins/manifestExtractors';
|
import { extractPluginIcon, extractPluginAuthor } from '../plugins/manifestExtractors';
|
||||||
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
|
|
||||||
const Wrapper = styled.div`
|
const Wrapper = styled.div`
|
||||||
margin: 1px 3px 10px 5px;
|
margin: 1px 3px 10px 5px;
|
||||||
@@ -43,8 +43,8 @@ const Version = styled.div`
|
|||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
function openPlugin(setOpenedTabs, packageManifest) {
|
function openPlugin(openNewTab, packageManifest) {
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab({
|
||||||
title: packageManifest.name,
|
title: packageManifest.name,
|
||||||
icon: 'icon plugin',
|
icon: 'icon plugin',
|
||||||
tabComponent: 'PluginTab',
|
tabComponent: 'PluginTab',
|
||||||
@@ -55,10 +55,10 @@ function openPlugin(setOpenedTabs, packageManifest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function PluginsListItem({ packageManifest }) {
|
function PluginsListItem({ packageManifest }) {
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
return (
|
return (
|
||||||
<Wrapper onClick={() => openPlugin(setOpenedTabs, packageManifest)} theme={theme}>
|
<Wrapper onClick={() => openPlugin(openNewTab, packageManifest)} theme={theme}>
|
||||||
<Icon src={extractPluginIcon(packageManifest)} />
|
<Icon src={extractPluginIcon(packageManifest)} />
|
||||||
<Texts>
|
<Texts>
|
||||||
<Line>
|
<Line>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import { useSetOpenedTabs, useCurrentDatabase } from '../utility/globalState';
|
import { useSetOpenedTabs, useCurrentDatabase } from '../utility/globalState';
|
||||||
import { openNewTab } from '../utility/common';
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
|
|
||||||
export default function useNewQuery() {
|
export default function useNewQuery() {
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const openNewTab = useOpenNewTab();
|
||||||
const currentDatabase = useCurrentDatabase();
|
const currentDatabase = useCurrentDatabase();
|
||||||
|
|
||||||
const connection = _.get(currentDatabase, 'connection') || {};
|
const connection = _.get(currentDatabase, 'connection') || {};
|
||||||
@@ -13,7 +13,6 @@ export default function useNewQuery() {
|
|||||||
|
|
||||||
return ({ title = undefined, initialData = undefined, ...props } = {}) =>
|
return ({ title = undefined, initialData = undefined, ...props } = {}) =>
|
||||||
openNewTab(
|
openNewTab(
|
||||||
setOpenedTabs,
|
|
||||||
{
|
{
|
||||||
title: title || 'Query',
|
title: title || 'Query',
|
||||||
icon: 'img sql-file',
|
icon: 'img sql-file',
|
||||||
|
|||||||
@@ -9,13 +9,14 @@ import SaveTabModal from '../modals/SaveTabModal';
|
|||||||
import useModalState from '../modals/useModalState';
|
import useModalState from '../modals/useModalState';
|
||||||
import LoadingInfo from '../widgets/LoadingInfo';
|
import LoadingInfo from '../widgets/LoadingInfo';
|
||||||
import { useOpenedTabs, useSetOpenedTabs } from '../utility/globalState';
|
import { useOpenedTabs, useSetOpenedTabs } from '../utility/globalState';
|
||||||
import { openNewTab } from '../utility/common';
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
|
|
||||||
export default function MarkdownEditorTab({ tabid, tabVisible, toolbarPortalRef, ...other }) {
|
export default function MarkdownEditorTab({ tabid, tabVisible, toolbarPortalRef, ...other }) {
|
||||||
const { editorData, setEditorData, isLoading, saveToStorage } = useEditorData({ tabid });
|
const { editorData, setEditorData, isLoading, saveToStorage } = useEditorData({ tabid });
|
||||||
const saveFileModalState = useModalState();
|
const saveFileModalState = useModalState();
|
||||||
const openedTabs = useOpenedTabs();
|
const openedTabs = useOpenedTabs();
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const setOpenedTabs = useSetOpenedTabs();
|
||||||
|
const openNewTab = useOpenNewTab();
|
||||||
|
|
||||||
const handleKeyDown = (data, hash, keyString, keyCode, event) => {
|
const handleKeyDown = (data, hash, keyString, keyCode, event) => {
|
||||||
if (keyCode == keycodes.f5) {
|
if (keyCode == keycodes.f5) {
|
||||||
@@ -36,7 +37,7 @@ export default function MarkdownEditorTab({ tabid, tabVisible, toolbarPortalRef,
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
const thisTab = (openedTabs || []).find((x) => x.tabid == tabid);
|
const thisTab = (openedTabs || []).find((x) => x.tabid == tabid);
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab({
|
||||||
title: thisTab.title,
|
title: thisTab.title,
|
||||||
icon: 'img preview',
|
icon: 'img preview',
|
||||||
tabComponent: 'MarkdownPreviewTab',
|
tabComponent: 'MarkdownPreviewTab',
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import uuidv1 from 'uuid/v1';
|
|
||||||
import localforage from 'localforage';
|
|
||||||
|
|
||||||
export class LoadingToken {
|
export class LoadingToken {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -15,21 +13,6 @@ export function sleep(milliseconds) {
|
|||||||
return new Promise((resolve) => window.setTimeout(() => resolve(null), milliseconds));
|
return new Promise((resolve) => window.setTimeout(() => resolve(null), milliseconds));
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function openNewTab(setOpenedTabs, newTab, initialData = undefined) {
|
|
||||||
const tabid = uuidv1();
|
|
||||||
if (initialData) {
|
|
||||||
await localforage.setItem(`tabdata_${tabid}`, initialData);
|
|
||||||
}
|
|
||||||
setOpenedTabs((files) => [
|
|
||||||
...(files || []).map((x) => ({ ...x, selected: false })),
|
|
||||||
{
|
|
||||||
tabid,
|
|
||||||
selected: true,
|
|
||||||
...newTab,
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function changeTab(tabid, setOpenedTabs, changeFunc) {
|
export function changeTab(tabid, setOpenedTabs, changeFunc) {
|
||||||
setOpenedTabs((files) => files.map((tab) => (tab.tabid == tabid ? changeFunc(tab) : tab)));
|
setOpenedTabs((files) => files.map((tab) => (tab.tabid == tabid ? changeFunc(tab) : tab)));
|
||||||
}
|
}
|
||||||
|
|||||||
28
packages/web/src/utility/useOpenNewTab.js
Normal file
28
packages/web/src/utility/useOpenNewTab.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import uuidv1 from 'uuid/v1';
|
||||||
|
import React from 'react';
|
||||||
|
import localforage from 'localforage';
|
||||||
|
import { useSetOpenedTabs } from './globalState';
|
||||||
|
|
||||||
|
export default function useOpenNewTab() {
|
||||||
|
const setOpenedTabs = useSetOpenedTabs();
|
||||||
|
|
||||||
|
const openNewTab = React.useCallback(
|
||||||
|
async (newTab, initialData = undefined) => {
|
||||||
|
const tabid = uuidv1();
|
||||||
|
if (initialData) {
|
||||||
|
await localforage.setItem(`tabdata_${tabid}`, initialData);
|
||||||
|
}
|
||||||
|
setOpenedTabs((files) => [
|
||||||
|
...(files || []).map((x) => ({ ...x, selected: false })),
|
||||||
|
{
|
||||||
|
tabid,
|
||||||
|
selected: true,
|
||||||
|
...newTab,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
[setOpenedTabs]
|
||||||
|
);
|
||||||
|
|
||||||
|
return openNewTab;
|
||||||
|
}
|
||||||
@@ -6,7 +6,6 @@ import ToolbarButton, { ToolbarButtonExternalImage } from './ToolbarButton';
|
|||||||
import useNewQuery from '../query/useNewQuery';
|
import useNewQuery from '../query/useNewQuery';
|
||||||
import { useConfig, useMarkdownManifest } from '../utility/metadataLoaders';
|
import { useConfig, useMarkdownManifest } from '../utility/metadataLoaders';
|
||||||
import { useSetOpenedTabs, useOpenedTabs, useCurrentTheme, useSetCurrentTheme } from '../utility/globalState';
|
import { useSetOpenedTabs, useOpenedTabs, useCurrentTheme, useSetCurrentTheme } from '../utility/globalState';
|
||||||
import { openNewTab } from '../utility/common';
|
|
||||||
import useNewFreeTable from '../freetable/useNewFreeTable';
|
import useNewFreeTable from '../freetable/useNewFreeTable';
|
||||||
import ImportExportModal from '../modals/ImportExportModal';
|
import ImportExportModal from '../modals/ImportExportModal';
|
||||||
import useShowModal from '../modals/showModal';
|
import useShowModal from '../modals/showModal';
|
||||||
@@ -14,6 +13,7 @@ import useExtensions from '../utility/useExtensions';
|
|||||||
import { getDefaultFileFormat } from '../utility/fileformats';
|
import { getDefaultFileFormat } from '../utility/fileformats';
|
||||||
import getElectron from '../utility/getElectron';
|
import getElectron from '../utility/getElectron';
|
||||||
import AboutModal from '../modals/AboutModal';
|
import AboutModal from '../modals/AboutModal';
|
||||||
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
|
|
||||||
const ToolbarContainer = styled.div`
|
const ToolbarContainer = styled.div`
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -28,6 +28,7 @@ export default function ToolBar({ toolbarPortalRef }) {
|
|||||||
// const toolbar = config.toolbar || [];
|
// const toolbar = config.toolbar || [];
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const setOpenedTabs = useSetOpenedTabs();
|
||||||
const openedTabs = useOpenedTabs();
|
const openedTabs = useOpenedTabs();
|
||||||
|
const openNewTab = useOpenNewTab();
|
||||||
const showModal = useShowModal();
|
const showModal = useShowModal();
|
||||||
const currentTheme = useCurrentTheme();
|
const currentTheme = useCurrentTheme();
|
||||||
const setCurrentTheme = useSetCurrentTheme();
|
const setCurrentTheme = useSetCurrentTheme();
|
||||||
@@ -68,7 +69,7 @@ export default function ToolBar({ toolbarPortalRef }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const newMarkdown = () => {
|
const newMarkdown = () => {
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab({
|
||||||
title: 'Page',
|
title: 'Page',
|
||||||
tabComponent: 'MarkdownEditorTab',
|
tabComponent: 'MarkdownEditorTab',
|
||||||
icon: 'img markdown',
|
icon: 'img markdown',
|
||||||
@@ -88,7 +89,7 @@ export default function ToolBar({ toolbarPortalRef }) {
|
|||||||
}))
|
}))
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab({
|
||||||
title: page.button || page.file,
|
title: page.button || page.file,
|
||||||
tabComponent: 'MarkdownViewTab',
|
tabComponent: 'MarkdownViewTab',
|
||||||
icon: page.icon || 'img markdown',
|
icon: page.icon || 'img markdown',
|
||||||
|
|||||||
Reference in New Issue
Block a user