all files / Github/diagram-js/lib/features/modeling/cmd/ ToggleShapeCollapseHandler.js

100% Statements 24/24
100% Branches 0/0
100% Functions 9/9
100% Lines 24/24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81              1128×           21× 21×     21×     21×     21×   21×                                                 21×   21× 122×     21×         21× 122×         57×      
/**
 * A handler that toggles the collapsed state of an element
 * and the visibility of all its children.
 *
 * @param {Modeling} modeling
 */
export default function ToggleShapeCollapseHandler(modeling) {
  this._modeling = modeling;
}
 
ToggleShapeCollapseHandler.$inject = [ 'modeling' ];
 
 
ToggleShapeCollapseHandler.prototype.execute = function(context) {
 
  var shape = context.shape,
      children = shape.children;
 
  // remember previous visibility of children
  context.oldChildrenVisibility = getElementsVisibility(children);
 
  // toggle state
  shape.collapsed = !shape.collapsed;
 
  // hide/show children
  setHidden(children, shape.collapsed);
 
  return [shape].concat(children);
};
 
 
ToggleShapeCollapseHandler.prototype.revert = function(context) {
 
  var shape = context.shape,
      oldChildrenVisibility = context.oldChildrenVisibility;
 
  var children = shape.children;
 
  // set old visability of children
  restoreVisibility(children, oldChildrenVisibility);
 
  // retoggle state
  shape.collapsed = !shape.collapsed;
 
  return [shape].concat(children);
};
 
 
// helpers //////////////////////
 
/**
 * Return a map { elementId -> hiddenState}.
 *
 * @param {Array<djs.model.Shape>} elements
 *
 * @return {Object}
 */
function getElementsVisibility(elements) {
 
  var result = {};
 
  elements.forEach(function(e) {
    result[e.id] = e.hidden;
  });
 
  return result;
}
 
 
function setHidden(elements, newHidden) {
  elements.forEach(function(element) {
    element.hidden = newHidden;
  });
}
 
function restoreVisibility(elements, lastState) {
  elements.forEach(function(e) {
    e.hidden = lastState[e.id];
  });
}