dmn-js-decision-table-custom-z
Version:
A decision table view for dmn-js
423 lines (332 loc) • 12.7 kB
JavaScript
import { createVNode, createTextVNode } from "inferno";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
import { classes as domClasses, domify, queryAll as domQueryAll, remove as domRemove } from 'min-dom';
import { isInput, isOutput } from 'dmn-js-shared/lib/util/ModelUtil';
import { Row, Col } from 'table-js/lib/model';
import { forEach } from 'min-dash';
var TOP = 'top',
RIGHT = 'right',
BOTTOM = 'bottom',
LEFT = 'left';
var DragAndDrop = /*#__PURE__*/function () {
function DragAndDrop(components, elementRegistry, eventBus, dragAndDrop, renderer, rules, sheet) {
var _this = this;
_classCallCheck(this, DragAndDrop);
_defineProperty(this, "_cleanup", function () {
var container = _this._renderer.getContainer();
removeHighlight(container);
removeFadeOut(container);
if (_this._dragImage) {
domRemove(_this._dragImage);
_this._dragImage = null;
}
});
this._elementRegistry = elementRegistry;
this._dragAndDrop = dragAndDrop;
this._renderer = renderer;
this._rules = rules;
this._sheet = sheet; // provide drag handle for drag and drop
components.onGetComponent('cell-inner', function (_ref) {
var cellType = _ref.cellType,
col = _ref.col,
row = _ref.row;
if (cellType === 'rule-index') {
return function () {
return createVNode(1, "span", "dmn-icon-drag vertical", createTextVNode("\xA0"), 2, {
"draggable": "true",
"onDragStart": function onDragStart(e) {
return _this.startDrag(row, e);
},
"title": "Move rule"
});
};
} else if (cellType === 'input-cell' || cellType === 'output-cell') {
var title = "Move ".concat(isInput(col) ? 'Input' : 'Output');
return function () {
return createVNode(1, "span", "dmn-icon-drag horizontal", null, 1, {
"draggable": "true",
"onDragStart": function onDragStart(e) {
return _this.startDrag(col, e);
},
"title": title
});
};
}
}); // validate allowed rules
eventBus.on('dragAndDrop.dragEnter', function (event) {
var dragContext = event.dragContext;
var draggedElement = dragContext.draggedElement,
hoverEl = dragContext.hoverEl; // can always drag rows
if (draggedElement instanceof Row) {
return true;
}
if (draggedElement instanceof Col) {
var dropIndex = getTargetColIndex(hoverEl, _this._elementRegistry, _this._sheet); // cannot drop as we cannot compute the drop index
if (dropIndex === -1) {
return false;
}
var allowed = _this._rules.allowed('col.move', {
col: draggedElement,
index: dropIndex
});
return allowed;
}
return false;
}); // clear previous UI
eventBus.on('dragAndDrop.dragLeave', function (event) {
var dragContext = event.dragContext;
var targetEl = dragContext.targetEl;
if (!targetEl) {
return;
}
var container = _this._renderer.getContainer();
removeHighlight(container);
}); // update UI
eventBus.on('dragAndDrop.dragOver', function (event) {
var dragContext = event.dragContext,
originalEvent = event.originalEvent;
var draggedElement = dragContext.draggedElement,
lastPosition = dragContext.lastPosition,
targetEl = dragContext.targetEl;
var container = _this._renderer.getContainer();
if (!targetEl) {
return false;
}
var newPosition;
if (draggedElement instanceof Row) {
newPosition = getVerticalPosition(originalEvent, targetEl);
}
if (draggedElement instanceof Col) {
newPosition = getHorizontalPosition(originalEvent, targetEl);
} // nothing to do
if (lastPosition === newPosition) {
return true;
} // remove old highlight
removeHighlight(container);
if (draggedElement instanceof Row) {
if (newPosition === TOP) {
// drop above
highlightRow(targetEl, container, 'top');
} else {
// drop below
highlightRow(targetEl, container, 'bottom');
}
}
if (draggedElement instanceof Col) {
if (newPosition === LEFT) {
// drop left
highlightCol(targetEl, container, 'left');
} else {
// drop right
highlightCol(targetEl, container, 'right');
}
} // remember position
dragContext.lastPosition = newPosition; // allowed
return true;
}); // perform drop operation
eventBus.on('dragAndDrop.drop', function (event) {
var dragContext = event.dragContext,
originalEvent = event.originalEvent;
var draggedElement = dragContext.draggedElement,
targetEl = dragContext.targetEl;
if (!targetEl) {
return false;
}
if (draggedElement instanceof Row) {
var verticalPosition = getVerticalPosition(originalEvent, targetEl);
var rowId = targetEl.dataset.rowId,
row = _this._elementRegistry.get(rowId);
if (!row || row === draggedElement) {
return;
}
var targetRow = getTargetRow(draggedElement, row, verticalPosition, _this._sheet.getRoot().rows);
if (targetRow === draggedElement) {
return;
}
return targetRow;
}
if (draggedElement instanceof Col) {
var horizontalPosition = getHorizontalPosition(originalEvent, targetEl); // no need to check rules; we verified on
// dragEnter that dropping is O.K.
var colId = targetEl.dataset.colId,
col = _this._elementRegistry.get(colId);
if (!col || col === draggedElement) {
return;
}
var targetCol = getTargetCol(draggedElement, col, horizontalPosition, _this._sheet.getRoot().cols);
if (targetCol === draggedElement) {
return;
}
return targetCol;
}
});
eventBus.on('dragAndDrop.dragEnd', this._cleanup);
}
_createClass(DragAndDrop, [{
key: "startDrag",
value: function startDrag(element, event) {
var container = this._renderer.getContainer();
this._dragImage = domify("<span style=\"\n visibility: hidden;\n position: fixed;\n top: -10000px\n \"></span>"); // needs to be present in DOM
document.body.appendChild(this._dragImage); // QUIRK: not supported by Edge and Internet Explorer
if (event.dataTransfer.setDragImage) {
event.dataTransfer.setDragImage(this._dragImage, 0, 0);
}
if (element instanceof Row) {
fadeOutRow(element, container);
} else if (element instanceof Col) {
fadeOutCol(element, container);
}
this._dragAndDrop.startDrag(element, event);
}
}]);
return DragAndDrop;
}();
export { DragAndDrop as default };
DragAndDrop.$inject = ['components', 'elementRegistry', 'eventBus', 'dragAndDrop', 'renderer', 'rules', 'sheet']; // helpers //////////
function getTargetColIndex(cellEl, elementRegistry, sheet) {
var targetCol = elementRegistry.get(cellEl.dataset.colId);
if (!targetCol) {
return -1;
}
var _sheet$getRoot = sheet.getRoot(),
cols = _sheet$getRoot.cols;
return cols.indexOf(targetCol);
}
function highlightRow(dragOverCell, container, position) {
var rowId = dragOverCell.dataset.rowId;
if (!rowId) {
return;
}
var cells = domQueryAll("[data-row-id=".concat(rowId, "]"), container);
forEach(cells, function (cell) {
// QUIRK: PhantomJS might return object instead of NodeList
if (isNode(cell)) {
domClasses(cell).add('dragover');
domClasses(cell).add(position);
}
});
}
function highlightCol(dragOverCell, container, position) {
var colId = dragOverCell.dataset.colId;
if (!colId) {
return;
}
var cells = domQueryAll("[data-col-id=".concat(colId, "]"), container);
forEach(cells, function (cell) {
// QUIRK: PhantomJS might return object instead of NodeList
if (isNode(cell)) {
domClasses(cell).add('dragover');
domClasses(cell).add(position);
}
});
}
function removeHighlight(container) {
var cells = domQueryAll('.dragover', container);
forEach(cells, function (cell) {
// QUIRK: PhantomJS might return object instead of NodeList
if (isNode(cell)) {
domClasses(cell).remove('dragover');
domClasses(cell).remove('top');
domClasses(cell).remove('right');
domClasses(cell).remove('bottom');
domClasses(cell).remove('left');
}
});
}
function fadeOutRow(row, container) {
var cells = domQueryAll("[data-row-id=".concat(row.id, "]"), container);
forEach(cells, function (cell) {
// QUIRK: PhantomJS might return object instead of NodeList
if (isNode(cell)) {
domClasses(cell).add('dragged');
}
});
}
function fadeOutCol(col, container) {
var cells = domQueryAll("[data-col-id=".concat(col.id, "]"), container);
forEach(cells, function (cell) {
// QUIRK: PhantomJS might return object instead of NodeList
if (isNode(cell)) {
domClasses(cell).add('dragged');
}
});
}
function removeFadeOut(container) {
var cells = domQueryAll('.dragged', container);
forEach(cells, function (cell) {
// QUIRK: PhantomJS might return object instead of NodeList
if (isNode(cell)) {
domClasses(cell).remove('dragged');
}
});
}
function getHorizontalPosition(event, dragOverElement) {
var bounds = dragOverElement.getBoundingClientRect();
return event.clientX < bounds.left + bounds.width / 2 ? LEFT : RIGHT;
}
function getVerticalPosition(event, dragOverElement) {
var bounds = dragOverElement.getBoundingClientRect();
return event.clientY < bounds.top + bounds.height / 2 ? TOP : BOTTOM;
}
function getTargetRow(draggedRow, targetRow, verticalPosition, rows) {
if (rows.indexOf(draggedRow) > rows.indexOf(targetRow)) {
targetRow = getRowBelow(targetRow, rows);
}
if (verticalPosition === TOP) {
// return row above or row
return getRowAbove(targetRow, rows);
} else {
// return row
return targetRow;
}
}
function getTargetCol(draggedCol, targetCol, horizontalPosition, cols) {
if (cols.indexOf(draggedCol) > cols.indexOf(targetCol)) {
targetCol = getColRight(targetCol, cols);
}
if (horizontalPosition === LEFT) {
// return col left or col
return getColLeft(targetCol, cols);
} else {
// return col
return targetCol;
}
}
function getRowAbove(row, rows) {
var index = rows.indexOf(row);
return rows[Math.max(0, index - 1)];
}
function getRowBelow(row, rows) {
var index = rows.indexOf(row);
return rows[Math.min(rows.length - 1, index + 1)];
}
function getColLeft(col, cols) {
var index = cols.indexOf(col);
if (isOutput(col)) {
var firstOutput = cols.filter(function (col) {
return isOutput(col);
})[0];
var firstOutputIndex = cols.indexOf(firstOutput);
return cols[Math.max(firstOutputIndex, index - 1)];
}
return cols[Math.max(0, index - 1)];
}
function getColRight(col, cols) {
var index = cols.indexOf(col);
if (isInput(col)) {
var inputs = cols.filter(function (col) {
return isInput(col);
});
var lastInput = inputs[inputs.length - 1];
var lastInputIndex = cols.indexOf(lastInput);
return cols[Math.min(lastInputIndex, index + 1)];
}
return cols[Math.min(cols.length - 1, index + 1)];
} // QUIRK: PhantomJS requires check if actual DOM node
function isNode(node) {
return node && (node.nodeType === 1 || node.nodeType == 11);
}
//# sourceMappingURL=DragAndDrop.js.map