diff --git a/src/components/CsvImport/index.vue b/src/components/CsvImport/index.vue index 0d1ed9c..64efdf5 100644 --- a/src/components/CsvImport/index.vue +++ b/src/components/CsvImport/index.vue @@ -100,7 +100,7 @@ diff --git a/src/components/svg/png.svg b/src/components/svg/png.svg deleted file mode 100644 index da6a6cb..0000000 --- a/src/components/svg/png.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/components/CsvImport/csv.js b/src/lib/csv.js similarity index 85% rename from src/components/CsvImport/csv.js rename to src/lib/csv.js index 96e72cc..c5bbdbd 100644 --- a/src/components/CsvImport/csv.js +++ b/src/lib/csv.js @@ -42,6 +42,21 @@ export default { return result }, + prepareForExport (resultSet) { + const columns = resultSet.columns + const rowCount = resultSet.values[columns[0]].length + const result = { + fields: columns, + data: [] + } + + for (let rowNumber = 0; rowNumber < rowCount; rowNumber++) { + result.data.push(columns.map(column => resultSet.values[column][rowNumber])) + } + + return result + }, + parse (file, config = {}) { return new Promise((resolve, reject) => { const defaultConfig = { @@ -90,5 +105,9 @@ export default { Papa.parse(file, { ...defaultConfig, ...config }) }) + }, + + serialize (resultSet) { + return Papa.unparse(this.prepareForExport(resultSet)) } } diff --git a/src/views/Main/Workspace/Tabs/Tab/RunResult.vue b/src/views/Main/Workspace/Tabs/Tab/RunResult.vue index 6b3c547..eb2baea 100644 --- a/src/views/Main/Workspace/Tabs/Tab/RunResult.vue +++ b/src/views/Main/Workspace/Tabs/Tab/RunResult.vue @@ -26,7 +26,16 @@ class="straight" /> - + + + + + @@ -35,6 +44,10 @@ import Logs from '@/components/Logs' import SqlTable from '@/components/SqlTable' import LoadingIndicator from '@/components/LoadingIndicator' import SideToolBar from './SideToolBar' +import ExportToCsvIcon from '@/components/svg/exportToCsv' +import IconButton from '@/components/IconButton' +import csv from '@/lib/csv' +import fIo from '@/lib/utils/fileIo' export default { name: 'RunResult', @@ -49,7 +62,9 @@ export default { SqlTable, LoadingIndicator, Logs, - SideToolBar + SideToolBar, + ExportToCsvIcon, + IconButton }, mounted () { this.resizeObserver = new ResizeObserver(this.handleResize) @@ -59,6 +74,11 @@ export default { beforeDestroy () { this.resizeObserver.unobserve(this.$refs.runResultPanel) }, + watch: { + result () { + console.log(this.result) + } + }, methods: { handleResize () { this.calculatePageSize() @@ -70,6 +90,9 @@ export default { // 35 - height of table header const freeSpace = runResultPanel.offsetHeight - 27 - 5 - 35 this.pageSize = Math.max(Math.floor(freeSpace / 35), 20) + }, + exportToCsv () { + fIo.exportToFile(csv.serialize(this.result), 'result_set.csv', 'text/csv') } } } diff --git a/tests/components/CsvImport/CsvImport.spec.js b/tests/components/CsvImport/CsvImport.spec.js index 49de9d4..7f52377 100644 --- a/tests/components/CsvImport/CsvImport.spec.js +++ b/tests/components/CsvImport/CsvImport.spec.js @@ -3,7 +3,7 @@ import sinon from 'sinon' import Vuex from 'vuex' import { mount } from '@vue/test-utils' import CsvImport from '@/components/CsvImport' -import csv from '@/components/CsvImport/csv' +import csv from '@/lib/csv' describe('CsvImport.vue', () => { let state = {} diff --git a/tests/components/CsvImport/csv.spec.js b/tests/lib/csv.spec.js similarity index 89% rename from tests/components/CsvImport/csv.spec.js rename to tests/lib/csv.spec.js index c849962..d0a0bb0 100644 --- a/tests/components/CsvImport/csv.spec.js +++ b/tests/lib/csv.spec.js @@ -1,6 +1,6 @@ import { expect } from 'chai' import sinon from 'sinon' -import csv from '@/components/CsvImport/csv' +import csv from '@/lib/csv' import Papa from 'papaparse' describe('csv.js', () => { @@ -115,4 +115,21 @@ describe('csv.js', () => { const file = {} await expect(csv.parse(file)).to.be.rejectedWith(err) }) + + it('prepareForExport', () => { + const resultSet = { + columns: ['id', 'name'], + values: { + id: [1, 2], + name: ['foo', 'bar'] + } + } + expect(csv.prepareForExport(resultSet)).to.eql({ + fields: ['id', 'name'], + data: [ + [1, 'foo'], + [2, 'bar'] + ] + }) + }) }) diff --git a/tests/views/Main/Workspace/Schema/Schema.spec.js b/tests/views/Main/Workspace/Schema/Schema.spec.js index d0680dc..aac991d 100644 --- a/tests/views/Main/Workspace/Schema/Schema.spec.js +++ b/tests/views/Main/Workspace/Schema/Schema.spec.js @@ -6,7 +6,7 @@ import Schema from '@/views/Main/Workspace/Schema' import TableDescription from '@/views/Main/Workspace/Schema/TableDescription' import database from '@/lib/database' import fIo from '@/lib/utils/fileIo' -import csv from '@/components/CsvImport/csv' +import csv from '@/lib/csv' const localVue = createLocalVue() localVue.use(Vuex)