mirror of
https://github.com/nasa/openmct.git
synced 2025-06-01 15:10:50 +00:00
Drag and drop fixes (#2249)
* Drag-drop edit mode from capture handler. Drag-drop composition from bubble handler. Check composability on drag start * Show drop hints without being in edit mode. * Don't serialize objects twice on drag
This commit is contained in:
parent
cb1a1c2616
commit
4084a1ac86
@ -28,6 +28,11 @@ export default class Editor extends EventEmitter {
|
|||||||
super();
|
super();
|
||||||
this.editing = false;
|
this.editing = false;
|
||||||
this.openmct = openmct;
|
this.openmct = openmct;
|
||||||
|
document.addEventListener('drop', (event) => {
|
||||||
|
if (!this.isEditing()) {
|
||||||
|
this.edit();
|
||||||
|
}
|
||||||
|
}, {capture: true});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -177,13 +177,13 @@
|
|||||||
this.openmct.objects.mutate(this.internalDomainObject, path, value);
|
this.openmct.objects.mutate(this.internalDomainObject, path, value);
|
||||||
},
|
},
|
||||||
handleDrop($event) {
|
handleDrop($event) {
|
||||||
if (!$event.dataTransfer.types.includes('domainobject')) {
|
if (!$event.dataTransfer.types.includes('openmct/domain-object')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$event.preventDefault();
|
$event.preventDefault();
|
||||||
|
|
||||||
let domainObject = JSON.parse($event.dataTransfer.getData('domainobject'));
|
let domainObject = JSON.parse($event.dataTransfer.getData('openmct/domain-object'));
|
||||||
let elementRect = this.$el.getBoundingClientRect();
|
let elementRect = this.$el.getBoundingClientRect();
|
||||||
let droppedObjectPosition = [
|
let droppedObjectPosition = [
|
||||||
Math.floor(($event.pageX - elementRect.left) / this.gridSize[0]),
|
Math.floor(($event.pageX - elementRect.left) / this.gridSize[0]),
|
||||||
|
@ -100,7 +100,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
allowDrop(event, index) {
|
allowDrop(event, index) {
|
||||||
if (event.dataTransfer.getData('domainObject')) {
|
if (event.dataTransfer.getData('openmct/domain-object')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
let frameId = event.dataTransfer.getData('frameid'),
|
let frameId = event.dataTransfer.getData('frameid'),
|
||||||
@ -124,9 +124,9 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
moveOrCreateFrame(insertIndex, event) {
|
moveOrCreateFrame(insertIndex, event) {
|
||||||
if (event.dataTransfer.types.includes('domainobject')) {
|
if (event.dataTransfer.types.includes('openmct/domain-object')) {
|
||||||
// create frame using domain object
|
// create frame using domain object
|
||||||
let domainObject = JSON.parse(event.dataTransfer.getData('domainObject'));
|
let domainObject = JSON.parse(event.dataTransfer.getData('openmct/domain-object'));
|
||||||
this.$emit(
|
this.$emit(
|
||||||
'create-frame',
|
'create-frame',
|
||||||
this.index,
|
this.index,
|
||||||
|
@ -21,8 +21,7 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div v-if="isEditing"
|
<div v-show="isValidTarget">
|
||||||
v-show="isValidTarget">
|
|
||||||
<div class="c-drop-hint c-drop-hint--always-show"
|
<div class="c-drop-hint c-drop-hint--always-show"
|
||||||
:class="{'is-mouse-over': isMouseOver}"
|
:class="{'is-mouse-over': isMouseOver}"
|
||||||
@dragenter="dragenter"
|
@dragenter="dragenter"
|
||||||
@ -37,8 +36,6 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import isEditingMixin from '../mixins/isEditing';
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
props:{
|
props:{
|
||||||
index: Number,
|
index: Number,
|
||||||
@ -47,7 +44,6 @@ export default {
|
|||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mixins: [isEditingMixin],
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
isMouseOver: false,
|
isMouseOver: false,
|
||||||
|
@ -44,6 +44,7 @@ define([
|
|||||||
containers: [new Container.default(50), new Container.default(50)],
|
containers: [new Container.default(50), new Container.default(50)],
|
||||||
rowsLayout: false
|
rowsLayout: false
|
||||||
};
|
};
|
||||||
|
domainObject.composition = [];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ function (
|
|||||||
|
|
||||||
EntryController.prototype.dropOnEntry = function (entryid, event) {
|
EntryController.prototype.dropOnEntry = function (entryid, event) {
|
||||||
|
|
||||||
var data = event.dataTransfer.getData('domainObject');
|
var data = event.dataTransfer.getData('openmct/domain-object');
|
||||||
|
|
||||||
if (data) {
|
if (data) {
|
||||||
var selectedObject = JSON.parse(data),
|
var selectedObject = JSON.parse(data),
|
||||||
|
@ -120,8 +120,8 @@ function (
|
|||||||
var date = Date.now(),
|
var date = Date.now(),
|
||||||
embed;
|
embed;
|
||||||
|
|
||||||
if (event.dataTransfer && event.dataTransfer.getData('domainObject')) {
|
if (event.dataTransfer && event.dataTransfer.getData('openmct/domain-object')) {
|
||||||
var selectedObject = JSON.parse(event.dataTransfer.getData('domainObject')),
|
var selectedObject = JSON.parse(event.dataTransfer.getData('openmct/domain-object')),
|
||||||
selectedObjectId = selectedObject.identifier.key,
|
selectedObjectId = selectedObject.identifier.key,
|
||||||
cssClass = this.openmct.types.get(selectedObject.type);
|
cssClass = this.openmct.types.get(selectedObject.type);
|
||||||
|
|
||||||
|
@ -147,7 +147,7 @@ export default {
|
|||||||
this.setCurrentTab = true;
|
this.setCurrentTab = true;
|
||||||
},
|
},
|
||||||
dragstart (e) {
|
dragstart (e) {
|
||||||
if (e.dataTransfer.getData('domainObject')) {
|
if (e.dataTransfer.getData('openmct/domain-object')) {
|
||||||
this.isDragging = true;
|
this.isDragging = true;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -44,7 +44,12 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
dragStart(event) {
|
dragStart(event) {
|
||||||
event.dataTransfer.setData("domainObject", JSON.stringify(this.observedObject));
|
let navigatedObject = this.openmct.router.path[0];
|
||||||
|
let serializedObject = JSON.stringify(this.observedObject);
|
||||||
|
if (this.openmct.composition.checkPolicy(navigatedObject, this.observedObject)) {
|
||||||
|
event.dataTransfer.setData("openmct/composable-domain-object", serializedObject);
|
||||||
|
}
|
||||||
|
event.dataTransfer.setData("openmct/domain-object", serializedObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,26 +88,25 @@ export default {
|
|||||||
this.updateView(immediatelySelect);
|
this.updateView(immediatelySelect);
|
||||||
},
|
},
|
||||||
onDragOver(event) {
|
onDragOver(event) {
|
||||||
event.preventDefault();
|
if (this.hasComposableDomainObject(event)) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
onDrop(event) {
|
onDrop(event) {
|
||||||
let parentObject = this.currentObject;
|
if (this.hasComposableDomainObject(event)) {
|
||||||
let d = event.dataTransfer.getData("domainObject");
|
let composableDomainObject = this.getComposableDomainObject(event);
|
||||||
|
this.currentObject.composition.push(composableDomainObject.identifier);
|
||||||
if (d) {
|
this.openmct.objects.mutate(this.currentObject, 'composition', this.currentObject.composition);
|
||||||
let childObject = JSON.parse(d);
|
|
||||||
|
|
||||||
if (this.openmct.composition.checkPolicy(parentObject, childObject)){
|
|
||||||
if (!this.openmct.editor.isEditing() && parentObject.type !== 'folder'){
|
|
||||||
this.openmct.editor.edit();
|
|
||||||
}
|
|
||||||
parentObject.composition.push(childObject.identifier);
|
|
||||||
this.openmct.objects.mutate(parentObject, 'composition', parentObject.composition);
|
|
||||||
}
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
hasComposableDomainObject(event) {
|
||||||
|
return event.dataTransfer.types.includes('openmct/composable-domain-object')
|
||||||
|
},
|
||||||
|
getComposableDomainObject(event) {
|
||||||
|
let serializedDomainObject = event.dataTransfer.getData('openmct/composable-domain-object');
|
||||||
|
return JSON.parse(serializedDomainObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user