mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-23 20:45:59 +00:00
archive
This commit is contained in:
@@ -38,4 +38,27 @@ module.exports = {
|
||||
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 lineReader = require('line-reader');
|
||||
const { jsldir, archivedir } = require('../utility/directories');
|
||||
const getJslFileName = require('../utility/getJslFileName');
|
||||
const socket = require('../utility/socket');
|
||||
|
||||
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 = {
|
||||
openedReaders: {},
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
const path = require('path');
|
||||
const { jsldir } = require('../utility/directories');
|
||||
const getJslFileName = require('../utility/getJslFileName');
|
||||
const jsonLinesReader = require('./jsonLinesReader');
|
||||
|
||||
function jslDataReader({ jslid }) {
|
||||
const fileName = path.join(jsldir(), `${jslid}.jsonl`);
|
||||
const fileName = getJslFileName(jslid);
|
||||
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 { DropDownMenuItem } from '../modals/DropDownMenu';
|
||||
import { openNewTab } from '../utility/common';
|
||||
import { filterName } from '@dbgate/datalib';
|
||||
import axios from '../utility/axios';
|
||||
|
||||
function Menu({ data, setOpenedTabs }) {
|
||||
const handleDelete = () => {
|
||||
axios.post('archive/delete-file', { file: data.fileName, folder: data.folderName });
|
||||
// setOpenedTabs((tabs) => tabs.filter((x) => x.tabid != data.tabid));
|
||||
};
|
||||
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;
|
||||
|
||||
@@ -3,10 +3,12 @@ import _ from 'lodash';
|
||||
import moment from 'moment';
|
||||
import { LocalDbIcon, getIconImage } from '../icons';
|
||||
import { DropDownMenuItem } from '../modals/DropDownMenu';
|
||||
import axios from '../utility/axios';
|
||||
import { filterName } from '@dbgate/datalib';
|
||||
|
||||
function Menu({ data, setOpenedTabs }) {
|
||||
const handleDelete = () => {
|
||||
// setOpenedTabs((tabs) => tabs.filter((x) => x.tabid != data.tabid));
|
||||
axios.post('archive/delete-folder', { folder: data.name });
|
||||
};
|
||||
return (
|
||||
<>
|
||||
@@ -20,8 +22,9 @@ const archiveFolderAppObject = () => ({ name }, { setOpenedTabs, currentArchive
|
||||
// const Icon = (props) => <i className="fas fa-archive" />;
|
||||
const Icon = LocalDbIcon;
|
||||
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;
|
||||
|
||||
@@ -16,20 +16,34 @@ import savedSqlFileAppObject from '../appobj/savedSqlFileAppObject';
|
||||
import { useArchiveFiles, useArchiveFolders } from '../utility/metadataLoaders';
|
||||
import archiveFolderAppObject from '../appobj/archiveFolderAppObject';
|
||||
import archiveFileAppObject from '../appobj/archiveFileAppObject';
|
||||
import SearchInput from './SearchInput';
|
||||
import InlineButton from './InlineButton';
|
||||
import axios from '../utility/axios';
|
||||
|
||||
function ArchiveFolderList() {
|
||||
const folders = useArchiveFolders();
|
||||
const inputRef = React.useRef(null);
|
||||
const [filter, setFilter] = React.useState('');
|
||||
|
||||
const setArchive = useSetCurrentArchive();
|
||||
|
||||
const handleRefreshFolders = () => {
|
||||
axios.post('archive/refresh-folders', {});
|
||||
};
|
||||
|
||||
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>
|
||||
<AppObjectList
|
||||
list={_.sortBy(folders, 'name')}
|
||||
makeAppObj={archiveFolderAppObject()}
|
||||
onObjectClick={(archive) => setArchive(archive.name)}
|
||||
filter={filter}
|
||||
/>
|
||||
</WidgetsInnerContainer>
|
||||
</>
|
||||
@@ -39,16 +53,26 @@ function ArchiveFolderList() {
|
||||
function ArchiveFilesList() {
|
||||
const folder = useCurrentArchive();
|
||||
const files = useArchiveFiles({ folder });
|
||||
const inputRef = React.useRef(null);
|
||||
const [filter, setFilter] = React.useState('');
|
||||
const handleRefreshFiles = () => {
|
||||
axios.post('archive/refresh-files', { folder });
|
||||
};
|
||||
|
||||
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>
|
||||
<AppObjectList
|
||||
list={(files || []).map((file) => ({
|
||||
fileName: file.name,
|
||||
folderName: folder,
|
||||
}))}
|
||||
filter={filter}
|
||||
makeAppObj={archiveFileAppObject()}
|
||||
/>
|
||||
</WidgetsInnerContainer>
|
||||
|
||||
Reference in New Issue
Block a user