handleVisStabilizedEvent(properties) {

    if (this.hasNetworkStabilized) {
      return;
    }

    this.hasNetworkStabilized = true;
    this.logger('log', 'Network stabilized after', properties.iterations, 'iterations');

    if (!this.view.isEnabled('physics_mode')) { // static mode

      // store positions if new nodes without position were added
      const nodes = this.graphData.nodesById;
      const idsOfNodesWithoutPosition = [];

      for (let id in nodes) {
        if (nodes[id].x === undefined) {
          idsOfNodesWithoutPosition.push(id);
        }
      }

      if (idsOfNodesWithoutPosition.length) {
        this.setNodesMoveable(idsOfNodesWithoutPosition, false);
        $tm.notify(`${idsOfNodesWithoutPosition.length} nodes were added to the graph`);
      }

      // after storing positions, set gravity to zero again
      const physics = this.visOptions.physics;
      physics[physics.solver].centralGravity = 0;
      this.network.setOptions(this.visOptions);

    }

    if (this.resetFocus) {
      this.fitGraph(this.resetFocus.delay, this.resetFocus.duration);
      this.resetFocus = null;
    }

  }
Called by vis when the graph has stabilized itself.

ATTENTION: never store positions in a view's map during stabilize
as this will affect other graphs positions and will cause recursion!
Storing positions inside vis' nodes is fine though