@openui5/sap.ui.core
Version:
OpenUI5 Core Library sap.ui.core
114 lines (104 loc) • 4.37 kB
JavaScript
/*!
* OpenUI5
* (c) Copyright 2009-2021 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
sap.ui.define([
"sap/ui/test/actions/Action"
], function (Action) {
"use strict";
/**
* @class
* The <code>Drop</code> action is used to simulate drop on a control.
* The control should be droppable, as defined by its dnd aggregation configuration.
* The dropped control should be defined in a preceding {@link sap.ui.test.actions.Drag} action.
*
* The <code>Drop</code> action targets a special DOM element representing the
* control. This DOM element can be customized.
*
* For most most controls, the target will be the DOM focus reference.
* You can choose a different DOM element by specifying its ID suffix.
* You can do this by directly passing the ID suffix to the Drop constructor,
* or by defining a control adapter function.
* You can also set the traget to be the root DOM element of a given aggregation,
* by specifying the aggregation name in the Drop constructor.
*
* * The <code>Drop</code> action is not supported in IE11!
*
* @extends sap.ui.test.actions.Action
* @public
* @name sap.ui.test.actions.Drop
* @author SAP SE
* @since 1.76
*/
var Drop = Action.extend("sap.ui.test.actions.Drop", {
metadata : {
properties: {
/**
* name of the droppable aggregation, whose root to use as drop target.
* This makes sense only for some controls, where this root DOM element is droppable.
*/
aggregationName: "string",
/**
* specify a position for the drop event, relative to the position of the control's representative DOM element.
* This makes sense only for the case when dropping right on top of the DOM element makes no sense,
* and instead, the drop should happen right before or after the element. e.g. sap.m.IconTabBar.
* Default position is "center", meaning the drop will be directly on the element.
* Set `before` to true, to drop the source immediately before the target element.
*/
before: "boolean",
/**
* Set `after` to true, to drop the source immediately before the target element.
*/
after: "boolean"
},
publicMethods : [ "executeOn" ]
},
/**
* Starts a drop event sequence for this control, such that a predefined source will be dropped on the control.
* To start a drag sequence ad define the dragged source, trigger a {@link sap.ui.test.actions.Drag} action on the source.
* Logs an error if control is not visible (i.e. has no DOM representation)
*
* @param {sap.ui.core.Control} oControl the control on which the drop events are triggered
* @public
*/
executeOn: function (oControl) {
var oActionDomRef;
if (this.getIdSuffix()) {
// use the user-defined target
oActionDomRef = oControl.$(this.getIdSuffix())[0];
} else if (this.getAggregationName()) {
// use the root of a user-defined aggregation
oActionDomRef = oControl.getDomRefForSetting(this.getAggregationName());
} else {
// infer the droppable aggregation and get its root.
// note that it's up to the control to have this root defined (-> it might not be found some times)
var aAggregations = oControl.getMetadata().getAggregations();
var sDropAggregation = Object.keys(aAggregations).filter(function (mAggregation) {
return aAggregations[mAggregation].dnd.droppable;
})[0];
if (sDropAggregation) {
oActionDomRef = oControl.getDomRefForSetting(sDropAggregation) || oControl["get" + sDropAggregation]()[0];
}
}
// as a fallback, use the focus DOM reference
oActionDomRef = oActionDomRef || this.$(oControl)[0];
if (oActionDomRef) {
// set the position of the drop within the target
var mOptions = {};
if (this.getBefore()) {
mOptions.position = this.dropPosition.BEFORE;
} else if (this.getAfter()) {
mOptions.position = this.dropPosition.AFTER;
} else {
mOptions.position = this.dropPosition.CENTER;
}
this._createAndDispatchDragEvent("dragenter", oActionDomRef, mOptions);
this._createAndDispatchDragEvent("dragover", oActionDomRef, mOptions);
this._createAndDispatchDragEvent("drop", oActionDomRef, mOptions);
this._createAndDispatchDragEvent("dragend", oActionDomRef, mOptions);
}
}
});
return Drop;
});