mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-26 12:06:00 +00:00
archive
This commit is contained in:
@@ -38,4 +38,27 @@ module.exports = {
|
|||||||
type: 'jsonl',
|
type: 'jsonl',
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
refreshFiles_meta: 'post',
|
||||||
|
async refreshFiles({ folder }) {
|
||||||
|
socket.emitChanged(`archive-files-changed-${folder}`);
|
||||||
|
},
|
||||||
|
|
||||||
|
refreshFolders_meta: 'post',
|
||||||
|
async refreshFolders() {
|
||||||
|
socket.emitChanged(`archive-folders-changed`);
|
||||||
|
},
|
||||||
|
|
||||||
|
deleteFile_meta: 'post',
|
||||||
|
async deleteFile({ folder, file }) {
|
||||||
|
await fs.unlink(path.join(archivedir(), folder, `${file}.jsonl`));
|
||||||
|
socket.emitChanged(`archive-files-changed-${folder}`);
|
||||||
|
},
|
||||||
|
|
||||||
|
deleteFolder_meta: 'post',
|
||||||
|
async deleteFolder({ folder }) {
|
||||||
|
if (!folder) throw new Error('Missing folder parameter');
|
||||||
|
await fs.rmdir(path.join(archivedir(), folder), { recursive: true });
|
||||||
|
socket.emitChanged(`archive-folders-changed`);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
const path = require('path');
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const lineReader = require('line-reader');
|
const lineReader = require('line-reader');
|
||||||
const { jsldir, archivedir } = require('../utility/directories');
|
const getJslFileName = require('../utility/getJslFileName');
|
||||||
const socket = require('../utility/socket');
|
const socket = require('../utility/socket');
|
||||||
|
|
||||||
function readFirstLine(file) {
|
function readFirstLine(file) {
|
||||||
@@ -20,13 +19,6 @@ function readFirstLine(file) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getJslFileName(jslid) {
|
|
||||||
const archiveMatch = jslid.match(/^archive:\/\/([^/]+)\/(.*)$/);
|
|
||||||
if (archiveMatch) {
|
|
||||||
return path.join(archivedir(), archiveMatch[1], `${archiveMatch[2]}.jsonl`);
|
|
||||||
}
|
|
||||||
return path.join(jsldir(), `${jslid}.jsonl`);
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
openedReaders: {},
|
openedReaders: {},
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
const path = require('path');
|
const getJslFileName = require('../utility/getJslFileName');
|
||||||
const { jsldir } = require('../utility/directories');
|
|
||||||
const jsonLinesReader = require('./jsonLinesReader');
|
const jsonLinesReader = require('./jsonLinesReader');
|
||||||
|
|
||||||
function jslDataReader({ jslid }) {
|
function jslDataReader({ jslid }) {
|
||||||
const fileName = path.join(jsldir(), `${jslid}.jsonl`);
|
const fileName = getJslFileName(jslid);
|
||||||
return jsonLinesReader({ fileName });
|
return jsonLinesReader({ fileName });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
12
packages/api/src/utility/getJslFileName.js
Normal file
12
packages/api/src/utility/getJslFileName.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
const path = require('path');
|
||||||
|
const { jsldir, archivedir } = require('./directories');
|
||||||
|
|
||||||
|
function getJslFileName(jslid) {
|
||||||
|
const archiveMatch = jslid.match(/^archive:\/\/([^/]+)\/(.*)$/);
|
||||||
|
if (archiveMatch) {
|
||||||
|
return path.join(archivedir(), archiveMatch[1], `${archiveMatch[2]}.jsonl`);
|
||||||
|
}
|
||||||
|
return path.join(jsldir(), `${jslid}.jsonl`);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = getJslFileName;
|
||||||
@@ -4,9 +4,12 @@ import moment from 'moment';
|
|||||||
import { DatabaseIcon, getIconImage, ArchiveTableIcon } from '../icons';
|
import { DatabaseIcon, getIconImage, ArchiveTableIcon } from '../icons';
|
||||||
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
||||||
import { openNewTab } from '../utility/common';
|
import { openNewTab } from '../utility/common';
|
||||||
|
import { filterName } from '@dbgate/datalib';
|
||||||
|
import axios from '../utility/axios';
|
||||||
|
|
||||||
function Menu({ data, setOpenedTabs }) {
|
function Menu({ data, setOpenedTabs }) {
|
||||||
const handleDelete = () => {
|
const handleDelete = () => {
|
||||||
|
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));
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
@@ -32,8 +35,9 @@ const archiveFileAppObject = () => ({ fileName, folderName }, { setOpenedTabs })
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
const matcher = (filter) => filterName(filter, fileName);
|
||||||
|
|
||||||
return { title: fileName, key, Icon, Menu, onClick };
|
return { title: fileName, key, Icon, Menu, onClick, matcher };
|
||||||
};
|
};
|
||||||
|
|
||||||
export default archiveFileAppObject;
|
export default archiveFileAppObject;
|
||||||
|
|||||||
@@ -3,10 +3,12 @@ import _ from 'lodash';
|
|||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import { LocalDbIcon, getIconImage } from '../icons';
|
import { LocalDbIcon, getIconImage } from '../icons';
|
||||||
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
||||||
|
import axios from '../utility/axios';
|
||||||
|
import { filterName } from '@dbgate/datalib';
|
||||||
|
|
||||||
function Menu({ data, setOpenedTabs }) {
|
function Menu({ data, setOpenedTabs }) {
|
||||||
const handleDelete = () => {
|
const handleDelete = () => {
|
||||||
// setOpenedTabs((tabs) => tabs.filter((x) => x.tabid != data.tabid));
|
axios.post('archive/delete-folder', { folder: data.name });
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -20,8 +22,9 @@ const archiveFolderAppObject = () => ({ name }, { setOpenedTabs, currentArchive
|
|||||||
// const Icon = (props) => <i className="fas fa-archive" />;
|
// const Icon = (props) => <i className="fas fa-archive" />;
|
||||||
const Icon = LocalDbIcon;
|
const Icon = LocalDbIcon;
|
||||||
const isBold = name == currentArchive;
|
const isBold = name == currentArchive;
|
||||||
|
const matcher = (filter) => filterName(filter, name);
|
||||||
|
|
||||||
return { title: name, key, Icon, isBold, Menu };
|
return { title: name, key, Icon, isBold, Menu, matcher };
|
||||||
};
|
};
|
||||||
|
|
||||||
export default archiveFolderAppObject;
|
export default archiveFolderAppObject;
|
||||||
|
|||||||
@@ -16,20 +16,34 @@ import savedSqlFileAppObject from '../appobj/savedSqlFileAppObject';
|
|||||||
import { useArchiveFiles, useArchiveFolders } from '../utility/metadataLoaders';
|
import { useArchiveFiles, useArchiveFolders } from '../utility/metadataLoaders';
|
||||||
import archiveFolderAppObject from '../appobj/archiveFolderAppObject';
|
import archiveFolderAppObject from '../appobj/archiveFolderAppObject';
|
||||||
import archiveFileAppObject from '../appobj/archiveFileAppObject';
|
import archiveFileAppObject from '../appobj/archiveFileAppObject';
|
||||||
|
import SearchInput from './SearchInput';
|
||||||
|
import InlineButton from './InlineButton';
|
||||||
|
import axios from '../utility/axios';
|
||||||
|
|
||||||
function ArchiveFolderList() {
|
function ArchiveFolderList() {
|
||||||
const folders = useArchiveFolders();
|
const folders = useArchiveFolders();
|
||||||
|
const inputRef = React.useRef(null);
|
||||||
|
const [filter, setFilter] = React.useState('');
|
||||||
|
|
||||||
const setArchive = useSetCurrentArchive();
|
const setArchive = useSetCurrentArchive();
|
||||||
|
|
||||||
|
const handleRefreshFolders = () => {
|
||||||
|
axios.post('archive/refresh-folders', {});
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<WidgetTitle>Archive folder</WidgetTitle>
|
<WidgetTitle inputRef={inputRef}>Archive folder</WidgetTitle>
|
||||||
|
<SearchBoxWrapper>
|
||||||
|
<SearchInput inputRef={inputRef} placeholder="Search archive folders" filter={filter} setFilter={setFilter} />
|
||||||
|
<InlineButton onClick={handleRefreshFolders}>Refresh</InlineButton>
|
||||||
|
</SearchBoxWrapper>
|
||||||
<WidgetsInnerContainer>
|
<WidgetsInnerContainer>
|
||||||
<AppObjectList
|
<AppObjectList
|
||||||
list={_.sortBy(folders, 'name')}
|
list={_.sortBy(folders, 'name')}
|
||||||
makeAppObj={archiveFolderAppObject()}
|
makeAppObj={archiveFolderAppObject()}
|
||||||
onObjectClick={(archive) => setArchive(archive.name)}
|
onObjectClick={(archive) => setArchive(archive.name)}
|
||||||
|
filter={filter}
|
||||||
/>
|
/>
|
||||||
</WidgetsInnerContainer>
|
</WidgetsInnerContainer>
|
||||||
</>
|
</>
|
||||||
@@ -39,16 +53,26 @@ function ArchiveFolderList() {
|
|||||||
function ArchiveFilesList() {
|
function ArchiveFilesList() {
|
||||||
const folder = useCurrentArchive();
|
const folder = useCurrentArchive();
|
||||||
const files = useArchiveFiles({ folder });
|
const files = useArchiveFiles({ folder });
|
||||||
|
const inputRef = React.useRef(null);
|
||||||
|
const [filter, setFilter] = React.useState('');
|
||||||
|
const handleRefreshFiles = () => {
|
||||||
|
axios.post('archive/refresh-files', { folder });
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<WidgetTitle>Archive files</WidgetTitle>
|
<WidgetTitle inputRef={inputRef}>Archive files</WidgetTitle>
|
||||||
|
<SearchBoxWrapper>
|
||||||
|
<SearchInput inputRef={inputRef} placeholder="Search archive files" filter={filter} setFilter={setFilter} />
|
||||||
|
<InlineButton onClick={handleRefreshFiles}>Refresh</InlineButton>
|
||||||
|
</SearchBoxWrapper>
|
||||||
<WidgetsInnerContainer>
|
<WidgetsInnerContainer>
|
||||||
<AppObjectList
|
<AppObjectList
|
||||||
list={(files || []).map((file) => ({
|
list={(files || []).map((file) => ({
|
||||||
fileName: file.name,
|
fileName: file.name,
|
||||||
folderName: folder,
|
folderName: folder,
|
||||||
}))}
|
}))}
|
||||||
|
filter={filter}
|
||||||
makeAppObj={archiveFileAppObject()}
|
makeAppObj={archiveFileAppObject()}
|
||||||
/>
|
/>
|
||||||
</WidgetsInnerContainer>
|
</WidgetsInnerContainer>
|
||||||
|
|||||||
Reference in New Issue
Block a user