mirror of
https://github.com/Fabio286/antares.git
synced 2025-06-05 21:59:22 +02:00
Row multi select
This commit is contained in:
6
package-lock.json
generated
6
package-lock.json
generated
@ -4029,9 +4029,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"electron": {
|
"electron": {
|
||||||
"version": "8.3.4",
|
"version": "8.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/electron/-/electron-8.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/electron/-/electron-8.4.0.tgz",
|
||||||
"integrity": "sha512-aSYXBV0PxYHmXhjGFpR0x38zbO7UTDex2JrT5tcqJpUZTY+sKdfo9PA1TpiyrHNjA5+Q8UseRUsydRedOTeZQA==",
|
"integrity": "sha512-SpgyccM5rjDJSGcpQjiviUBT44fZlSyhcjy8RpKSnAad+co4xY1vYj6T25U1CfSk0PH/dhvcp63P2sdXHCwq/Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@electron/get": "^1.0.1",
|
"@electron/get": "^1.0.1",
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
"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.4",
|
"electron": "^8.4.0",
|
||||||
"electron-builder": "^22.7.0",
|
"electron-builder": "^22.7.0",
|
||||||
"electron-devtools-installer": "^3.1.1",
|
"electron-devtools-installer": "^3.1.1",
|
||||||
"electron-webpack": "^2.8.2",
|
"electron-webpack": "^2.8.2",
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
<TableContext
|
<TableContext
|
||||||
v-if="isContext"
|
v-if="isContext"
|
||||||
:context-event="contextEvent"
|
:context-event="contextEvent"
|
||||||
|
:selected-rows="selectedRows"
|
||||||
@closeContext="isContext = false"
|
@closeContext="isContext = false"
|
||||||
/>
|
/>
|
||||||
<BaseVirtualScroll
|
<BaseVirtualScroll
|
||||||
@ -39,6 +40,8 @@
|
|||||||
v-for="row in items"
|
v-for="row in items"
|
||||||
:key="row._id"
|
:key="row._id"
|
||||||
class="tr"
|
class="tr"
|
||||||
|
:class="{'selected': selectedRows.includes(row._id)}"
|
||||||
|
@click="selectRow($event, row._id)"
|
||||||
>
|
>
|
||||||
<WorkspaceQueryTableCell
|
<WorkspaceQueryTableCell
|
||||||
v-for="(col, cKey) in row"
|
v-for="(col, cKey) in row"
|
||||||
@ -48,7 +51,7 @@
|
|||||||
:precision="fieldPrecision(cKey)"
|
:precision="fieldPrecision(cKey)"
|
||||||
:type="fieldType(cKey)"
|
:type="fieldType(cKey)"
|
||||||
@updateField="updateField($event, row[primaryField.name])"
|
@updateField="updateField($event, row[primaryField.name])"
|
||||||
@cellContext="contextMenu($event)"
|
@contextmenu="contextMenu($event, {id: row._id, field: cKey})"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -81,7 +84,9 @@ export default {
|
|||||||
resultsSize: 1000,
|
resultsSize: 1000,
|
||||||
localResults: [],
|
localResults: [],
|
||||||
isContext: false,
|
isContext: false,
|
||||||
contextEvent: null
|
contextEvent: null,
|
||||||
|
selectedCell: null,
|
||||||
|
selectedRows: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@ -149,14 +154,14 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
updateField (event, id) {
|
updateField (payload, id) {
|
||||||
if (!this.primaryField)
|
if (!this.primaryField)
|
||||||
this.addNotification({ status: 'warning', message: this.$t('message.unableEditFieldWithoutPrimary') });
|
this.addNotification({ status: 'warning', message: this.$t('message.unableEditFieldWithoutPrimary') });
|
||||||
else {
|
else {
|
||||||
const params = {
|
const params = {
|
||||||
primary: this.primaryField.name,
|
primary: this.primaryField.name,
|
||||||
id,
|
id,
|
||||||
...event
|
...payload
|
||||||
};
|
};
|
||||||
this.$emit('updateField', params);
|
this.$emit('updateField', params);
|
||||||
}
|
}
|
||||||
@ -170,7 +175,37 @@ export default {
|
|||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
contextMenu (event) {
|
selectRow (event, row) {
|
||||||
|
if (event.ctrlKey) {
|
||||||
|
if (this.selectedRows.includes(row))
|
||||||
|
this.selectedRows = this.selectedRows.filter(el => el !== row);
|
||||||
|
else
|
||||||
|
this.selectedRows.push(row);
|
||||||
|
}
|
||||||
|
else if (event.shiftKey) {
|
||||||
|
if (!this.selectedRows.length)
|
||||||
|
this.selectedRows.push(row);
|
||||||
|
else {
|
||||||
|
const lastID = this.selectedRows.slice(-1)[0];
|
||||||
|
const lastIndex = this.localResults.findIndex(el => el._id === lastID);
|
||||||
|
const clickedIndex = this.localResults.findIndex(el => el._id === row);
|
||||||
|
if (lastIndex > clickedIndex) {
|
||||||
|
for (let i = clickedIndex; i < lastIndex; i++)
|
||||||
|
this.selectedRows.push(this.localResults[i]._id);
|
||||||
|
}
|
||||||
|
else if (lastIndex < clickedIndex) {
|
||||||
|
for (let i = clickedIndex; i > lastIndex; i--)
|
||||||
|
this.selectedRows.push(this.localResults[i]._id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
this.selectedRows = [row];
|
||||||
|
},
|
||||||
|
contextMenu (event, cell) {
|
||||||
|
this.selectedCell = cell;
|
||||||
|
if (!this.selectedRows.includes(cell.id))
|
||||||
|
this.selectedRows = [cell.id];
|
||||||
this.contextEvent = event;
|
this.contextEvent = event;
|
||||||
this.isContext = true;
|
this.isContext = true;
|
||||||
}
|
}
|
||||||
|
@ -5,14 +5,14 @@
|
|||||||
class="td"
|
class="td"
|
||||||
:class="`type-${type} p-0`"
|
:class="`type-${type} p-0`"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
@contextmenu.prevent="$emit('cellContext', $event)"
|
@contextmenu.prevent="$emit('contextmenu', $event)"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
v-if="!isEditing"
|
v-if="!isEditing"
|
||||||
class="cell-content px-2"
|
class="cell-content px-2"
|
||||||
:class="isNull(content)"
|
:class="isNull(content)"
|
||||||
@dblclick="editON"
|
@dblclick="editON"
|
||||||
>{{ content | typeFormat(type, precision) }}</span>
|
>{{ content | typeFormat(type, precision) | cutText }}</span>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<input
|
<input
|
||||||
v-if="inputProps.mask"
|
v-if="inputProps.mask"
|
||||||
@ -46,6 +46,10 @@ import { mask } from 'vue-the-mask';
|
|||||||
export default {
|
export default {
|
||||||
name: 'WorkspaceQueryTableCell',
|
name: 'WorkspaceQueryTableCell',
|
||||||
filters: {
|
filters: {
|
||||||
|
cutText (val) {
|
||||||
|
if (typeof val !== 'string') return val;
|
||||||
|
return val.length > 50 ? `${val.substring(0, 50)}[...]` : val;
|
||||||
|
},
|
||||||
typeFormat (val, type, precision) {
|
typeFormat (val, type, precision) {
|
||||||
if (!val) return val;
|
if (!val) return val;
|
||||||
|
|
||||||
@ -54,7 +58,7 @@ export default {
|
|||||||
case 'varchar':
|
case 'varchar':
|
||||||
case 'text':
|
case 'text':
|
||||||
case 'mediumtext':
|
case 'mediumtext':
|
||||||
return val.substring(0, 128);
|
return val;
|
||||||
case 'date': {
|
case 'date': {
|
||||||
return moment(val).isValid() ? moment(val).format('YYYY-MM-DD') : val;
|
return moment(val).isValid() ? moment(val).format('YYYY-MM-DD') : val;
|
||||||
}
|
}
|
||||||
@ -148,7 +152,7 @@ export default {
|
|||||||
},
|
},
|
||||||
editOFF () {
|
editOFF () {
|
||||||
this.isEditing = false;
|
this.isEditing = false;
|
||||||
if (this.localContent === this.content) return;
|
if (this.localContent === this.$options.filters.typeFormat(this.content, this.type)) return;
|
||||||
|
|
||||||
const { field, type, localContent: content } = this;
|
const { field, type, localContent: content } = this;
|
||||||
this.$emit('updateField', { field, type, content });
|
this.$emit('updateField', { field, type, content });
|
||||||
|
@ -3,11 +3,11 @@
|
|||||||
:context-event="contextEvent"
|
:context-event="contextEvent"
|
||||||
@closeContext="$emit('closeContext')"
|
@closeContext="$emit('closeContext')"
|
||||||
>
|
>
|
||||||
<div class="context-element" @click="showEditModal()">
|
<div class="context-element" @click="$emit('editCell')">
|
||||||
<i class="material-icons md-18 text-light pr-1">edit</i> {{ $t('message.editCell') }}
|
<i class="material-icons md-18 text-light pr-1">edit</i> {{ $t('message.editCell') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="context-element" @click="showConfirmModal">
|
<div class="context-element" @click="showConfirmModal">
|
||||||
<i class="material-icons md-18 text-light pr-1">delete</i> {{ $t('message.deleteRow') }}
|
<i class="material-icons md-18 text-light pr-1">delete</i> {{ $tc('message.deleteRows', selectedRows.length) }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ConfirmModal
|
<ConfirmModal
|
||||||
@ -32,7 +32,8 @@ export default {
|
|||||||
ConfirmModal
|
ConfirmModal
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
contextEvent: MouseEvent
|
contextEvent: MouseEvent,
|
||||||
|
selectedRows: Array
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
|
@ -54,7 +54,7 @@ module.exports = {
|
|||||||
restartToInstall: 'Restart Antares to install',
|
restartToInstall: 'Restart Antares to install',
|
||||||
unableEditFieldWithoutPrimary: 'Unable to edit a field without a primary key in resultset',
|
unableEditFieldWithoutPrimary: 'Unable to edit a field without a primary key in resultset',
|
||||||
editCell: 'Edit cell',
|
editCell: 'Edit cell',
|
||||||
deleteRow: 'Delete row'
|
deleteRows: 'Delete row | Delete {count} rows'
|
||||||
},
|
},
|
||||||
// Date and Time
|
// Date and Time
|
||||||
short: {
|
short: {
|
||||||
|
@ -15,11 +15,13 @@
|
|||||||
"varchar": seagreen,
|
"varchar": seagreen,
|
||||||
"text": seagreen,
|
"text": seagreen,
|
||||||
"mediumtext": seagreen,
|
"mediumtext": seagreen,
|
||||||
|
"longtext": seagreen,
|
||||||
|
|
||||||
"int": cornflowerblue,
|
"int": cornflowerblue,
|
||||||
"tinyint": cornflowerblue,
|
"tinyint": cornflowerblue,
|
||||||
"smallint": cornflowerblue,
|
"smallint": cornflowerblue,
|
||||||
"mediumint": cornflowerblue,
|
"mediumint": cornflowerblue,
|
||||||
|
"bigint": cornflowerblue,
|
||||||
|
|
||||||
"datetime": coral,
|
"datetime": coral,
|
||||||
"date": coral,
|
"date": coral,
|
||||||
|
@ -16,6 +16,9 @@
|
|||||||
&.table-striped {
|
&.table-striped {
|
||||||
.tbody {
|
.tbody {
|
||||||
.tr {
|
.tr {
|
||||||
|
&.selected{
|
||||||
|
background: #333!important;
|
||||||
|
}
|
||||||
&.active {
|
&.active {
|
||||||
background: $bg-color-dark;
|
background: $bg-color-dark;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user