From 0e15c39797fe34f7a649f85ee62204682d45c98a Mon Sep 17 00:00:00 2001 From: Giulio Ganci Date: Sun, 17 Oct 2021 23:54:00 +0200 Subject: [PATCH 1/6] feat(UI): multi column table filters --- src/main/ipc-handlers/tables.js | 5 +- src/renderer/components/WorkspaceTabTable.vue | 33 +++- .../components/WorkspaceTabTableFilters.vue | 162 ++++++++++++++++++ src/renderer/i18n/en-US.js | 3 +- src/renderer/i18n/it-IT.js | 3 +- 5 files changed, 201 insertions(+), 5 deletions(-) create mode 100644 src/renderer/components/WorkspaceTabTableFilters.vue diff --git a/src/main/ipc-handlers/tables.js b/src/main/ipc-handlers/tables.js index 46e1558b..47ef823f 100644 --- a/src/main/ipc-handlers/tables.js +++ b/src/main/ipc-handlers/tables.js @@ -16,7 +16,7 @@ export default (connections) => { } }); - ipcMain.handle('get-table-data', async (event, { uid, schema, table, limit, page, sortParams }) => { + ipcMain.handle('get-table-data', async (event, { uid, schema, table, limit, page, sortParams, where }) => { try { const offset = (page - 1) * limit; const query = connections[uid] @@ -29,6 +29,9 @@ export default (connections) => { if (sortParams && sortParams.field && sortParams.dir) query.orderBy({ [sortParams.field]: sortParams.dir.toUpperCase() }); + if (where) + query.where(where); + const result = await query.run({ details: true, schema }); return { status: 'success', response: result }; diff --git a/src/renderer/components/WorkspaceTabTable.vue b/src/renderer/components/WorkspaceTabTable.vue index c4f4f4fb..e61f28b1 100644 --- a/src/renderer/components/WorkspaceTabTable.vue +++ b/src/renderer/components/WorkspaceTabTable.vue @@ -71,6 +71,13 @@
+
+
0 && !val) { + this.filters = []; + this.getTableData(); + } } }, created () { @@ -302,7 +324,8 @@ export default { table: this.table, limit: this.limit, page: this.page, - sortParams: this.sortParams + sortParams: this.sortParams, + where: this.filters || [] }; try { // Table data @@ -389,11 +412,13 @@ export default { if (e.key === 'F5') this.reloadTable(); - if (e.ctrlKey) { + if (e.ctrlKey || e.metaKey) { if (e.key === 'ArrowRight') this.pageChange('next'); if (e.key === 'ArrowLeft') this.pageChange('prev'); + if (e.keyCode === 70) // f + this.isSearch = !this.isSearch; } } }, @@ -410,6 +435,10 @@ export default { }, downloadTable (format) { this.$refs.queryTable.downloadTable(format, this.table); + }, + updateFilters (clausoles) { + this.filters = clausoles; + this.getTableData(); } } }; diff --git a/src/renderer/components/WorkspaceTabTableFilters.vue b/src/renderer/components/WorkspaceTabTableFilters.vue new file mode 100644 index 00000000..24806266 --- /dev/null +++ b/src/renderer/components/WorkspaceTabTableFilters.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/renderer/i18n/en-US.js b/src/renderer/i18n/en-US.js index 6858b542..3985f11c 100644 --- a/src/renderer/i18n/en-US.js +++ b/src/renderer/i18n/en-US.js @@ -120,7 +120,8 @@ module.exports = { new: 'New', history: 'History', select: 'Select', - passphrase: 'Passphrase' + passphrase: 'Passphrase', + filter: 'Filter' }, message: { appWelcome: 'Welcome to Antares SQL Client!', diff --git a/src/renderer/i18n/it-IT.js b/src/renderer/i18n/it-IT.js index f84f1782..37694b3c 100644 --- a/src/renderer/i18n/it-IT.js +++ b/src/renderer/i18n/it-IT.js @@ -115,7 +115,8 @@ module.exports = { cell: 'Cella | Celle', triggerFunction: 'Funzione di trigger | Funzioni di trigger', all: 'Tutto', - duplicate: 'Duplica' + duplicate: 'Duplica', + filter: 'Filtra' }, message: { appWelcome: 'Benvenuto in Antares SQL Client!', From f9ee7d0450a1386800223d7b96849e06ae02aece Mon Sep 17 00:00:00 2001 From: Fabio Di Stasio Date: Mon, 18 Oct 2021 11:58:29 +0200 Subject: [PATCH 2/6] perf(UI): resize results table on filters change --- src/renderer/components/WorkspaceTabTable.vue | 5 +++++ src/renderer/components/WorkspaceTabTableFilters.vue | 7 +++++-- src/renderer/i18n/it-IT.js | 5 +++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/WorkspaceTabTable.vue b/src/renderer/components/WorkspaceTabTable.vue index e61f28b1..b6676464 100644 --- a/src/renderer/components/WorkspaceTabTable.vue +++ b/src/renderer/components/WorkspaceTabTable.vue @@ -132,6 +132,7 @@ v-if="isSearch" :fields="fields" @filter="updateFilters" + @filter-change="resizeScroller" />
@@ -293,6 +294,7 @@ export default { this.filters = []; this.getTableData(); } + this.resizeScroller(); } }, created () { @@ -436,6 +438,9 @@ export default { downloadTable (format) { this.$refs.queryTable.downloadTable(format, this.table); }, + resizeScroller () { + setTimeout(() => this.$refs.queryTable.refreshScroller(), 1); + }, updateFilters (clausoles) { this.filters = clausoles; this.getTableData(); diff --git a/src/renderer/components/WorkspaceTabTableFilters.vue b/src/renderer/components/WorkspaceTabTableFilters.vue index 24806266..2ae51437 100644 --- a/src/renderer/components/WorkspaceTabTableFilters.vue +++ b/src/renderer/components/WorkspaceTabTableFilters.vue @@ -5,7 +5,7 @@ :key="index" class="workspace-table-filters-row" > -
- +
@@ -89,13 +89,11 @@ export default { methods: { addRow () { this.rows.push({ active: true, field: this.fields[0].name, op: '=', value: '', value2: '' }); - this.$emit('filter-change'); + this.$emit('filter-change', this.rows); }, removeRow (i) { - if (this.rows.length >= 2) { - this.rows = this.rows.filter((_, idx) => idx !== i); - this.$emit('filter-change'); - } + this.rows = this.rows.filter((_, idx) => idx !== i); + this.$emit('filter-change', this.rows); }, doFilter () { const clausoles = this.rows.filter(el => el.active).map(el => this.createClausole(el)); From 91788054e6302e83cb4a7501ad6c3f72809cb3bb Mon Sep 17 00:00:00 2001 From: Giulio Ganci Date: Mon, 18 Oct 2021 21:11:09 +0200 Subject: [PATCH 4/6] feat(UI): hide filter bar if there are no more rows in it --- src/renderer/components/WorkspaceTabTable.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/WorkspaceTabTable.vue b/src/renderer/components/WorkspaceTabTable.vue index b6676464..e4e9a9a2 100644 --- a/src/renderer/components/WorkspaceTabTable.vue +++ b/src/renderer/components/WorkspaceTabTable.vue @@ -132,7 +132,7 @@ v-if="isSearch" :fields="fields" @filter="updateFilters" - @filter-change="resizeScroller" + @filter-change="onFilterChange" />
@@ -438,6 +438,10 @@ export default { downloadTable (format) { this.$refs.queryTable.downloadTable(format, this.table); }, + onFilterChange (clausoles) { + if (clausoles.length === 0) + this.isSearch = false; + }, resizeScroller () { setTimeout(() => this.$refs.queryTable.refreshScroller(), 1); }, From 69cd083054cae50d64475b9f1f5d7ebd39093e39 Mon Sep 17 00:00:00 2001 From: Giulio Ganci Date: Mon, 18 Oct 2021 21:13:19 +0200 Subject: [PATCH 5/6] fix: query failure when a filter with a numeric value is used --- src/renderer/components/WorkspaceTabTableFilters.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/renderer/components/WorkspaceTabTableFilters.vue b/src/renderer/components/WorkspaceTabTableFilters.vue index 2e40d59e..16fb1a4e 100644 --- a/src/renderer/components/WorkspaceTabTableFilters.vue +++ b/src/renderer/components/WorkspaceTabTableFilters.vue @@ -131,6 +131,9 @@ export default { value = '"' + filter.value + '"'; } + if (isNumeric && value.length === 0) + value = '""'; + return `${filter.field} ${filter.op} ${value}`; } } From 7dc33c78aa4152264cc6833437be9af9b8621867 Mon Sep 17 00:00:00 2001 From: Giulio Ganci Date: Mon, 18 Oct 2021 21:23:22 +0200 Subject: [PATCH 6/6] fix: regression during resize results table on filters change --- src/renderer/components/WorkspaceTabTable.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/WorkspaceTabTable.vue b/src/renderer/components/WorkspaceTabTable.vue index e4e9a9a2..84e6999f 100644 --- a/src/renderer/components/WorkspaceTabTable.vue +++ b/src/renderer/components/WorkspaceTabTable.vue @@ -439,6 +439,7 @@ export default { this.$refs.queryTable.downloadTable(format, this.table); }, onFilterChange (clausoles) { + this.resizeScroller(); if (clausoles.length === 0) this.isSearch = false; },