1
1
mirror of https://github.com/Fabio286/antares.git synced 2025-02-16 03:30:55 +01:00

FIelds edit implemented

This commit is contained in:
Fabio 2020-06-28 15:31:16 +02:00
parent f350fe8203
commit db71777cbc
9 changed files with 154 additions and 61 deletions

View File

@ -1,5 +1,16 @@
# Changelog # Changelog
## [0.0.2-alpha](https://github.com/Fabio286/antares/releases/tag/v0.0.2-alpha) - 2020-06-26
### Added
- **Edit table fields:** You can edit fields from tables by double click. For now is available only on numeric and textual values.
- Various improvements under the hood.
### Fixed
- Connection test.
## [0.0.1-alpha](https://github.com/Fabio286/antares/releases/tag/v0.0.1-alpha) - 2020-06-19 ## [0.0.1-alpha](https://github.com/Fabio286/antares/releases/tag/v0.0.1-alpha) - 2020-06-19
### Features ### Features

99
package-lock.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "antares", "name": "antares",
"version": "0.0.0-alpha", "version": "0.0.1-alpha",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -3047,9 +3047,9 @@
"dev": true "dev": true
}, },
"codemirror": { "codemirror": {
"version": "5.54.0", "version": "5.55.0",
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.54.0.tgz", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.55.0.tgz",
"integrity": "sha512-Pgf3surv4zvw+KaW3doUU7pGjF0BPU8/sj7eglWJjzni46U/DDW8pu3nZY0QgQKUcICDXRkq8jZmq0y6KhxM3Q==" "integrity": "sha512-TumikSANlwiGkdF/Blnu/rqovZ0Y3Jh8yy9TqrPbSM0xxSucq3RgnpVDQ+mD9q6JERJEIT2FMuF/fBGfkhIR/g=="
}, },
"collection-visit": { "collection-visit": {
"version": "1.0.0", "version": "1.0.0",
@ -4034,9 +4034,9 @@
} }
}, },
"electron": { "electron": {
"version": "8.3.0", "version": "8.3.4",
"resolved": "https://registry.npmjs.org/electron/-/electron-8.3.0.tgz", "resolved": "https://registry.npmjs.org/electron/-/electron-8.3.4.tgz",
"integrity": "sha512-XRjiIJICZCgUr2vKSUI2PTkfP0gPFqCtqJUaTJSfCTuE3nTrxBKOUNeRMuCzEqspKkpFQU3SB3MdbMSHmZARlQ==", "integrity": "sha512-aSYXBV0PxYHmXhjGFpR0x38zbO7UTDex2JrT5tcqJpUZTY+sKdfo9PA1TpiyrHNjA5+Q8UseRUsydRedOTeZQA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@electron/get": "^1.0.1", "@electron/get": "^1.0.1",
@ -4116,9 +4116,9 @@
} }
}, },
"electron-devtools-installer": { "electron-devtools-installer": {
"version": "3.0.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.0.0.tgz", "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.1.0.tgz",
"integrity": "sha512-zll3w/8PvnPiGmL5tBtgSSoSjWnUljsOjJYsYYU12PKLljzWyfD6S75LKTZFn21VYxVbae2OwmjM5uFStLp6nQ==", "integrity": "sha512-qZd1Aoya8YOK6QauNX92V5qyKGtb4lbs238bP+qtMBkXts24xJ/1PtOVBPvdg5w3Ts9L5o6I9sDErKuzHeJFDA==",
"dev": true, "dev": true,
"requires": { "requires": {
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
@ -4138,9 +4138,9 @@
} }
}, },
"electron-log": { "electron-log": {
"version": "4.2.1", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.2.1.tgz", "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.2.2.tgz",
"integrity": "sha512-tUI9w3kUP3qhwXJ92RDUPFVZfwtBwKCy/1TsSHndXYLlNCB/7+vkiQG0uxv9D2Leuxc/DJKfYyrdEBpzi/vyZg==" "integrity": "sha512-lBpLh1Q8qayrTxFIrTPcNjSHsosvUfOYyZ8glhiLcx7zCNPDGuj8+nXlEaaSS6LRiQQbLgLG+wKpuvztNzBIrA=="
}, },
"electron-publish": { "electron-publish": {
"version": "22.7.0", "version": "22.7.0",
@ -4560,9 +4560,9 @@
"dev": true "dev": true
}, },
"escape-string-regexp": { "escape-string-regexp": {
"version": "2.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
@ -4706,9 +4706,9 @@
"dev": true "dev": true
}, },
"eslint-import-resolver-node": { "eslint-import-resolver-node": {
"version": "0.3.3", "version": "0.3.4",
"resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
"integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
"dev": true, "dev": true,
"requires": { "requires": {
"debug": "^2.6.9", "debug": "^2.6.9",
@ -4845,9 +4845,9 @@
} }
}, },
"eslint-plugin-import": { "eslint-plugin-import": {
"version": "2.21.1", "version": "2.22.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.21.1.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz",
"integrity": "sha512-qYOOsgUv63vHof7BqbzuD+Ud34bXHxFJxntuAC1ZappFZXYbRIek3aJ7jc9i2dHDGDyZ/0zlO0cpioES265Lsw==", "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==",
"dev": true, "dev": true,
"requires": { "requires": {
"array-includes": "^3.1.1", "array-includes": "^3.1.1",
@ -6442,19 +6442,19 @@
} }
}, },
"global-agent": { "global-agent": {
"version": "2.1.8", "version": "2.1.12",
"resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.8.tgz", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.12.tgz",
"integrity": "sha512-VpBe/rhY6Rw2VDOTszAMNambg+4Qv8j0yiTNDYEXXXxkUNGWLHp8A3ztK4YDBbFNcWF4rgsec6/5gPyryya/+A==", "integrity": "sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==",
"dev": true, "dev": true,
"optional": true, "optional": true,
"requires": { "requires": {
"boolean": "^3.0.0", "boolean": "^3.0.1",
"core-js": "^3.6.4", "core-js": "^3.6.5",
"es6-error": "^4.1.1", "es6-error": "^4.1.1",
"matcher": "^2.1.0", "matcher": "^3.0.0",
"roarr": "^2.15.2", "roarr": "^2.15.3",
"semver": "^7.1.2", "semver": "^7.3.2",
"serialize-error": "^5.0.0" "serialize-error": "^7.0.1"
} }
}, },
"global-dirs": { "global-dirs": {
@ -7767,9 +7767,9 @@
} }
}, },
"jszip": { "jszip": {
"version": "3.4.0", "version": "3.5.0",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.4.0.tgz", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz",
"integrity": "sha512-gZAOYuPl4EhPTXT0GjhI3o+ZAz3su6EhLrKUoAivcKqyqC7laS5JEv4XWZND9BgcDcF83vI85yGbDmDR6UhrIg==", "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==",
"dev": true, "dev": true,
"requires": { "requires": {
"lie": "~3.3.0", "lie": "~3.3.0",
@ -8073,13 +8073,13 @@
} }
}, },
"matcher": { "matcher": {
"version": "2.1.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/matcher/-/matcher-2.1.0.tgz", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
"integrity": "sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ==", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
"dev": true, "dev": true,
"optional": true, "optional": true,
"requires": { "requires": {
"escape-string-regexp": "^2.0.0" "escape-string-regexp": "^4.0.0"
} }
}, },
"material-design-icons": { "material-design-icons": {
@ -8476,9 +8476,9 @@
} }
}, },
"moment": { "moment": {
"version": "2.26.0", "version": "2.27.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
"integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==" "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ=="
}, },
"move-concurrently": { "move-concurrently": {
"version": "1.0.1", "version": "1.0.1",
@ -10991,13 +10991,22 @@
} }
}, },
"serialize-error": { "serialize-error": {
"version": "5.0.0", "version": "7.0.1",
"resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
"integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
"dev": true, "dev": true,
"optional": true, "optional": true,
"requires": { "requires": {
"type-fest": "^0.8.0" "type-fest": "^0.13.1"
},
"dependencies": {
"type-fest": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
"integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
"dev": true,
"optional": true
}
} }
}, },
"serialize-javascript": { "serialize-javascript": {

View File

@ -1,7 +1,7 @@
{ {
"name": "antares", "name": "antares",
"productName": "Antares", "productName": "Antares",
"version": "0.0.1-alpha", "version": "0.0.2-alpha",
"description": "A cross-platform easy to use SQL client.", "description": "A cross-platform easy to use SQL client.",
"license": "MIT", "license": "MIT",
"repository": "https://github.com/EStarium/antares.git", "repository": "https://github.com/EStarium/antares.git",
@ -29,12 +29,12 @@
} }
}, },
"dependencies": { "dependencies": {
"codemirror": "^5.54.0", "codemirror": "^5.55.0",
"electron-log": "^4.2.1", "electron-log": "^4.2.2",
"electron-updater": "^4.3.1", "electron-updater": "^4.3.1",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"material-design-icons": "^3.0.1", "material-design-icons": "^3.0.1",
"moment": "^2.26.0", "moment": "^2.27.0",
"mssql": "^6.2.0", "mssql": "^6.2.0",
"mysql": "^2.18.1", "mysql": "^2.18.1",
"pg": "^8.2.1", "pg": "^8.2.1",
@ -49,14 +49,14 @@
"devDependencies": { "devDependencies": {
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"cross-env": "^7.0.2", "cross-env": "^7.0.2",
"electron": "^8.3.0", "electron": "^8.3.4",
"electron-builder": "^22.7.0", "electron-builder": "^22.7.0",
"electron-devtools-installer": "^3.0.0", "electron-devtools-installer": "^3.1.0",
"electron-webpack": "^2.8.2", "electron-webpack": "^2.8.2",
"electron-webpack-vue": "^2.4.0", "electron-webpack-vue": "^2.4.0",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"eslint-config-standard": "^14.1.1", "eslint-config-standard": "^14.1.1",
"eslint-plugin-import": "^2.21.1", "eslint-plugin-import": "^2.22.0",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1", "eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.1", "eslint-plugin-standard": "^4.0.1",

View File

@ -238,7 +238,7 @@ export class AntaresConnector {
async raw (sql) { async raw (sql) {
if (process.env.NODE_ENV === 'development') console.log(sql); if (process.env.NODE_ENV === 'development') console.log(sql);
switch (this._client) { switch (this._client) { // TODO: uniform fields with every client type, needed table name and fields array
case 'maria': case 'maria':
case 'mysql': { case 'mysql': {
const { rows, fields } = await new Promise((resolve, reject) => { const { rows, fields } = await new Promise((resolve, reject) => {

View File

@ -74,7 +74,9 @@
</div> </div>
<div v-if="selectedTab === 'themes'" class="panel-body py-4"> <div v-if="selectedTab === 'themes'" class="panel-body py-4">
<!-- --> <div class="text-center">
<p>In future releases</p>
</div>
</div> </div>
<div v-if="selectedTab === 'update'" class="panel-body py-4"> <div v-if="selectedTab === 'update'" class="panel-body py-4">

View File

@ -31,8 +31,10 @@
<div class="workspace-query-results column col-12"> <div class="workspace-query-results column col-12">
<WorkspaceQueryTable <WorkspaceQueryTable
v-if="results" v-if="results"
ref="queryTable"
:results="results" :results="results"
:fields="resultsFields" :fields="resultsFields"
@updateField="updateField"
/> />
</div> </div>
</div> </div>
@ -40,6 +42,7 @@
<script> <script>
import Connection from '@/ipc-api/Connection'; import Connection from '@/ipc-api/Connection';
import Structure from '@/ipc-api/Structure';
import QueryEditor from '@/components/QueryEditor'; import QueryEditor from '@/components/QueryEditor';
import WorkspaceQueryTable from '@/components/WorkspaceQueryTable'; import WorkspaceQueryTable from '@/components/WorkspaceQueryTable';
import { mapGetters, mapActions } from 'vuex'; import { mapGetters, mapActions } from 'vuex';
@ -57,7 +60,8 @@ export default {
return { return {
query: '', query: '',
isQuering: false, isQuering: false,
results: {} results: {},
fields: []
}; };
}, },
computed: { computed: {
@ -68,9 +72,27 @@ export default {
return this.getWorkspace(this.connection.uid); return this.getWorkspace(this.connection.uid);
}, },
resultsFields () { resultsFields () {
return this.results.rows && this.results.rows.length ? Object.keys(this.results.rows[0]).map(field => { if (this.results) {
return { name: field, key: '', type: '' }; // TODO: extract getting table name from query return this.fields.map(field => { // TODO: move to main process
}) : []; return {
name: field.COLUMN_NAME,
key: field.COLUMN_KEY.toLowerCase(),
type: field.DATA_TYPE
};
}).filter(field => {
if (this.results.fields) {
const queryFields = this.results.fields.map(field => field.name);
if (queryFields.includes(field.name)) return field;
}
});
}
else
return [];
},
table () {
if (this.results.fields.length)
return this.results.fields[0].orgTable;
return '';
} }
}, },
methods: { methods: {
@ -99,7 +121,43 @@ export default {
this.addNotification({ status: 'error', message: err.stack }); this.addNotification({ status: 'error', message: err.stack });
} }
try {
const params = {
uid: this.connection.uid,
schema: this.workspace.breadcrumbs.schema,
table: this.table
};
const { status, response } = await Structure.getTableColumns(params);
if (status === 'success')
this.fields = response.rows;
else
this.addNotification({ status: 'error', message: response });
}
catch (err) {
this.addNotification({ status: 'error', message: err.stack });
}
this.isQuering = false; this.isQuering = false;
},
async updateField (payload) {
const params = {
uid: this.connection.uid,
schema: this.workspace.breadcrumbs.schema,
table: this.workspace.breadcrumbs.table,
...payload
};
try {
const { status, response } = await Structure.updateTableCell(params);
if (status === 'success')
this.$refs.queryTable.applyUpdate(payload);
else
this.addNotification({ status: 'error', message: response });
}
catch (err) {
this.addNotification({ status: 'error', message: err.stack });
}
} }
} }
}; };

View File

@ -139,6 +139,15 @@ export default {
}; };
this.$emit('updateField', params); this.$emit('updateField', params);
} }
},
applyUpdate (params) {
const { primary, id, field, content } = params;
this.localResults = this.localResults.map(row => {
if (row[primary] === id)
row[field] = content;
return row;
});
} }
} }
}; };

View File

@ -99,7 +99,7 @@ export default {
case 'longblob': case 'longblob':
case 'bit': case 'bit':
default: default:
return 'text'; return 'hidden';
} }
} }
}, },
@ -108,6 +108,8 @@ export default {
return value === null ? ' is-null' : ''; return value === null ? ' is-null' : '';
}, },
editON () { editON () {
if (!['number', 'text'].includes(this.inputType)) return;// TODO: remove temporary block
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.cell.blur(); this.$refs.cell.blur();

View File

@ -29,6 +29,7 @@
<div class="workspace-query-results column col-12"> <div class="workspace-query-results column col-12">
<WorkspaceQueryTable <WorkspaceQueryTable
v-if="results" v-if="results"
ref="queryTable"
:results="results" :results="results"
:fields="resultsFields" :fields="resultsFields"
@updateField="updateField" @updateField="updateField"
@ -143,11 +144,12 @@ export default {
table: this.workspace.breadcrumbs.table, table: this.workspace.breadcrumbs.table,
...payload ...payload
}; };
console.log(params);
try { try {
const { status, response } = await Structure.updateTableCell(params); const { status, response } = await Structure.updateTableCell(params);
if (status !== 'success') if (status === 'success')
this.$refs.queryTable.applyUpdate(payload);
else
this.addNotification({ status: 'error', message: response }); this.addNotification({ status: 'error', message: response });
} }
catch (err) { catch (err) {