From a87079cd179033cebb6fd228ad7f1b991f3b6c46 Mon Sep 17 00:00:00 2001 From: Fabio Di Stasio Date: Mon, 12 Jul 2021 19:18:29 +0200 Subject: [PATCH 01/29] feat(UI): temporary table data tabs --- src/renderer/components/Workspace.vue | 127 ++++++++++-------- .../WorkspaceExploreBarMiscContext.vue | 2 +- .../components/WorkspaceExploreBarSchema.vue | 8 +- .../components/WorkspacePropsTabFunction.vue | 2 +- .../components/WorkspacePropsTabRoutine.vue | 2 +- .../WorkspacePropsTabTriggerFunction.vue | 2 +- src/renderer/components/WorkspaceQueryTab.vue | 2 +- src/renderer/components/WorkspaceTableTab.vue | 2 +- .../store/modules/workspaces.store.js | 28 ++-- 9 files changed, 104 insertions(+), 71 deletions(-) diff --git a/src/renderer/components/Workspace.vue b/src/renderer/components/Workspace.vue index 626ce6d0..5244d7ac 100644 --- a/src/renderer/components/Workspace.vue +++ b/src/renderer/components/Workspace.vue @@ -48,7 +48,7 @@ -
  • {{ $t('word.data').toUpperCase() }}: {{ schemaChild }} -
  • + -->
  • - + Query #{{ tab.index }} @@ -90,18 +90,22 @@ /> + + + {{ tab.table }} +
  • - - - --> +
    + class="column col-12" + > + + +
    tab.uid === this.workspace.selected_tab) || - ['data', 'prop'].includes(this.workspace.selected_tab) - ? this.workspace.selected_tab - : this.queryTabs[0].uid; + // return this.queryTabs.find(tab => tab.uid === this.workspace.selected_tab) || + // ['data', 'prop'].includes(this.workspace.selected_tab) + // ? this.workspace.selected_tab + // : this.queryTabs[0].uid; + + return this.workspace.selected_tab; }, queryTabs () { return this.workspace.tabs.filter(tab => tab.type === 'query'); @@ -286,8 +301,8 @@ export default { newTab: 'workspaces/newTab', removeTab: 'workspaces/removeTab' }), - addTab () { - this.newTab({ uid: this.connection.uid }); + addQueryTab () { + this.newTab({ uid: this.connection.uid, type: 'query' }); if (!this.hasWheelEvent) { this.$refs.tabWrap.addEventListener('wheel', e => { diff --git a/src/renderer/components/WorkspaceExploreBarMiscContext.vue b/src/renderer/components/WorkspaceExploreBarMiscContext.vue index 819a27b4..89f5321f 100644 --- a/src/renderer/components/WorkspaceExploreBarMiscContext.vue +++ b/src/renderer/components/WorkspaceExploreBarMiscContext.vue @@ -218,7 +218,7 @@ export default { sql = `CALL \`${this.localElement.name}\`(${params.join(',')})`; } - this.newTab({ uid: this.workspace.uid, content: sql, autorun: true }); + this.newTab({ uid: this.workspace.uid, content: sql, type: 'query', autorun: true }); this.closeContext(); }, async runFunctionCheck () { diff --git a/src/renderer/components/WorkspaceExploreBarSchema.vue b/src/renderer/components/WorkspaceExploreBarSchema.vue index fec7022b..75714882 100644 --- a/src/renderer/components/WorkspaceExploreBarSchema.vue +++ b/src/renderer/components/WorkspaceExploreBarSchema.vue @@ -19,7 +19,7 @@ :key="table.name" class="menu-item" :class="{'text-bold': breadcrumbs.schema === database.name && [breadcrumbs.table, breadcrumbs.view].includes(table.name)}" - @click="setBreadcrumbs({schema: database.name, [table.type]: table.name})" + @click="selectTable({schema: database.name, table})" @contextmenu.prevent="showTableContext($event, table)" > @@ -267,6 +267,7 @@ export default { methods: { ...mapActions({ changeBreadcrumbs: 'workspaces/changeBreadcrumbs', + newTab: 'workspaces/newTab', refreshSchema: 'workspaces/refreshSchema' }), formatBytes, @@ -279,6 +280,11 @@ export default { this.changeBreadcrumbs({ schema, table: null }); }, + selectTable ({ schema, table }) { + this.setBreadcrumbs({ schema, [table.type]: table.name }); + // TODO: open only if not present + this.newTab({ uid: this.connection.uid, table: table.name, schema: this.database.name, type: 'temp-data' }); + }, showSchemaContext (event, schema) { this.selectSchema(schema); this.$emit('show-schema-context', { event, schema }); diff --git a/src/renderer/components/WorkspacePropsTabFunction.vue b/src/renderer/components/WorkspacePropsTabFunction.vue index eb92e48f..74ada258 100644 --- a/src/renderer/components/WorkspacePropsTabFunction.vue +++ b/src/renderer/components/WorkspacePropsTabFunction.vue @@ -303,7 +303,7 @@ export default { sql = `SELECT \`${this.originalFunction.name}\` (${params.join(',')})`; } - this.newTab({ uid: this.connection.uid, content: sql, autorun: true }); + this.newTab({ uid: this.connection.uid, content: sql, type: 'query', autorun: true }); }, showOptionsModal () { this.isOptionsModal = true; diff --git a/src/renderer/components/WorkspacePropsTabRoutine.vue b/src/renderer/components/WorkspacePropsTabRoutine.vue index 0964e54c..b9ba1099 100644 --- a/src/renderer/components/WorkspacePropsTabRoutine.vue +++ b/src/renderer/components/WorkspacePropsTabRoutine.vue @@ -299,7 +299,7 @@ export default { sql = `CALL \`${this.originalRoutine.name}\`(${params.join(',')})`; } - this.newTab({ uid: this.connection.uid, content: sql, autorun: true }); + this.newTab({ uid: this.connection.uid, content: sql, type: 'query', autorun: true }); }, showOptionsModal () { this.isOptionsModal = true; diff --git a/src/renderer/components/WorkspacePropsTabTriggerFunction.vue b/src/renderer/components/WorkspacePropsTabTriggerFunction.vue index 718ca9f3..2cffae33 100644 --- a/src/renderer/components/WorkspacePropsTabTriggerFunction.vue +++ b/src/renderer/components/WorkspacePropsTabTriggerFunction.vue @@ -281,7 +281,7 @@ export default { sql = `SELECT \`${this.originalFunction.name}\` (${params.join(',')})`; } - this.newTab({ uid: this.connection.uid, content: sql, autorun: true }); + this.newTab({ uid: this.connection.uid, content: sql, type: 'query', autorun: true }); }, showOptionsModal () { this.isOptionsModal = true; diff --git a/src/renderer/components/WorkspaceQueryTab.vue b/src/renderer/components/WorkspaceQueryTab.vue index 0c4a1b04..4e3d3d0d 100644 --- a/src/renderer/components/WorkspaceQueryTab.vue +++ b/src/renderer/components/WorkspaceQueryTab.vue @@ -1,7 +1,7 @@ @@ -383,15 +384,25 @@ export default { flex: initial; > a { - padding: 0.2rem 0.8rem; + padding: 0.2rem 0.6rem; cursor: pointer; display: flex; align-items: center; opacity: 0.7; transition: opacity 0.2s; + .btn-clear { + margin-left: 0.5rem; + opacity: 0; + transition: opacity 0.2s; + } + &:hover { opacity: 1; + + .btn-clear { + opacity: 1; + } } &.tab-add { @@ -410,6 +421,10 @@ export default { &.active a { opacity: 1; + + .btn-clear { + opacity: 1; + } } &.tools-dropdown { diff --git a/src/renderer/components/WorkspaceExploreBarSchema.vue b/src/renderer/components/WorkspaceExploreBarSchema.vue index c52199be..648cdbb5 100644 --- a/src/renderer/components/WorkspaceExploreBarSchema.vue +++ b/src/renderer/components/WorkspaceExploreBarSchema.vue @@ -294,7 +294,7 @@ export default { this.$emit('show-schema-context', { event, schema }); }, showTableContext (event, table) { - this.setBreadcrumbs({ schema: this.database.name, [table.type]: table.name }); + // this.setBreadcrumbs({ schema: this.database.name, [table.type]: table.name }); this.$emit('show-table-context', { event, table }); }, showMiscContext (event, misc) { diff --git a/src/renderer/components/WorkspaceQueryTab.vue b/src/renderer/components/WorkspaceQueryTab.vue index c5388ce4..b9081b89 100644 --- a/src/renderer/components/WorkspaceQueryTab.vue +++ b/src/renderer/components/WorkspaceQueryTab.vue @@ -163,8 +163,15 @@ export default { return this.workspace.uid === this.selectedWorkspace; } }, + watch: { + isSelected (val) { + if (val) + this.changeBreadcrumbs({ schema: this.schema, query: `Query #${this.tab.index}` }); + } + }, created () { this.query = this.tab.content; + this.changeBreadcrumbs({ schema: this.schema, query: `Query #${this.tab.index}` }); window.addEventListener('keydown', this.onKey); }, @@ -186,7 +193,8 @@ export default { }, methods: { ...mapActions({ - addNotification: 'notifications/addNotification' + addNotification: 'notifications/addNotification', + changeBreadcrumbs: 'workspaces/changeBreadcrumbs' }), async runQuery (query) { if (!query || this.isQuering) return; diff --git a/src/renderer/components/WorkspaceQueryTable.vue b/src/renderer/components/WorkspaceQueryTable.vue index 2e470b85..5bb6c15f 100644 --- a/src/renderer/components/WorkspaceQueryTable.vue +++ b/src/renderer/components/WorkspaceQueryTable.vue @@ -71,6 +71,7 @@ :row="row" :fields="fieldsObj" :key-usage="keyUsage" + :element-type="elementType" :class="{'selected': selectedRows.includes(row._id)}" @select-row="selectRow($event, row._id)" @update-field="updateField($event, row)" @@ -123,7 +124,8 @@ export default { results: Array, connUid: String, mode: String, - isSelected: Boolean + isSelected: Boolean, + elementType: { type: String, default: 'table' } }, data () { return { diff --git a/src/renderer/components/WorkspaceQueryTableRow.vue b/src/renderer/components/WorkspaceQueryTableRow.vue index 03c3b493..111dc388 100644 --- a/src/renderer/components/WorkspaceQueryTableRow.vue +++ b/src/renderer/components/WorkspaceQueryTableRow.vue @@ -260,7 +260,8 @@ export default { props: { row: Object, fields: Object, - keyUsage: Array + keyUsage: Array, + elementType: { type: String, default: 'table' } }, data () { return { @@ -334,6 +335,8 @@ export default { return this.keyUsage.map(key => key.field); }, isEditable () { + if (this.elementType === 'view') return false; + if (this.fields) { const nElements = Object.keys(this.fields).reduce((acc, curr) => { acc.add(this.fields[curr].table); diff --git a/src/renderer/components/WorkspaceTableTab.vue b/src/renderer/components/WorkspaceTableTab.vue index b04c33bb..20913a9a 100644 --- a/src/renderer/components/WorkspaceTableTab.vue +++ b/src/renderer/components/WorkspaceTableTab.vue @@ -131,6 +131,7 @@ :conn-uid="connection.uid" :is-selected="isSelected" mode="table" + :element-type="elementType" @update-field="updateField" @delete-selected="deleteSelected" @hard-sort="hardSort" @@ -183,7 +184,8 @@ export default { connection: Object, isSelected: Boolean, table: String, - schema: String + schema: String, + elementType: String }, data () { return { @@ -261,9 +263,11 @@ export default { } }, isSelected (val) { - if (val && this.lastTable !== this.table) { - this.getTableData(); - this.lastTable = this.table; + if (val) { + this.changeBreadcrumbs({ schema: this.schema, [this.elementType]: this.table }); + + if (this.lastTable !== this.table) + this.getTableData(); } } }, @@ -277,7 +281,8 @@ export default { }, methods: { ...mapActions({ - addNotification: 'notifications/addNotification' + addNotification: 'notifications/addNotification', + changeBreadcrumbs: 'workspaces/changeBreadcrumbs' }), async getTableData (sortParams) { if (!this.table) return; @@ -287,6 +292,8 @@ export default { if (this.lastTable !== this.table) this.results = []; + this.lastTable = this.table; + const params = { uid: this.connection.uid, schema: this.schema, diff --git a/src/renderer/scss/themes/dark-theme.scss b/src/renderer/scss/themes/dark-theme.scss index 839ef854..f48e1582 100644 --- a/src/renderer/scss/themes/dark-theme.scss +++ b/src/renderer/scss/themes/dark-theme.scss @@ -63,6 +63,12 @@ background-color: $primary-color; } } + + &.btn-clear { + &:hover { + background: rgba($light-color, 20%); + } + } } .modal { diff --git a/src/renderer/store/modules/workspaces.store.js b/src/renderer/store/modules/workspaces.store.js index ab050f46..b5a720ea 100644 --- a/src/renderer/store/modules/workspaces.store.js +++ b/src/renderer/store/modules/workspaces.store.js @@ -472,7 +472,8 @@ export default { procedure: null, function: null, scheduler: null, - view: null + view: null, + query: null }; const hasLastChildren = Object.keys(lastBreadcrumbs).filter(b => b !== 'schema').some(b => lastBreadcrumbs[b]); From c87b8dc73867e7e50431429f2da41cf27ff11957 Mon Sep 17 00:00:00 2001 From: Fabio Di Stasio Date: Wed, 14 Jul 2021 18:15:13 +0200 Subject: [PATCH 09/29] refactor: passing schema from table context options --- src/main/libs/clients/MySQLClient.js | 6 ++--- src/main/libs/clients/PostgreSQLClient.js | 6 ++--- src/renderer/components/ModalEditSchema.vue | 8 +++---- .../components/WorkspaceExploreBar.vue | 22 ++++++++++--------- .../components/WorkspaceExploreBarSchema.vue | 2 +- .../WorkspaceExploreBarSchemaContext.vue | 10 ++++----- .../WorkspaceExploreBarTableContext.vue | 15 ++++++++----- 7 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/main/libs/clients/MySQLClient.js b/src/main/libs/clients/MySQLClient.js index 642a8fd6..f72f122c 100644 --- a/src/main/libs/clients/MySQLClient.js +++ b/src/main/libs/clients/MySQLClient.js @@ -1280,7 +1280,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async duplicateTable (params) { - const sql = `CREATE TABLE \`${this._schema}\`.\`${params.table}_copy\` LIKE \`${this._schema}\`.\`${params.table}\``; + const sql = `CREATE TABLE \`${params.schema}\`.\`${params.table}_copy\` LIKE \`${params.schema}\`.\`${params.table}\``; return await this.raw(sql); } @@ -1291,7 +1291,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async truncateTable (params) { - const sql = `TRUNCATE TABLE \`${this._schema}\`.\`${params.table}\``; + const sql = `TRUNCATE TABLE \`${params.schema}\`.\`${params.table}\``; return await this.raw(sql); } @@ -1302,7 +1302,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async dropTable (params) { - const sql = `DROP TABLE \`${this._schema}\`.\`${params.table}\``; + const sql = `DROP TABLE \`${params.schema}\`.\`${params.table}\``; return await this.raw(sql); } diff --git a/src/main/libs/clients/PostgreSQLClient.js b/src/main/libs/clients/PostgreSQLClient.js index ba0b18d1..6ea3e427 100644 --- a/src/main/libs/clients/PostgreSQLClient.js +++ b/src/main/libs/clients/PostgreSQLClient.js @@ -1157,7 +1157,7 @@ export class PostgreSQLClient extends AntaresCore { * @memberof PostgreSQLClient */ async duplicateTable (params) { - const sql = `CREATE TABLE ${this._schema}.${params.table}_copy (LIKE ${this._schema}.${params.table} INCLUDING ALL)`; + const sql = `CREATE TABLE ${params.schema}.${params.table}_copy (LIKE ${params.schema}.${params.table} INCLUDING ALL)`; return await this.raw(sql); } @@ -1168,7 +1168,7 @@ export class PostgreSQLClient extends AntaresCore { * @memberof PostgreSQLClient */ async truncateTable (params) { - const sql = `TRUNCATE TABLE ${this._schema}.${params.table}`; + const sql = `TRUNCATE TABLE ${params.schema}.${params.table}`; return await this.raw(sql); } @@ -1179,7 +1179,7 @@ export class PostgreSQLClient extends AntaresCore { * @memberof PostgreSQLClient */ async dropTable (params) { - const sql = `DROP TABLE ${this._schema}.${params.table}`; + const sql = `DROP TABLE ${params.schema}.${params.table}`; return await this.raw(sql); } diff --git a/src/renderer/components/ModalEditSchema.vue b/src/renderer/components/ModalEditSchema.vue index 36ece081..d047439e 100644 --- a/src/renderer/components/ModalEditSchema.vue +++ b/src/renderer/components/ModalEditSchema.vue @@ -72,7 +72,7 @@ import Schema from '@/ipc-api/Schema'; export default { name: 'ModalEditSchema', props: { - selectedDatabase: String + selectedSchema: String }, data () { return { @@ -99,7 +99,7 @@ export default { async created () { let actualCollation; try { - const { status, response } = await Schema.getDatabaseCollation({ uid: this.selectedWorkspace, database: this.selectedDatabase }); + const { status, response } = await Schema.getDatabaseCollation({ uid: this.selectedWorkspace, database: this.selectedSchema }); if (status === 'success') actualCollation = response; @@ -112,8 +112,8 @@ export default { } this.database = { - name: this.selectedDatabase, - prevName: this.selectedDatabase, + name: this.selectedSchema, + prevName: this.selectedSchema, collation: actualCollation || this.defaultCollation, prevCollation: actualCollation || this.defaultCollation }; diff --git a/src/renderer/components/WorkspaceExploreBar.vue b/src/renderer/components/WorkspaceExploreBar.vue index f7424f99..149cff80 100644 --- a/src/renderer/components/WorkspaceExploreBar.vue +++ b/src/renderer/components/WorkspaceExploreBar.vue @@ -100,7 +100,7 @@ />
    - {{ $t('message.deleteCorfirm') }} "{{ selectedDatabase }}"? + {{ $t('message.deleteCorfirm') }} "{{ selectedSchema }}"?
    @@ -110,7 +110,7 @@ export default { }, props: { contextEvent: MouseEvent, - selectedDatabase: String + selectedSchema: String }, data () { return { @@ -173,11 +173,11 @@ export default { try { const { status, response } = await Schema.deleteSchema({ uid: this.selectedWorkspace, - database: this.selectedDatabase + database: this.selectedSchema }); if (status === 'success') { - if (this.selectedDatabase === this.workspace.breadcrumbs.schema) + if (this.selectedSchema === this.workspace.breadcrumbs.schema) this.changeBreadcrumbs({ schema: null }); this.closeContext(); diff --git a/src/renderer/components/WorkspaceExploreBarTableContext.vue b/src/renderer/components/WorkspaceExploreBarTableContext.vue index 3efd1022..dd6c6e62 100644 --- a/src/renderer/components/WorkspaceExploreBarTableContext.vue +++ b/src/renderer/components/WorkspaceExploreBarTableContext.vue @@ -72,7 +72,8 @@ export default { }, props: { contextEvent: MouseEvent, - selectedTable: Object + selectedTable: Object, + selectedSchema: String }, data () { return { @@ -116,7 +117,8 @@ export default { try { const { status, response } = await Tables.duplicateTable({ uid: this.selectedWorkspace, - table: this.selectedTable.name + table: this.selectedTable.name, + schema: this.selectedSchema }); if (status === 'success') { @@ -134,7 +136,8 @@ export default { try { const { status, response } = await Tables.truncateTable({ uid: this.selectedWorkspace, - table: this.selectedTable.name + table: this.selectedTable.name, + schema: this.selectedSchema }); if (status === 'success') { @@ -155,13 +158,15 @@ export default { if (this.selectedTable.type === 'table') { res = await Tables.dropTable({ uid: this.selectedWorkspace, - table: this.selectedTable.name + table: this.selectedTable.name, + schema: this.selectedSchema }); } else if (this.selectedTable.type === 'view') { res = await Views.dropView({ uid: this.selectedWorkspace, - view: this.selectedTable.name + view: this.selectedTable.name, + schema: this.selectedSchema }); } From d38097d0567020b5265b5a0b347f5e1f38e0b1d4 Mon Sep 17 00:00:00 2001 From: Fabio Di Stasio Date: Wed, 14 Jul 2021 20:30:54 +0200 Subject: [PATCH 10/29] feat(UI): sortable tabs --- src/renderer/components/TheSettingBar.vue | 8 +- src/renderer/components/Workspace.vue | 188 +++++++++--------- .../components/WorkspacePropsTable.vue | 8 +- src/renderer/scss/themes/dark-theme.scss | 15 +- src/renderer/scss/themes/light-theme.scss | 10 + .../store/modules/workspaces.store.js | 6 + 6 files changed, 124 insertions(+), 111 deletions(-) diff --git a/src/renderer/components/TheSettingBar.vue b/src/renderer/components/TheSettingBar.vue index e890ad80..3a917d02 100644 --- a/src/renderer/components/TheSettingBar.vue +++ b/src/renderer/components/TheSettingBar.vue @@ -8,7 +8,7 @@ @close-context="isContext = false" />
    + + + + + + diff --git a/src/renderer/components/WorkspacePropsTab.vue b/src/renderer/components/WorkspacePropsTab.vue index 9096f082..87cd0f8a 100644 --- a/src/renderer/components/WorkspacePropsTab.vue +++ b/src/renderer/components/WorkspacePropsTab.vue @@ -444,7 +444,6 @@ export default { await this.refreshStructure(this.connection.uid); if (oldName !== this.localOptions.name) { - this.setUnsavedChanges(false); this.renameTabs({ uid: this.connection.uid, schema: this.schema, @@ -452,8 +451,11 @@ export default { elementNewName: this.localOptions.name, elementType: 'table' }); + this.changeBreadcrumbs({ schema: this.schema, table: this.localOptions.name }); } + + this.getFieldsData(); } else this.addNotification({ status: 'error', message: response }); diff --git a/src/renderer/components/WorkspacePropsTabTrigger.vue b/src/renderer/components/WorkspacePropsTabTrigger.vue index 9ed5161d..4da83c29 100644 --- a/src/renderer/components/WorkspacePropsTabTrigger.vue +++ b/src/renderer/components/WorkspacePropsTabTrigger.vue @@ -321,7 +321,6 @@ export default { await this.refreshStructure(this.connection.uid); if (this.originalTrigger.name !== this.localTrigger.name) { - this.setUnsavedChanges(false); const triggerName = this.customizations.triggerTableInName ? `${this.localTrigger.table}.${this.localTrigger.name}` : this.localTrigger.name; const triggerOldName = this.customizations.triggerTableInName ? `${this.originalTrigger.table}.${this.originalTrigger.name}` : this.originalTrigger.name; diff --git a/src/renderer/components/WorkspacePropsTabView.vue b/src/renderer/components/WorkspacePropsTabView.vue index 77a1cba3..d2065717 100644 --- a/src/renderer/components/WorkspacePropsTabView.vue +++ b/src/renderer/components/WorkspacePropsTabView.vue @@ -323,8 +323,6 @@ export default { await this.refreshStructure(this.connection.uid); if (oldName !== this.localView.name) { - this.setUnsavedChanges(false); - this.renameTabs({ uid: this.connection.uid, schema: this.schema, @@ -332,8 +330,11 @@ export default { elementNewName: this.localView.name, elementType: 'view' }); + this.changeBreadcrumbs({ schema: this.schema, view: this.localView.name }); } + + this.getViewData(); } else this.addNotification({ status: 'error', message: response }); diff --git a/src/renderer/components/old/TheAppWelcome.vue b/src/renderer/components/old/TheAppWelcome.vue deleted file mode 100644 index d3c94fb8..00000000 --- a/src/renderer/components/old/TheAppWelcome.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/src/renderer/i18n/en-US.js b/src/renderer/i18n/en-US.js index d99e21ec..a1133229 100644 --- a/src/renderer/i18n/en-US.js +++ b/src/renderer/i18n/en-US.js @@ -224,7 +224,8 @@ module.exports = { dataTabPageSize: 'DATA tab page size', enableSsh: 'Enable SSH', pageNumber: 'Page number', - duplicateTable: 'Duplicate table' + duplicateTable: 'Duplicate table', + noOpenTabs: 'There are no open tabs, navigate on the left bar or:' }, faker: { address: 'Address', diff --git a/src/renderer/images/logo-dark.svg b/src/renderer/images/logo-dark.svg new file mode 100644 index 00000000..dbe07d28 --- /dev/null +++ b/src/renderer/images/logo-dark.svg @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/renderer/images/logo-light.svg b/src/renderer/images/logo-light.svg new file mode 100644 index 00000000..30d40b74 --- /dev/null +++ b/src/renderer/images/logo-light.svg @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/renderer/store/modules/workspaces.store.js b/src/renderer/store/modules/workspaces.store.js index 4f189312..051ab3a0 100644 --- a/src/renderer/store/modules/workspaces.store.js +++ b/src/renderer/store/modules/workspaces.store.js @@ -498,8 +498,8 @@ export default { commit('ADD_WORKSPACE', workspace); - if (getters.getWorkspace(uid).tabs.length < 3) - dispatch('newTab', { uid, type: 'query' }); + // if (getters.getWorkspace(uid).tabs.length < 3) + // dispatch('newTab', { uid, type: 'query' }); }, changeBreadcrumbs ({ commit, getters }, payload) { const breadcrumbsObj = { @@ -659,7 +659,7 @@ export default { ? workspace.tabs.some(tab => tab.uid === workspace.selected_tab) : false; - if (!isSelectedExistent) + if (!isSelectedExistent && workspace.tabs.length) commit('SELECT_TAB', { uid, tab: workspace.tabs[workspace.tabs.length - 1].uid }); }, renameTabs ({ commit }, payload) { From e78ca2417e8f996fa0507c5a5586a75393dfe8ee Mon Sep 17 00:00:00 2001 From: Fabio Di Stasio Date: Mon, 19 Jul 2021 11:28:11 +0200 Subject: [PATCH 22/29] fix(UI): multiple trigger tabs open on single click on explore bar --- .../components/WorkspaceEmptyState.vue | 3 --- .../components/WorkspacePropsTabTrigger.vue | 16 +------------- .../store/modules/workspaces.store.js | 22 ++++++++++++++----- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/src/renderer/components/WorkspaceEmptyState.vue b/src/renderer/components/WorkspaceEmptyState.vue index 653f5bfa..e6496688 100644 --- a/src/renderer/components/WorkspaceEmptyState.vue +++ b/src/renderer/components/WorkspaceEmptyState.vue @@ -3,9 +3,6 @@
    -

    {{ $t('message.noOpenTabs') }}

    diff --git a/src/renderer/components/WorkspacePropsTabTrigger.vue b/src/renderer/components/WorkspacePropsTabTrigger.vue index 4da83c29..2757330c 100644 --- a/src/renderer/components/WorkspacePropsTabTrigger.vue +++ b/src/renderer/components/WorkspacePropsTabTrigger.vue @@ -152,7 +152,6 @@ export default { return { isLoading: false, isSaving: false, - isReady: false, originalTrigger: null, localTrigger: { sql: '' }, lastTrigger: null, @@ -214,18 +213,6 @@ export default { }, isChanged (val) { this.setUnsavedChanges({ uid: this.connection.uid, tUid: this.tabUid, isChanged: val }); - - if (val) { - const triggerName = this.customizations.triggerTableInName ? `${this.originalTrigger.table}.${this.originalTrigger.name}` : this.originalTrigger.name; - - this.newTab({ - uid: this.connection.uid, - elementName: triggerName, - schema: this.schema, - type: 'trigger-props', - elementType: 'trigger' - }); - } } }, async created () { @@ -234,7 +221,7 @@ export default { window.addEventListener('keydown', this.onKey); }, mounted () { - window.addEventListener('resize', this.resizeQueryEditor); ; + window.addEventListener('resize', this.resizeQueryEditor); }, destroyed () { window.removeEventListener('resize', this.resizeQueryEditor); @@ -274,7 +261,6 @@ export default { this.originalTrigger = response; this.localTrigger = JSON.parse(JSON.stringify(this.originalTrigger)); this.sqlProxy = this.localTrigger.sql; - this.isReady = true; if (this.customizations.triggerMultipleEvents) { this.originalTrigger.event.forEach(e => { diff --git a/src/renderer/store/modules/workspaces.store.js b/src/renderer/store/modules/workspaces.store.js index 051ab3a0..c9254722 100644 --- a/src/renderer/store/modules/workspaces.store.js +++ b/src/renderer/store/modules/workspaces.store.js @@ -497,9 +497,6 @@ export default { }; commit('ADD_WORKSPACE', workspace); - - // if (getters.getWorkspace(uid).tabs.length < 3) - // dispatch('newTab', { uid, type: 'query' }); }, changeBreadcrumbs ({ commit, getters }, payload) { const breadcrumbsObj = { @@ -615,8 +612,23 @@ export default { const tempTabs = workspaceTabs ? workspaceTabs.tabs.filter(tab => tab.type === 'temp-trigger-props') : false; if (tempTabs && tempTabs.length) { // if temp tab already opened for (const tab of tempTabs) { - commit('REPLACE_TAB', { uid, tab: tab.uid, type, schema, elementName, elementType }); - tabUid = tab.uid; + if (tab.isChanged) { + commit('REPLACE_TAB', { // make permanent a temp table with unsaved changes + uid, + tab: tab.uid, + type: 'trigger-props', + schema: tab.schema, + elementName: tab.elementName, + elementType: tab.elementType + }); + + tabUid = uidGen('T'); + commit('NEW_TAB', { uid, tab: tabUid, content, type, autorun, schema, elementName, elementType }); + } + else { + commit('REPLACE_TAB', { uid, tab: tab.uid, type, schema, elementName, elementType }); + tabUid = tab.uid; + } } } else { From 58b91ebfe0ab200d76d4cfd442b9f2970ae97384 Mon Sep 17 00:00:00 2001 From: Fabio Di Stasio Date: Mon, 19 Jul 2021 22:38:56 +0200 Subject: [PATCH 23/29] feat: new trigger function tabs --- src/renderer/components/Workspace.vue | 82 ++++++++++--------- .../components/WorkspaceEmptyState.vue | 10 ++- .../components/WorkspaceExploreBarSchema.vue | 9 +- .../WorkspacePropsTabTriggerFunction.vue | 58 ++++++++----- .../store/modules/workspaces.store.js | 14 ++-- 5 files changed, 105 insertions(+), 68 deletions(-) diff --git a/src/renderer/components/Workspace.vue b/src/renderer/components/Workspace.vue index b59bddfc..37ae640c 100644 --- a/src/renderer/components/Workspace.vue +++ b/src/renderer/components/Workspace.vue @@ -15,28 +15,6 @@ draggable=".tab-draggable" @mouseover.native="addWheelEvent" > -
  • + + + + + {{ tab.elementName }} + + + + + + + + {{ tab.elementName }} + + +
  • - - - - -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    - -
    -
    - - -
    - - -
    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    - -
    - -
    - - - - - - - - - - - diff --git a/src/renderer/components/old/ModalNewConnection.vue b/src/renderer/components/old/ModalNewConnection.vue deleted file mode 100644 index 736f06bf..00000000 --- a/src/renderer/components/old/ModalNewConnection.vue +++ /dev/null @@ -1,518 +0,0 @@ - - - - - diff --git a/src/renderer/components/old/WorkspaceConnectPanel.vue b/src/renderer/components/old/WorkspaceConnectPanel.vue deleted file mode 100644 index 7854fbdd..00000000 --- a/src/renderer/components/old/WorkspaceConnectPanel.vue +++ /dev/null @@ -1,82 +0,0 @@ - - - - - From adc5477673603cd63fabf77a53db5397e3774e0e Mon Sep 17 00:00:00 2001 From: Fabio Di Stasio Date: Thu, 22 Jul 2021 10:41:06 +0200 Subject: [PATCH 29/29] feat: option to restore session on startup --- src/renderer/components/ModalSettings.vue | 18 +++++++ .../components/WorkspaceExploreBar.vue | 12 ++--- .../components/WorkspacePropsTabView.vue | 10 ++-- src/renderer/components/WorkspaceQueryTab.vue | 11 +++-- src/renderer/i18n/en-US.js | 3 +- src/renderer/store/modules/settings.store.js | 13 ++++- .../store/modules/workspaces.store.js | 47 +++++++++++++++---- 7 files changed, 88 insertions(+), 26 deletions(-) diff --git a/src/renderer/components/ModalSettings.vue b/src/renderer/components/ModalSettings.vue index e7f57fb4..f122f40f 100644 --- a/src/renderer/components/ModalSettings.vue +++ b/src/renderer/components/ModalSettings.vue @@ -104,6 +104,19 @@ +
    +
    + +
    +
    + +
    +