1
0
mirror of https://github.com/lana-k/sqliteviz.git synced 2025-12-07 02:28:54 +08:00

9 Commits

Author SHA1 Message Date
lana-k
8aac7af481 update package.json 2023-07-03 23:33:52 +02:00
lana-k
6982204e68 Update currentTab when close tabs #112 2023-07-03 23:13:09 +02:00
lana-k
41e0ae7332 fix test for firefox #110 2023-06-29 23:14:08 +02:00
lana-k
ebb5af4f10 send event when sharing 2023-06-29 22:57:39 +02:00
lana-k
ae26358b25 add test #110 2023-06-29 22:28:41 +02:00
lana-k
d9ee702b8e update papaparse #111 2023-06-29 22:14:28 +02:00
lana-k
446045fa55 Catch parsing errors in compete #110 2023-06-29 22:13:56 +02:00
lana-k
1a9d1b308b check data format #109 2023-06-10 20:05:42 +02:00
lana-k
014ecf145e update version 2023-06-10 19:11:15 +02:00
8 changed files with 83 additions and 29 deletions

18
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "sqliteviz", "name": "sqliteviz",
"version": "0.22.0", "version": "0.23.1",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "sqliteviz", "name": "sqliteviz",
"version": "0.22.0", "version": "0.23.1",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"codemirror": "^5.57.0", "codemirror": "^5.57.0",
@@ -15,7 +15,7 @@
"html2canvas": "^1.1.4", "html2canvas": "^1.1.4",
"jquery": "^3.6.0", "jquery": "^3.6.0",
"nanoid": "^3.1.12", "nanoid": "^3.1.12",
"papaparse": "^5.3.1", "papaparse": "^5.4.1",
"pivottable": "^2.23.0", "pivottable": "^2.23.0",
"plotly.js": "^1.58.4", "plotly.js": "^1.58.4",
"promise-worker": "^2.0.1", "promise-worker": "^2.0.1",
@@ -16381,9 +16381,9 @@
"dev": true "dev": true
}, },
"node_modules/papaparse": { "node_modules/papaparse": {
"version": "5.3.2", "version": "5.4.1",
"resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz",
"integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw=="
}, },
"node_modules/parallel-transform": { "node_modules/parallel-transform": {
"version": "1.2.0", "version": "1.2.0",
@@ -38855,9 +38855,9 @@
"dev": true "dev": true
}, },
"papaparse": { "papaparse": {
"version": "5.3.2", "version": "5.4.1",
"resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz",
"integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw=="
}, },
"parallel-transform": { "parallel-transform": {
"version": "1.2.0", "version": "1.2.0",

View File

@@ -1,6 +1,6 @@
{ {
"name": "sqliteviz", "name": "sqliteviz",
"version": "0.22.0", "version": "0.23.2",
"license": "Apache-2.0", "license": "Apache-2.0",
"private": true, "private": true,
"scripts": { "scripts": {
@@ -16,7 +16,7 @@
"html2canvas": "^1.1.4", "html2canvas": "^1.1.4",
"jquery": "^3.6.0", "jquery": "^3.6.0",
"nanoid": "^3.1.12", "nanoid": "^3.1.12",
"papaparse": "^5.3.1", "papaparse": "^5.4.1",
"pivottable": "^2.23.0", "pivottable": "^2.23.0",
"plotly.js": "^1.58.4", "plotly.js": "^1.58.4",
"promise-worker": "^2.0.1", "promise-worker": "^2.0.1",

View File

@@ -73,21 +73,26 @@ export default {
comments: false, comments: false,
step: undefined, step: undefined,
complete: results => { complete: results => {
const res = { let res
data: this.getResult(results), try {
delimiter: results.meta.delimiter, res = {
hasErrors: false, data: this.getResult(results),
rowCount: results.data.length delimiter: results.meta.delimiter,
hasErrors: false,
rowCount: results.data.length
}
res.messages = results.errors.map(msg => {
msg.type = msg.code === 'UndetectableDelimiter' ? 'info' : 'error'
if (msg.type === 'error') res.hasErrors = true
msg.hint = hintsByCode[msg.code]
return msg
})
} catch (error) {
reject(error)
} }
res.messages = results.errors.map(msg => {
msg.type = msg.code === 'UndetectableDelimiter' ? 'info' : 'error'
if (msg.type === 'error') res.hasErrors = true
msg.hint = hintsByCode[msg.code]
return msg
})
resolve(res) resolve(res)
}, },
error: (error, file) => { error: error => {
reject(error) reject(error)
}, },
download: false, download: false,

View File

@@ -36,9 +36,11 @@ export default {
state.currentTabId = state.tabs[index - 1].id state.currentTabId = state.tabs[index - 1].id
} else { } else {
state.currentTabId = null state.currentTabId = null
state.currentTab = null
state.untitledLastIndex = 0 state.untitledLastIndex = 0
} }
state.currentTab = state.currentTabId
? state.tabs.find(tab => tab.id === state.currentTabId)
: null
} }
state.tabs.splice(index, 1) state.tabs.splice(index, 1)
}, },

View File

@@ -18,6 +18,7 @@
import fu from '@/lib/utils/fileIo' import fu from '@/lib/utils/fileIo'
import database from '@/lib/database' import database from '@/lib/database'
import Logs from '@/components/Logs' import Logs from '@/components/Logs'
import events from '@/lib/utils/events'
export default { export default {
name: 'LoadView', name: 'LoadView',
@@ -46,6 +47,14 @@ export default {
maximize maximize
} = this.$route.query } = this.$route.query
events.send('share.load', null, {
has_data_url: !!dataUrl,
data_format: dataFormat,
has_inquiry_url: !!inquiryUrl,
inquiry_id_count: (inquiryIds || []).length,
maximize
})
await this.loadData(dataUrl, dataFormat) await this.loadData(dataUrl, dataFormat)
const inquiries = await this.loadInquiries(inquiryUrl, inquiryIds) const inquiries = await this.loadInquiries(inquiryUrl, inquiryIds)
if (inquiries && inquiries.length > 0) { if (inquiries && inquiries.length > 0) {
@@ -74,6 +83,9 @@ export default {
if (dataFormat === 'sqlite') { if (dataFormat === 'sqlite') {
await this.getSqliteDb(dataUrl) await this.getSqliteDb(dataUrl)
} else {
this.dataMsg.message = 'Unknown data format'
this.dataMsg.type = 'error'
} }
// Loading indicator is not needed anymore // Loading indicator is not needed anymore

View File

@@ -36,7 +36,7 @@ export default {
}, },
async beforeCreate () { async beforeCreate () {
const schema = this.$store.state.db.schema const schema = this.$store.state.db.schema
if (!schema || schema.length === 0) { if ((!schema || schema.length === 0) && this.$store.state.tabs.length === 0) {
const stmt = [ const stmt = [
'/*', '/*',
' * Your database is empty. In order to start building charts', ' * Your database is empty. In order to start building charts',

View File

@@ -116,6 +116,33 @@ describe('csv.js', () => {
await expect(csv.parse(file)).to.be.rejectedWith(err) await expect(csv.parse(file)).to.be.rejectedWith(err)
}) })
it('parse rejects when getResult failed', async () => {
let err
try {
new Date('invalid date').toISOString()
} catch (e) {
err = e // get error message, it's different depending on browser
}
sinon.stub(Papa, 'parse').callsFake((file, config) => {
config.complete({
data: [
[1, new Date('invalid date')],
[2, new Date('2023-05-05T15:30:00Z')]
],
errors: [],
meta: {
delimiter: ',',
linebreak: '\n',
aborted: false,
truncated: true
}
})
})
const file = {}
await expect(csv.parse(file)).to.be.rejectedWith(err.message)
})
it('prepareForExport', () => { it('prepareForExport', () => {
const resultSet = { const resultSet = {
columns: ['id', 'name'], columns: ['id', 'name'],

View File

@@ -176,13 +176,15 @@ describe('mutations', () => {
const state = { const state = {
tabs: [tab1, tab2], tabs: [tab1, tab2],
currentTabId: 1 currentTabId: 1,
currentTab: tab1
} }
deleteTab(state, tab1) deleteTab(state, tab1)
expect(state.tabs).to.have.lengthOf(1) expect(state.tabs).to.have.lengthOf(1)
expect(state.tabs[0].id).to.equal(2) expect(state.tabs[0].id).to.equal(2)
expect(state.currentTabId).to.equal(2) expect(state.currentTabId).to.equal(2)
expect(state.currentTab).to.eql(tab2)
}) })
it('deleteTab - opened, last', () => { it('deleteTab - opened, last', () => {
@@ -208,13 +210,15 @@ describe('mutations', () => {
const state = { const state = {
tabs: [tab1, tab2], tabs: [tab1, tab2],
currentTabId: 2 currentTabId: 2,
currentTab: tab2
} }
deleteTab(state, tab2) deleteTab(state, tab2)
expect(state.tabs).to.have.lengthOf(1) expect(state.tabs).to.have.lengthOf(1)
expect(state.tabs[0].id).to.equal(1) expect(state.tabs[0].id).to.equal(1)
expect(state.currentTabId).to.equal(1) expect(state.currentTabId).to.equal(1)
expect(state.currentTab).to.eql(tab1)
}) })
it('deleteTab - opened, in the middle', () => { it('deleteTab - opened, in the middle', () => {
@@ -250,7 +254,8 @@ describe('mutations', () => {
const state = { const state = {
tabs: [tab1, tab2, tab3], tabs: [tab1, tab2, tab3],
currentTabId: 2 currentTabId: 2,
currentTab: tab2
} }
deleteTab(state, tab2) deleteTab(state, tab2)
@@ -258,6 +263,7 @@ describe('mutations', () => {
expect(state.tabs[0].id).to.equal(1) expect(state.tabs[0].id).to.equal(1)
expect(state.tabs[1].id).to.equal(3) expect(state.tabs[1].id).to.equal(3)
expect(state.currentTabId).to.equal(3) expect(state.currentTabId).to.equal(3)
expect(state.currentTab).to.eql(tab3)
}) })
it('deleteTab - opened, single', () => { it('deleteTab - opened, single', () => {
@@ -273,12 +279,14 @@ describe('mutations', () => {
const state = { const state = {
tabs: [tab1], tabs: [tab1],
currentTabId: 1 currentTabId: 1,
currentTab: tab1
} }
deleteTab(state, tab1) deleteTab(state, tab1)
expect(state.tabs).to.have.lengthOf(0) expect(state.tabs).to.have.lengthOf(0)
expect(state.currentTabId).to.equal(null) expect(state.currentTabId).to.equal(null)
expect(state.currentTab).to.equal(null)
}) })
it('setCurrentTabId', () => { it('setCurrentTabId', () => {