This commit is contained in:
Jan Prochazka
2020-10-18 10:36:24 +02:00
parent b0f0710a75
commit 69ea8010d2
7 changed files with 74 additions and 17 deletions

View File

@@ -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`);
},
};

View File

@@ -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: {},

View File

@@ -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 });
}

View 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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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>