# all files / 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

    1189×

    1×

    1×

    22×
    22×

    22×

    22×

    22×

    22×

    1×

    6×
    6×

    6×

    6×

    6×

    6×

    22×

    22×
    123×

    22×

    22×
    123×

    6×
    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];
      });
    }