diff --git a/packages/api/src/controllers/archive.js b/packages/api/src/controllers/archive.js index 5cecdd0c4..6af505abc 100644 --- a/packages/api/src/controllers/archive.js +++ b/packages/api/src/controllers/archive.js @@ -6,6 +6,7 @@ const { formatWithOptions } = require('util'); const { archivedir } = require('../utility/directories'); const socket = require('../utility/socket'); const JsonLinesDatastore = require('../utility/JsonLinesDatastore'); +const { saveFreeTableData } = require('../utility/freeTableStorage'); module.exports = { folders_meta: 'get', @@ -70,13 +71,7 @@ module.exports = { saveFreeTable_meta: 'post', async saveFreeTable({ folder, file, data }) { - const { structure, rows } = 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(); + saveFreeTableData(path.join(archivedir(), folder, `${file}.jsonl`), data); return true; }, diff --git a/packages/api/src/controllers/jsldata.js b/packages/api/src/controllers/jsldata.js index b451c130a..2873ce9d5 100644 --- a/packages/api/src/controllers/jsldata.js +++ b/packages/api/src/controllers/jsldata.js @@ -2,6 +2,7 @@ const fs = require('fs'); const lineReader = require('line-reader'); const { off } = require('process'); const DatastoreProxy = require('../utility/DatastoreProxy'); +const { saveFreeTableData } = require('../utility/freeTableStorage'); const getJslFileName = require('../utility/getJslFileName'); const JsonLinesDatastore = require('../utility/JsonLinesDatastore'); const socket = require('../utility/socket'); @@ -138,4 +139,10 @@ module.exports = { // socket.emit(`jsldata-stats-${stats.jslid}`, stats); // } }, + + saveFreeTable_meta: 'post', + async saveFreeTable({ jslid, data }) { + saveFreeTableData(getJslFileName(jslid), data); + return true; + }, }; diff --git a/packages/api/src/utility/freeTableStorage.js b/packages/api/src/utility/freeTableStorage.js new file mode 100644 index 000000000..caf5d2d8e --- /dev/null +++ b/packages/api/src/utility/freeTableStorage.js @@ -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, +}; diff --git a/packages/web/src/freetable/FreeTableGridCore.js b/packages/web/src/freetable/FreeTableGridCore.js index 0a9bd6c93..d9c854c8a 100644 --- a/packages/web/src/freetable/FreeTableGridCore.js +++ b/packages/web/src/freetable/FreeTableGridCore.js @@ -1,9 +1,13 @@ import { createGridCache, FreeTableGridDisplay } from 'dbgate-datalib'; import React from 'react'; import DataGridCore from '../datagrid/DataGridCore'; +import useShowModal from '../modals/showModal'; +import axios from '../utility/axios'; import keycodes from '../utility/keycodes'; import FreeTableGrider from './FreeTableGrider'; import MacroPreviewGrider from './MacroPreviewGrider'; +import uuidv1 from 'uuid/v1'; +import ImportExportModal from '../modals/ImportExportModal'; export default function FreeTableGridCore(props) { const { @@ -18,6 +22,7 @@ export default function FreeTableGridCore(props) { } = props; const [cache, setCache] = React.useState(createGridCache()); const [selectedCells, setSelectedCells] = React.useState([]); + const showModal = useShowModal(); const grider = React.useMemo( () => macroPreview @@ -30,12 +35,20 @@ export default function FreeTableGridCore(props) { macroPreview ? selectedCells : null, ] ); - const display = React.useMemo(() => new FreeTableGridDisplay(grider.model || modelState.value, config, setConfig, cache, setCache), [ - modelState.value, - config, - cache, - grider, - ]); + const display = React.useMemo( + () => new FreeTableGridDisplay(grider.model || modelState.value, config, setConfig, cache, setCache), + [modelState.value, config, 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) => ); + } const handleSelectionChanged = React.useCallback( (cells) => { @@ -58,6 +71,7 @@ export default function FreeTableGridCore(props) { display={display} onSelectionChanged={macroPreview ? handleSelectionChanged : null} frameSelection={!!macroPreview} + exportGrid={exportGrid} onKeyDown={handleKeyDown} /> );