export from free table editor

This commit is contained in:
Jan Prochazka
2020-11-19 12:34:03 +01:00
parent 03451c6897
commit 682f53881d
4 changed files with 44 additions and 13 deletions

View File

@@ -6,6 +6,7 @@ const { formatWithOptions } = require('util');
const { archivedir } = require('../utility/directories'); const { archivedir } = require('../utility/directories');
const socket = require('../utility/socket'); const socket = require('../utility/socket');
const JsonLinesDatastore = require('../utility/JsonLinesDatastore'); const JsonLinesDatastore = require('../utility/JsonLinesDatastore');
const { saveFreeTableData } = require('../utility/freeTableStorage');
module.exports = { module.exports = {
folders_meta: 'get', folders_meta: 'get',
@@ -70,13 +71,7 @@ module.exports = {
saveFreeTable_meta: 'post', saveFreeTable_meta: 'post',
async saveFreeTable({ folder, file, data }) { async saveFreeTable({ folder, file, data }) {
const { structure, rows } = data; saveFreeTableData(path.join(archivedir(), folder, `${file}.jsonl`), data);
const fileStream = fs.createWriteStream(path.join(archivedir(), folder, `${file}.jsonl`));
await fileStream.write(JSON.stringify(structure) + '\n');
for (const row of rows) {
await fileStream.write(JSON.stringify(row) + '\n');
}
await fileStream.close();
return true; return true;
}, },

View File

@@ -2,6 +2,7 @@ const fs = require('fs');
const lineReader = require('line-reader'); const lineReader = require('line-reader');
const { off } = require('process'); const { off } = require('process');
const DatastoreProxy = require('../utility/DatastoreProxy'); const DatastoreProxy = require('../utility/DatastoreProxy');
const { saveFreeTableData } = require('../utility/freeTableStorage');
const getJslFileName = require('../utility/getJslFileName'); const getJslFileName = require('../utility/getJslFileName');
const JsonLinesDatastore = require('../utility/JsonLinesDatastore'); const JsonLinesDatastore = require('../utility/JsonLinesDatastore');
const socket = require('../utility/socket'); const socket = require('../utility/socket');
@@ -138,4 +139,10 @@ module.exports = {
// socket.emit(`jsldata-stats-${stats.jslid}`, stats); // socket.emit(`jsldata-stats-${stats.jslid}`, stats);
// } // }
}, },
saveFreeTable_meta: 'post',
async saveFreeTable({ jslid, data }) {
saveFreeTableData(getJslFileName(jslid), data);
return true;
},
}; };

View File

@@ -0,0 +1,15 @@
const fs = require('fs-extra');
async function saveFreeTableData(file, data) {
const { structure, rows } = data;
const fileStream = fs.createWriteStream(file);
await fileStream.write(JSON.stringify(structure) + '\n');
for (const row of rows) {
await fileStream.write(JSON.stringify(row) + '\n');
}
await fileStream.close();
}
module.exports = {
saveFreeTableData,
};

View File

@@ -1,9 +1,13 @@
import { createGridCache, FreeTableGridDisplay } from 'dbgate-datalib'; import { createGridCache, FreeTableGridDisplay } from 'dbgate-datalib';
import React from 'react'; import React from 'react';
import DataGridCore from '../datagrid/DataGridCore'; import DataGridCore from '../datagrid/DataGridCore';
import useShowModal from '../modals/showModal';
import axios from '../utility/axios';
import keycodes from '../utility/keycodes'; import keycodes from '../utility/keycodes';
import FreeTableGrider from './FreeTableGrider'; import FreeTableGrider from './FreeTableGrider';
import MacroPreviewGrider from './MacroPreviewGrider'; import MacroPreviewGrider from './MacroPreviewGrider';
import uuidv1 from 'uuid/v1';
import ImportExportModal from '../modals/ImportExportModal';
export default function FreeTableGridCore(props) { export default function FreeTableGridCore(props) {
const { const {
@@ -18,6 +22,7 @@ export default function FreeTableGridCore(props) {
} = props; } = props;
const [cache, setCache] = React.useState(createGridCache()); const [cache, setCache] = React.useState(createGridCache());
const [selectedCells, setSelectedCells] = React.useState([]); const [selectedCells, setSelectedCells] = React.useState([]);
const showModal = useShowModal();
const grider = React.useMemo( const grider = React.useMemo(
() => () =>
macroPreview macroPreview
@@ -30,12 +35,20 @@ export default function FreeTableGridCore(props) {
macroPreview ? selectedCells : null, macroPreview ? selectedCells : null,
] ]
); );
const display = React.useMemo(() => new FreeTableGridDisplay(grider.model || modelState.value, config, setConfig, cache, setCache), [ const display = React.useMemo(
modelState.value, () => new FreeTableGridDisplay(grider.model || modelState.value, config, setConfig, cache, setCache),
config, [modelState.value, config, cache, grider]
cache, );
grider,
]); async function exportGrid() {
const jslid = uuidv1();
await axios.post('jsldata/save-free-table', { jslid, data: modelState.value });
const initialValues = {};
initialValues.sourceStorageType = 'jsldata';
initialValues.sourceJslId = jslid;
initialValues.sourceList = ['editor-data'];
showModal((modalState) => <ImportExportModal modalState={modalState} initialValues={initialValues} />);
}
const handleSelectionChanged = React.useCallback( const handleSelectionChanged = React.useCallback(
(cells) => { (cells) => {
@@ -58,6 +71,7 @@ export default function FreeTableGridCore(props) {
display={display} display={display}
onSelectionChanged={macroPreview ? handleSelectionChanged : null} onSelectionChanged={macroPreview ? handleSelectionChanged : null}
frameSelection={!!macroPreview} frameSelection={!!macroPreview}
exportGrid={exportGrid}
onKeyDown={handleKeyDown} onKeyDown={handleKeyDown}
/> />
); );