mirror of
https://github.com/dbgate/dbgate
synced 2024-11-07 20:26:23 +00:00
open data files using open dialog in electron + drag & drop in electron without uploading
This commit is contained in:
parent
5c7a011efb
commit
18bf6e5979
@ -129,7 +129,7 @@ function buildMenu() {
|
|||||||
{
|
{
|
||||||
label: 'DbGate on GitHub',
|
label: 'DbGate on GitHub',
|
||||||
click() {
|
click() {
|
||||||
require('electron').shell.openExternal('https://github.com/dbshell/dbgate');
|
require('electron').shell.openExternal('https://github.com/dbgate/dbgate');
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -141,7 +141,7 @@ function buildMenu() {
|
|||||||
{
|
{
|
||||||
label: 'Report problem or feature request',
|
label: 'Report problem or feature request',
|
||||||
click() {
|
click() {
|
||||||
require('electron').shell.openExternal('https://github.com/dbshell/dbgate/issues/new');
|
require('electron').shell.openExternal('https://github.com/dbgate/dbgate/issues/new');
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -411,7 +411,11 @@ function SourceName({ name }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function ImportExportConfigurator({ uploadedFile = undefined, onChangePreview = undefined }) {
|
export default function ImportExportConfigurator({
|
||||||
|
uploadedFile = undefined,
|
||||||
|
openedFile = undefined,
|
||||||
|
onChangePreview = undefined,
|
||||||
|
}) {
|
||||||
const { values, setFieldValue, setValues } = useForm();
|
const { values, setFieldValue, setValues } = useForm();
|
||||||
const targetDbinfo = useDatabaseInfo({ conid: values.targetConnectionId, database: values.targetDatabaseName });
|
const targetDbinfo = useDatabaseInfo({ conid: values.targetConnectionId, database: values.targetDatabaseName });
|
||||||
const sourceConnectionInfo = useConnectionInfo({ conid: values.sourceConnectionId });
|
const sourceConnectionInfo = useConnectionInfo({ conid: values.sourceConnectionId });
|
||||||
@ -453,6 +457,21 @@ export default function ImportExportConfigurator({ uploadedFile = undefined, onC
|
|||||||
if (uploadedFile) {
|
if (uploadedFile) {
|
||||||
handleUpload(uploadedFile);
|
handleUpload(uploadedFile);
|
||||||
}
|
}
|
||||||
|
if (openedFile) {
|
||||||
|
addFilesToSourceList(
|
||||||
|
extensions,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
fileName: openedFile.filePath,
|
||||||
|
shortName: openedFile.shortName,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
values,
|
||||||
|
setValues,
|
||||||
|
!sourceList || sourceList.length == 0 ? openedFile.storageType : null,
|
||||||
|
setPreviewSource
|
||||||
|
);
|
||||||
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const supportsPreview =
|
const supportsPreview =
|
||||||
|
@ -120,6 +120,7 @@ export default function ImportExportModal({
|
|||||||
modalState,
|
modalState,
|
||||||
initialValues,
|
initialValues,
|
||||||
uploadedFile = undefined,
|
uploadedFile = undefined,
|
||||||
|
openedFile = undefined,
|
||||||
importToArchive = false,
|
importToArchive = false,
|
||||||
}) {
|
}) {
|
||||||
const [executeNumber, setExecuteNumber] = React.useState(0);
|
const [executeNumber, setExecuteNumber] = React.useState(0);
|
||||||
@ -195,7 +196,11 @@ export default function ImportExportModal({
|
|||||||
<ModalHeader modalState={modalState}>Import/Export {busy && <FontIcon icon="icon loading" />}</ModalHeader>
|
<ModalHeader modalState={modalState}>Import/Export {busy && <FontIcon icon="icon loading" />}</ModalHeader>
|
||||||
<Wrapper>
|
<Wrapper>
|
||||||
<ContentWrapper theme={theme}>
|
<ContentWrapper theme={theme}>
|
||||||
<ImportExportConfigurator uploadedFile={uploadedFile} onChangePreview={setPreviewReader} />
|
<ImportExportConfigurator
|
||||||
|
uploadedFile={uploadedFile}
|
||||||
|
openedFile={openedFile}
|
||||||
|
onChangePreview={setPreviewReader}
|
||||||
|
/>
|
||||||
</ContentWrapper>
|
</ContentWrapper>
|
||||||
<WidgetColumnWrapper theme={theme}>
|
<WidgetColumnWrapper theme={theme}>
|
||||||
<WidgetColumnBar>
|
<WidgetColumnBar>
|
||||||
|
@ -36,7 +36,7 @@ export function useUploadFiles() {
|
|||||||
|
|
||||||
console.log('FILE', file);
|
console.log('FILE', file);
|
||||||
|
|
||||||
if (electron && canOpenByElectron(file.path)) {
|
if (electron && canOpenByElectron(file.path, extensions)) {
|
||||||
openElectronFileCore(file.path);
|
openElectronFileCore(file.path);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,33 @@
|
|||||||
|
import _ from 'lodash';
|
||||||
|
import React from 'react';
|
||||||
|
import ImportExportModal from '../modals/ImportExportModal';
|
||||||
|
import useShowModal from '../modals/showModal';
|
||||||
import useNewQuery from '../query/useNewQuery';
|
import useNewQuery from '../query/useNewQuery';
|
||||||
import getElectron from './getElectron';
|
import getElectron from './getElectron';
|
||||||
|
import useExtensions from './useExtensions';
|
||||||
|
|
||||||
export function canOpenByElectron(file) {
|
export function canOpenByElectron(file, extensions) {
|
||||||
return file && file.toLowerCase().endsWith('.sql');
|
if (!file) return false;
|
||||||
|
const nameLower = file.toLowerCase();
|
||||||
|
if (nameLower.endsWith('.sql')) return true;
|
||||||
|
for (const format of extensions.fileFormats) {
|
||||||
|
if (nameLower.endsWith(`.${format.extension}`)) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useOpenElectronFileCore() {
|
export function useOpenElectronFileCore() {
|
||||||
const newQuery = useNewQuery();
|
const newQuery = useNewQuery();
|
||||||
|
const extensions = useExtensions();
|
||||||
|
const showModal = useShowModal();
|
||||||
|
|
||||||
return filePath => {
|
return filePath => {
|
||||||
if (filePath.toLowerCase().endsWith('.sql')) {
|
const nameLower = filePath.toLowerCase();
|
||||||
const path = window.require('path');
|
const path = window.require('path');
|
||||||
const fs = window.require('fs');
|
const fs = window.require('fs');
|
||||||
const parsed = path.parse(filePath);
|
const parsed = path.parse(filePath);
|
||||||
|
|
||||||
|
if (nameLower.endsWith('.sql')) {
|
||||||
const data = fs.readFileSync(filePath, { encoding: 'utf-8' });
|
const data = fs.readFileSync(filePath, { encoding: 'utf-8' });
|
||||||
|
|
||||||
newQuery({
|
newQuery({
|
||||||
@ -23,19 +38,50 @@ export function useOpenElectronFileCore() {
|
|||||||
savedFormat: 'text',
|
savedFormat: 'text',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
for (const format of extensions.fileFormats) {
|
||||||
|
if (nameLower.endsWith(`.${format.extension}`)) {
|
||||||
|
showModal(modalState => (
|
||||||
|
<ImportExportModal
|
||||||
|
openedFile={{
|
||||||
|
filePath,
|
||||||
|
storageType: format.storageType,
|
||||||
|
shortName: parsed.name,
|
||||||
|
}}
|
||||||
|
modalState={modalState}
|
||||||
|
importToArchive
|
||||||
|
initialValues={{
|
||||||
|
sourceStorageType: format.storageType,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getFileFormatFilters(extensions) {
|
||||||
|
return extensions.fileFormats.filter(x => x.readerFunc).map(x => ({ name: x.name, extensions: [x.extension] }));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getFileFormatExtensions(extensions) {
|
||||||
|
return extensions.fileFormats.filter(x => x.readerFunc).map(x => x.extension);
|
||||||
|
}
|
||||||
|
|
||||||
export default function useOpenElectronFile() {
|
export default function useOpenElectronFile() {
|
||||||
const electron = getElectron();
|
const electron = getElectron();
|
||||||
const openElectronFileCore = useOpenElectronFileCore();
|
const openElectronFileCore = useOpenElectronFileCore();
|
||||||
|
const extensions = useExtensions();
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
const filePaths = electron.remote.dialog.showOpenDialogSync(electron.remote.getCurrentWindow(), {
|
const filePaths = electron.remote.dialog.showOpenDialogSync(electron.remote.getCurrentWindow(), {
|
||||||
filters: [{ name: `SQL files`, extensions: ['sql'] }],
|
filters: [
|
||||||
|
{ name: `All supported files`, extensions: ['sql', ...getFileFormatExtensions(extensions)] },
|
||||||
|
{ name: `SQL files`, extensions: ['sql'] },
|
||||||
|
...getFileFormatFilters(extensions),
|
||||||
|
],
|
||||||
});
|
});
|
||||||
const filePath = filePaths && filePaths[0];
|
const filePath = filePaths && filePaths[0];
|
||||||
if (canOpenByElectron(filePath)) {
|
if (canOpenByElectron(filePath, extensions)) {
|
||||||
openElectronFileCore(filePath);
|
openElectronFileCore(filePath);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user