mirror of
https://github.com/Fabio286/antares.git
synced 2025-06-05 21:59:22 +02:00
feat: export data tables to json or csv file
This commit is contained in:
@ -206,7 +206,7 @@
|
|||||||
<h4>{{ appName }}</h4>
|
<h4>{{ appName }}</h4>
|
||||||
<p>
|
<p>
|
||||||
{{ $t('word.version') }}: {{ appVersion }}<br>
|
{{ $t('word.version') }}: {{ appVersion }}<br>
|
||||||
<a class="c-hand" @click="openOutside('https://github.com/Fabio286/antares')">GitHub</a><br>
|
<a class="c-hand" @click="openOutside('https://github.com/Fabio286/antares')">GitHub</a> | <a class="c-hand" @click="openOutside('https://github.com/Fabio286/antares/blob/master/CHANGELOG.md')">CHANGELOG</a><br>
|
||||||
<small>{{ $t('word.author') }}: <a class="c-hand" @click="openOutside('https://github.com/Fabio286')">Fabio Di Stasio</a></small><br>
|
<small>{{ $t('word.author') }}: <a class="c-hand" @click="openOutside('https://github.com/Fabio286')">Fabio Di Stasio</a></small><br>
|
||||||
<small>{{ $t('message.madeWithJS') }}</small>
|
<small>{{ $t('message.madeWithJS') }}</small>
|
||||||
</p>
|
</p>
|
||||||
|
@ -80,6 +80,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { uidGen } from 'common/libs/uidGen';
|
import { uidGen } from 'common/libs/uidGen';
|
||||||
|
import arrayToFile from '../libs/arrayToFile';
|
||||||
import { LONG_TEXT, BLOB } from 'common/fieldTypes';
|
import { LONG_TEXT, BLOB } from 'common/fieldTypes';
|
||||||
import BaseVirtualScroll from '@/components/BaseVirtualScroll';
|
import BaseVirtualScroll from '@/components/BaseVirtualScroll';
|
||||||
import WorkspaceQueryTableRow from '@/components/WorkspaceQueryTableRow';
|
import WorkspaceQueryTableRow from '@/components/WorkspaceQueryTableRow';
|
||||||
@ -354,6 +355,15 @@ export default {
|
|||||||
},
|
},
|
||||||
selectResultset (index) {
|
selectResultset (index) {
|
||||||
this.resultsetIndex = index;
|
this.resultsetIndex = index;
|
||||||
|
},
|
||||||
|
downloadTable (format, filename) {
|
||||||
|
if (!this.sortedResults) return;
|
||||||
|
|
||||||
|
arrayToFile({
|
||||||
|
type: format,
|
||||||
|
content: this.sortedResults,
|
||||||
|
filename
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -32,13 +32,30 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button
|
|
||||||
class="btn btn-dark btn-sm"
|
<button class="btn btn-dark btn-sm" @click="showAddModal">
|
||||||
@click="showAddModal"
|
|
||||||
>
|
|
||||||
<span>{{ $t('word.add') }}</span>
|
<span>{{ $t('word.add') }}</span>
|
||||||
<i class="mdi mdi-24px mdi-playlist-plus ml-1" />
|
<i class="mdi mdi-24px mdi-playlist-plus ml-1" />
|
||||||
</button>
|
</button>
|
||||||
|
<div class="dropdown export-dropdown">
|
||||||
|
<button
|
||||||
|
:disabled="isQuering"
|
||||||
|
class="btn btn-dark btn-sm dropdown-toggle mr-0 pr-0"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<span>{{ $t('word.export') }}</span>
|
||||||
|
<i class="mdi mdi-24px mdi-file-export ml-1" />
|
||||||
|
<i class="mdi mdi-24px mdi-menu-down" />
|
||||||
|
</button>
|
||||||
|
<ul class="menu text-left">
|
||||||
|
<li class="menu-item">
|
||||||
|
<a class="c-hand" @click="downloadTable('json')">JSON</a>
|
||||||
|
</li>
|
||||||
|
<li class="menu-item">
|
||||||
|
<a class="c-hand" @click="downloadTable('csv')">CSV</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="workspace-query-info">
|
<div class="workspace-query-info">
|
||||||
<div v-if="results.length && results[0].rows">
|
<div v-if="results.length && results[0].rows">
|
||||||
@ -222,7 +239,21 @@ export default {
|
|||||||
this.reloadTable();
|
this.reloadTable();
|
||||||
}, this.autorefreshTimer * 1000);
|
}, this.autorefreshTimer * 1000);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
downloadTable (format) {
|
||||||
|
this.$refs.queryTable.downloadTable(format, this.table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.export-dropdown {
|
||||||
|
.menu {
|
||||||
|
min-width: 100%;
|
||||||
|
|
||||||
|
.menu-item a:hover {
|
||||||
|
background: $bg-color-gray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@ -78,7 +78,8 @@ module.exports = {
|
|||||||
parameters: 'Parameters',
|
parameters: 'Parameters',
|
||||||
function: 'Function | Functions',
|
function: 'Function | Functions',
|
||||||
deterministic: 'Deterministic',
|
deterministic: 'Deterministic',
|
||||||
context: 'Context'
|
context: 'Context',
|
||||||
|
export: 'Export'
|
||||||
},
|
},
|
||||||
message: {
|
message: {
|
||||||
appWelcome: 'Welcome to Antares SQL Client!',
|
appWelcome: 'Welcome to Antares SQL Client!',
|
||||||
|
37
src/renderer/libs/arrayToFile.js
Normal file
37
src/renderer/libs/arrayToFile.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
const arrayToFile = args => {
|
||||||
|
let mime;
|
||||||
|
let content;
|
||||||
|
|
||||||
|
switch (args.type) {
|
||||||
|
case 'csv': {
|
||||||
|
mime = 'text/csv';
|
||||||
|
const csv = [];
|
||||||
|
|
||||||
|
if (args.content.length)
|
||||||
|
csv.push(Object.keys(args.content[0]).join(';'));
|
||||||
|
|
||||||
|
for (const row of args.content)
|
||||||
|
csv.push(Object.values(row).map(col => typeof col === 'string' ? `"${col}"` : col).join(';'));
|
||||||
|
|
||||||
|
content = csv.join('\n');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'json':
|
||||||
|
mime = 'application/json';
|
||||||
|
content = JSON.stringify(args.content, null, 3);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const file = new Blob([content], { mime });
|
||||||
|
const downloadLink = document.createElement('a');
|
||||||
|
downloadLink.download = `${args.filename}.${args.type}`;
|
||||||
|
downloadLink.href = window.URL.createObjectURL(file);
|
||||||
|
downloadLink.style.display = 'none';
|
||||||
|
document.body.appendChild(downloadLink);
|
||||||
|
downloadLink.click();
|
||||||
|
};
|
||||||
|
|
||||||
|
export default arrayToFile;
|
@ -307,18 +307,7 @@ export default {
|
|||||||
uid,
|
uid,
|
||||||
connected: false,
|
connected: false,
|
||||||
selected_tab: 0,
|
selected_tab: 0,
|
||||||
tabs: [{
|
tabs: [],
|
||||||
uid: 'data',
|
|
||||||
type: 'table',
|
|
||||||
fields: [],
|
|
||||||
keyUsage: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
uid: 'prop',
|
|
||||||
type: 'table',
|
|
||||||
fields: [],
|
|
||||||
keyUsage: []
|
|
||||||
}],
|
|
||||||
structure: {},
|
structure: {},
|
||||||
variables: [],
|
variables: [],
|
||||||
collations: [],
|
collations: [],
|
||||||
|
Reference in New Issue
Block a user