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:
Andrew Henry 2019-01-11 11:20:57 -08:00 committed by Pete Richards
parent cb1a1c2616
commit 4084a1ac86
10 changed files with 36 additions and 30 deletions

View File

@ -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});
} }
/** /**

View File

@ -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]),

View File

@ -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,

View File

@ -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,

View File

@ -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 = [];
} }
}); });

View File

@ -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),

View File

@ -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);

View File

@ -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;
} }
}, },

View File

@ -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);
} }
} }
} }

View File

@ -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);
} }
} }
} }