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)