From 3abff3613618ddc86e1d6c898f83bcb360e8e5d9 Mon Sep 17 00:00:00 2001 From: Fabio Di Stasio Date: Wed, 4 Aug 2021 09:59:50 +0200 Subject: [PATCH] feat: contextual menu option to duplicate table fields --- package.json | 18 ++++++------ src/renderer/components/BaseContextMenu.vue | 28 +++++++++++-------- src/renderer/components/ModalSettings.vue | 2 +- .../WorkspaceExploreBarTableContext.vue | 8 +++--- src/renderer/components/WorkspacePropsTab.vue | 8 ++++++ .../components/WorkspacePropsTable.vue | 4 +++ .../components/WorkspacePropsTableContext.vue | 7 +++++ .../components/WorkspacePropsTableRow.vue | 1 - 8 files changed, 50 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index fac39233..efd08164 100644 --- a/package.json +++ b/package.json @@ -87,17 +87,17 @@ } }, "dependencies": { - "@electron/remote": "^1.2.0", + "@electron/remote": "^1.2.1", "@mdi/font": "^5.9.55", "ace-builds": "^1.4.12", - "electron-log": "^4.3.5", + "electron-log": "^4.4.1", "electron-store": "^8.0.0", "electron-updater": "^4.3.9", "faker": "^5.5.3", "marked": "^2.1.1", "moment": "^2.29.1", "mysql2": "^2.2.5", - "pg": "^8.5.1", + "pg": "^8.7.1", "pgsql-ast-parser": "^7.2.1", "source-map-support": "^0.5.16", "spectre.css": "^0.5.9", @@ -109,22 +109,22 @@ "vuex": "^3.6.2" }, "devDependencies": { - "@babel/eslint-parser": "^7.14.5", + "@babel/eslint-parser": "^7.14.9", "cross-env": "^7.0.2", - "electron": "^13.1.2", + "electron": "^13.1.8", "electron-builder": "^22.11.7", "electron-devtools-installer": "^3.2.0", "electron-webpack": "^2.8.2", "electron-webpack-vue": "^2.4.0", - "eslint": "^7.29.0", + "eslint": "^7.32.0", "eslint-config-standard": "^16.0.3", "eslint-plugin-import": "^2.23.4", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^5.1.0", - "eslint-plugin-vue": "^7.11.1", - "sass": "^1.35.1", + "eslint-plugin-vue": "^7.15.1", + "sass": "^1.37.5", "sass-loader": "^10.2.0", - "standard-version": "^9.3.0", + "standard-version": "^9.3.1", "stylelint": "^13.13.1", "stylelint-config-standard": "^22.0.0", "stylelint-scss": "^3.20.1", diff --git a/src/renderer/components/BaseContextMenu.vue b/src/renderer/components/BaseContextMenu.vue index 87f02242..9be75aed 100644 --- a/src/renderer/components/BaseContextMenu.vue +++ b/src/renderer/components/BaseContextMenu.vue @@ -29,18 +29,23 @@ export default { }, computed: { position () { - const { clientY, clientX } = this.contextEvent; - let topCord = `${clientY + 2}px`; - let leftCord = `${clientX + 5}px`; + let topCord = 0; + let leftCord = 0; - if (this.contextSize) { - if (clientY + (this.contextSize.height < 200 ? 200 : this.contextSize.height) + 5 >= window.innerHeight) { - topCord = `${clientY + 3 - this.contextSize.height}px`; - this.isBottom = true; + if (this.contextEvent) { + const { clientY, clientX } = this.contextEvent; + topCord = `${clientY + 2}px`; + leftCord = `${clientX + 5}px`; + + if (this.contextSize) { + if (clientY + (this.contextSize.height < 200 ? 200 : this.contextSize.height) + 5 >= window.innerHeight) { + topCord = `${clientY + 3 - this.contextSize.height}px`; + this.isBottom = true; + } + + if (clientX + this.contextSize.width + 5 >= window.innerWidth) + leftCord = `${clientX - this.contextSize.width}px`; } - - if (clientX + this.contextSize.width + 5 >= window.innerWidth) - leftCord = `${clientX - this.contextSize.width}px`; } return { @@ -53,7 +58,8 @@ export default { window.addEventListener('keydown', this.onKey); }, mounted () { - this.contextSize = this.$refs.contextContent.getBoundingClientRect(); + if (this.$refs.contextContent) + this.contextSize = this.$refs.contextContent.getBoundingClientRect(); }, beforeDestroy () { window.removeEventListener('keydown', this.onKey); diff --git a/src/renderer/components/ModalSettings.vue b/src/renderer/components/ModalSettings.vue index ba8007d3..637e66af 100644 --- a/src/renderer/components/ModalSettings.vue +++ b/src/renderer/components/ModalSettings.vue @@ -318,7 +318,7 @@ export default { localTimeout: null, localEditorTheme: null, selectedTab: 'general', - pageSizes: [40, 100, 250, 500, 1000], + pageSizes: [30, 40, 100, 250, 500, 1000], editorThemes: [ { group: this.$t('word.light'), diff --git a/src/renderer/components/WorkspaceExploreBarTableContext.vue b/src/renderer/components/WorkspaceExploreBarTableContext.vue index dc589d9e..06a22389 100644 --- a/src/renderer/components/WorkspaceExploreBarTableContext.vue +++ b/src/renderer/components/WorkspaceExploreBarTableContext.vue @@ -4,28 +4,28 @@ @close-context="closeContext" >
{{ $t('word.settings') }}
{{ $t('word.settings') }}
{{ $t('message.duplicateTable') }}
diff --git a/src/renderer/components/WorkspacePropsTab.vue b/src/renderer/components/WorkspacePropsTab.vue index 9488bdee..592ea66b 100644 --- a/src/renderer/components/WorkspacePropsTab.vue +++ b/src/renderer/components/WorkspacePropsTab.vue @@ -81,6 +81,7 @@ :table="table" :schema="schema" mode="table" + @duplicate-field="duplicateField" @remove-field="removeField" @add-new-index="addNewIndex" @add-to-index="addToIndex" @@ -527,6 +528,13 @@ export default { return key; }); }, + duplicateField (uid) { + const fieldToClone = Object.assign({}, this.localFields.find(field => field._id === uid)); + fieldToClone._id = uidGen(); + fieldToClone.name = `${fieldToClone.name}_copy`; + fieldToClone.order = this.localFields.length + 1; + this.localFields = [...this.localFields, fieldToClone]; + }, removeField (uid) { this.localFields = this.localFields.filter(field => field._id !== uid); }, diff --git a/src/renderer/components/WorkspacePropsTable.vue b/src/renderer/components/WorkspacePropsTable.vue index 3814e929..2e8a7105 100644 --- a/src/renderer/components/WorkspacePropsTable.vue +++ b/src/renderer/components/WorkspacePropsTable.vue @@ -11,6 +11,7 @@ :index-types="indexTypes" :indexes="indexes" @delete-selected="removeField" + @duplicate-selected="duplicateField" @close-context="isContext = false" @add-new-index="$emit('add-new-index', $event)" @add-to-index="$emit('add-to-index', $event)" @@ -220,6 +221,9 @@ export default { this.contextEvent = event; this.isContext = true; }, + duplicateField () { + this.$emit('duplicate-field', this.selectedField._id); + }, removeField () { this.$emit('remove-field', this.selectedField._id); }, diff --git a/src/renderer/components/WorkspacePropsTableContext.vue b/src/renderer/components/WorkspacePropsTableContext.vue index fe71fde6..0a9d32dc 100644 --- a/src/renderer/components/WorkspacePropsTableContext.vue +++ b/src/renderer/components/WorkspacePropsTableContext.vue @@ -33,6 +33,9 @@
+
+ {{ $t('word.duplicate') }} +
{{ $t('message.deleteField') }}
@@ -62,6 +65,10 @@ export default { closeContext () { this.$emit('close-context'); }, + duplicateField () { + this.$emit('duplicate-selected'); + this.closeContext(); + }, deleteField () { this.$emit('delete-selected'); this.closeContext(); diff --git a/src/renderer/components/WorkspacePropsTableRow.vue b/src/renderer/components/WorkspacePropsTableRow.vue index 0199a6f5..65bd7465 100644 --- a/src/renderer/components/WorkspacePropsTableRow.vue +++ b/src/renderer/components/WorkspacePropsTableRow.vue @@ -459,7 +459,6 @@ export default { : ''; } else if (this.defaultValue.type === 'expression') { - console.log(this.localRow.default); if (this.localRow.default.toUpperCase().includes('ON UPDATE')) this.defaultValue.expression = this.localRow.default.replace(/ on update.*$/i, ''); else