VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /var/www/html/libs/absol-full/dist/js/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/html/libs/absol-full/dist/js/mdls__absol-acomp__js__DraggableVStack.js
/*** module: node_modules/absol-acomp/js/DraggableVStack.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

require("../css/draggablestack.css");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _Hanger = _interopRequireDefault(require("./Hanger"));

var _utils = require("./utils");

var _stringGenerate = require("absol/src/String/stringGenerate");

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _PositionTracker = _interopRequireDefault(require("./PositionTracker"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @augments Hanger
 * @augments PositionTracker
 * @constructor
 */

function DraggableVStack() {
  _({
    tag: 'PositionTracker'.toLowerCase(),
    elt: this
  });

  this.$cloneContainer = _('.absol-draggable-stack-clone-container');
  this.on('predrag', this.eventHandler.predrag).on('dragstart', this.eventHandler.dragstart).on('drag', this.eventHandler.drag).on('dragend', this.eventHandler.dragend);
  this._state = 0;
  this.friends = [];
  this.$friends = [];
  this._privateDraggableVStackIdent = (0, _stringGenerate.randomIdent)(35);
  this._dragData = null;
  this.on('positionchange', this.eventHandler.scroll);
}

DraggableVStack.tag = 'DraggableVStack'.toLowerCase();

DraggableVStack.render = function () {
  return _({
    tag: 'hanger',
    extendEvent: ['change', 'orderchange', 'itemleave', 'itementer'],
    class: ['absol-draggable-stack', 'absol-draggable-vstack']
  });
};

DraggableVStack.prototype._updateFriends = function () {
  var dict = {};
  dict[this._privateDraggableVStackIdent] = this;
  this.$friends = this.friends.reduce(function (ac, cr) {
    if (_Dom.default.isDomNode(cr)) {
      if (cr._privateDraggableVStackIdent) {
        ac.result.push(cr);
        ac.dict[cr._privateDraggableVStackIdent] = cr;
      }
    } else if (typeof cr === 'string') {
      $(cr, false, function (elt) {
        if (elt._privateDraggableVStackIdent) {
          if (!ac.dict[elt._privateDraggableVStackIdent]) {
            ac.result.push(elt);
            ac.dict[elt._privateDraggableVStackIdent] = elt;
          }
        }
      });
    }

    return ac;
  }, {
    dict: dict,
    result: []
  }).result;
};

DraggableVStack.prototype._findIndex = function (clientY) {
  var childBounds = Array.prototype.map.call(this.childNodes, function (elt) {
    return elt.getBoundingClientRect();
  });
  var childTops = childBounds.map(function (b) {
    return b.top;
  });
  childTops.push((childBounds[childBounds.length - 1] || this.getBoundingClientRect()).bottom);
  var nearestIdx = 0;
  var nearestVal = 10000000;
  var val;

  for (var i = 0; i < childTops.length; ++i) {
    val = Math.abs(clientY - childTops[i]);

    if (val < nearestVal) {
      nearestVal = val;
      nearestIdx = i;
    }
  }

  return nearestIdx;
};
/***
 *
 * @type {DraggableVStack|{}}
 */


DraggableVStack.eventHandler = {};

DraggableVStack.eventHandler.predrag = function (event) {
  var dragzone = this._findDragzone(event.target);

  if (!dragzone) {
    event.cancel();
  }
};

DraggableVStack.eventHandler.dragstart = function (event) {
  this.startTrackPosition();
  event.preventDefault();

  this._updateFriends();

  this._state = 1;
  this.addClass('as-state-drag');
  this._dragData = {
    mouseStartPos: new _Vec.default(event.clientX, event.clientY),
    elt: this._findDirectChild(event.target),
    rootBound: this.getBoundingClientRect(),
    dest: this
  };
  this._dragData.mouseCurrentPos = this._dragData.mouseStartPos;

  this._updateDestChildrenBound();

  this._dragData.idx = Array.prototype.indexOf.call(this.childNodes, this._dragData.elt);
  this._dragData.eltBound = this._dragData.destChildBounds[this._dragData.idx];
  this._dragData.offsetPos = this._dragData.mouseStartPos.sub(new _Vec.default(this._dragData.eltBound.left, this._dragData.eltBound.top));
  this._dragData.eltRelative = new _Vec.default(this._dragData.eltBound.left, this._dragData.eltBound.top).sub(new _Vec.default(this._dragData.rootBound.left, this._dragData.rootBound.top));
  this.$cloneContainer.addTo(document.body);
  this.$cloneContainer.clearChild().addChild($(this._dragData.elt.cloneNode(true)).addStyle({
    boxSizing: 'border-box',
    width: this._dragData.eltBound.width + 'px',
    height: this._dragData.eltBound.height + 'px'
  }));
  this.$cloneContainer.addStyle({
    left: this._dragData.eltBound.left + 'px',
    top: this._dragData.eltBound.top + 'px'
  });

  this._dragData.elt.addClass('dragging');
};

DraggableVStack.eventHandler.drag = function (event) {
  event.preventDefault();
  this._dragData.mouseCurrentPos = new _Vec.default(event.clientX, event.clientY);

  this._updateHoverDest();

  this._updateDraggingPosition();

  this.eventHandler.dragOverflow(event);
};

DraggableVStack.prototype.getClientY = function () {
  var top = 1000000;
  var bottom = -10000000;
  var child;
  var childBound;

  for (var i = 0; i < this.childNodes.length; ++i) {
    child = this.childNodes[i];
    if (child === this.$cloneContainer) continue;

    if (child.getBoundingClientRect) {
      childBound = child.getBoundingClientRect();
      top = Math.min(top, childBound.top);
      bottom = Math.max(bottom, childBound.bottom);
    }
  }

  return {
    top: top,
    bottom: bottom
  };
};

DraggableVStack.eventHandler.dragOverflow = function (event) {
  var scroller = this;

  while (scroller) {
    var overflowStyle = window.getComputedStyle(scroller)['overflow'];
    if ((overflowStyle === 'auto' || overflowStyle === 'scroll' || scroller.tagName === 'HTML') && scroller.clientHeight < scroller.scrollHeight) break;
    scroller = scroller.parentElement;
  }

  if (!scroller) return;
  var outBound = scroller.getBoundingClientRect();
  var bBound = this.$cloneContainer.getBoundingClientRect();

  var screenSize = _Dom.default.getScreenSize();

  if (scroller.tagName !== "HTML") {
    outBound = {
      top: Math.max(outBound.top, 0),
      bottom: Math.min(outBound.bottom, screenSize.height)
    };
  } else {
    outBound = {
      top: 0,
      bottom: screenSize.height
    };
  }

  var vy = 0;

  if (bBound.top < outBound.top) {
    vy = bBound.top - outBound.top;
  } else if (bBound.bottom > outBound.bottom) {
    vy = bBound.bottom - outBound.bottom;
  }

  var dt = 1 / 30;

  if (vy !== 0) {
    var copyEvent = {
      type: event.type,
      preventDefault: function () {
        /* noop */
      },
      target: event.target
    };
    copyEvent.clientX = event.clientX;
    copyEvent.clientY = event.clientY;
    var thisBT = this;
    setTimeout(function () {
      if (scroller.scrollHeight > scroller.clientHeight) {
        scroller.scrollTop += (0, _utils.absCeil)(vy * dt);
      }

      if (thisBT._state === 1) {
        thisBT.eventHandler.dragOverflow(copyEvent);
      }
    }, dt * 1000);
  }
};

DraggableVStack.eventHandler.scroll = function (event) {
  this._updateDraggingPosition();
};

DraggableVStack.eventHandler.dragend = function (event) {
  this.stopTrackPosition();
  event.preventDefault();

  this._dragData.dest.removeClass('as-state-drag');

  this.$cloneContainer.remove();

  this._dragData.elt.removeClass('dragging');

  this.removeClass('as-state-no-change');
  this._state = 0;
  var beforeElt;

  if (this._dragData.dest === this) {
    if (this._dragData.idx === this._dragData.destIdx || this._dragData.idx + 1 === this._dragData.destIdx) {//todo
    } else {
      if (this._dragData.destIdx === this.childNodes.length) {
        this._dragData.elt.remove();

        this.addChild(this._dragData.elt);
        this.emit('change', {
          type: 'change',
          fromStack: this,
          toStack: this,
          elt: this._dragData.elt,
          sourceIndex: this._dragData.idx,
          destIndex: this.childNodes.length,
          oldIdx: this._dragData.idx,
          newIdx: this.childNodes.length - 1,
          desc: "Move element to end of stack."
        }, this);
        this.emit('orderchange', {
          type: 'orderchange',
          fromStack: this,
          toStack: this,
          elt: this._dragData.elt,
          oldIdx: this._dragData.idx,
          newIdx: this.childNodes.length - 1,
          desc: "Move element to end of stack."
        }, this);
      } else {
        beforeElt = this.childNodes[this._dragData.destIdx];

        this._dragData.elt.remove();

        this.addChildBefore(this._dragData.elt, beforeElt);
        this.emit('change', {
          type: 'change',
          fromStack: this,
          toStack: this,
          elt: this._dragData.elt,
          sourceIndex: this._dragData.idx,
          destIndex: this._dragData.destIdx,
          oldIdx: this._dragData.idx,
          newIdx: this._dragData.destIdx > this._dragData.idx ? this._dragData.destIdx - 1 : this._dragData.destIdx,
          desc: "Move element to before  this.childNodes[" + this._dragData.destIdx + "]"
        }, this);
        this.emit('orderchange', {
          type: 'orderchange',
          fromStack: this,
          toStack: this,
          elt: this._dragData.elt,
          oldIdx: this._dragData.idx,
          newIdx: this._dragData.destIdx > this._dragData.idx ? this._dragData.destIdx - 1 : this._dragData.destIdx,
          desc: "Move element to before  this.childNodes[" + this._dragData.destIdx + "]"
        }, this);
      }
    }
  } else {
    if (this._dragData.destIdx === this._dragData.dest.childNodes.length) {
      this.emit('orderchange', {
        type: 'itemleave',
        fromStack: this,
        toStack: this._dragData.dest,
        oldIdx: this._dragData.idx,
        newIdx: this.childNodes.length - 1,
        desc: "Move element to end of friend stack."
      }, this);

      this._dragData.elt.remove();

      this._dragData.dest.addChild(this._dragData.elt);

      this._dragData.dest.emit('orderchange', {
        type: 'itementer',
        fromStack: this,
        toStack: this._dragData.dest,
        oldIdx: this._dragData.idx,
        newIdx: this.childNodes.length - 1,
        desc: "Move element to end of friend stack."
      }, this._dragData.dest);

      this.emit('change', {
        type: 'change',
        fromStack: this,
        toStack: this._dragData.dest,
        elt: this._dragData.elt,
        sourceIndex: this._dragData.idx,
        destIndex: this.childNodes.length,
        oldIdx: this._dragData.idx,
        newIdx: this.childNodes.length - 1,
        desc: "Move element to end of friend stack."
      });
    } else {
      beforeElt = this._dragData.dest.childNodes[this._dragData.destIdx];

      this._dragData.elt.remove();

      this.emit('itemleave', {
        type: 'itemleave',
        fromStack: this,
        toStack: this._dragData.dest,
        elt: this._dragData.elt,
        oldIdx: this._dragData.idx,
        newIdx: this._dragData.destIdx,
        desc: "Move element to before friend.childNodes[" + this._dragData.destIdx + "]"
      }, this);

      this._dragData.dest.addChildBefore(this._dragData.elt, beforeElt);

      this._dragData.dest.emit('itementer', {
        type: 'itementer',
        fromStack: this,
        toStack: this._dragData.dest,
        elt: this._dragData.elt,
        oldIdx: this._dragData.idx,
        newIdx: this._dragData.destIdx,
        desc: "Move element to before friend.childNodes[" + this._dragData.destIdx + "]"
      }, this._dragData.dest);

      this.emit('change', {
        type: 'change',
        fromStack: this,
        toStack: this._dragData.dest,
        elt: this._dragData.elt,
        sourceIndex: this._dragData.idx,
        destIndex: this._dragData.destIdx,
        oldIdx: this._dragData.idx,
        newIdx: this._dragData.destIdx,
        desc: "Move element to before friend.childNodes[" + this._dragData.destIdx + "]"
      }, this);
    }
  }
};

DraggableVStack.prototype._updateDestChildrenBound = function () {
  var top0 = this._dragData.dest.getBoundingClientRect().top;

  this._dragData.destChildBounds = Array.prototype.map.call(this._dragData.dest.childNodes, function (elt) {
    return elt.getBoundingClientRect();
  });
  this._dragData.destChildTops = this._dragData.destChildBounds.map(function (bound) {
    return bound.top - top0;
  }).concat([(this._dragData.destChildBounds[this._dragData.destChildBounds.length - 1] || this.getBoundingClientRect()).bottom - top0]);
};

DraggableVStack.prototype._updateHoverDest = function () {
  var bound;
  var newDest;
  var friendElt;
  var friendList = this.$friends.concat([this]);
  var top0;

  for (var i = 0; i < friendList.length; ++i) {
    friendElt = friendList[i];
    bound = _Rectangle.default.fromClientRect(friendElt.getBoundingClientRect());

    if (bound.containsPoint(this._dragData.mouseCurrentPos)) {
      top0 = bound.y;
      newDest = friendElt;
      break;
    }
  }

  if (newDest && this._dragData.dest !== newDest) {
    this._dragData.dest.removeClass('as-state-drag');

    this._dragData.dest = newDest;

    this._dragData.dest.addClass('as-state-drag');

    this._dragData.dest.addStyle('--dest-y', 'unset');

    this._updateDestChildrenBound();
  }
};

DraggableVStack.prototype._updateDraggingPosition = function () {
  var bound = this.getBoundingClientRect();

  var clonePos = this._dragData.mouseCurrentPos.sub(this._dragData.offsetPos);

  this.$cloneContainer.addStyle({
    top: clonePos.y + 'px',
    left: bound.left + 'px'
  });
  this._dragData.destIdx = this._dragData.dest._findIndex(clonePos.y + this._dragData.eltBound.height / 2);

  this._dragData.dest.addStyle('--dest-y', this._dragData.destChildTops[this._dragData.destIdx] + 'px');

  if (this._dragData.dest === this) {
    if (this._dragData.idx === this._dragData.destIdx || this._dragData.idx + 1 === this._dragData.destIdx) {
      this.addClass('as-state-no-change');
    } else {
      this.removeClass('as-state-no-change');
    }
  }
};

DraggableVStack.prototype._autoScrollParentIfNeed = function (delta) {
  //todo: choose which element should be scroll
  if (!(delta > 0)) delta = 10000;
  var bound = this.getBoundingClientRect();
  var cloneBound = this.$cloneContainer.getBoundingClientRect();

  var outBound = _Dom.default.traceOutBoundingClientRect(this.$cloneContainer);

  if (outBound.bottom >= cloneBound.bottom && outBound.top <= cloneBound.top) return;
  var scrollables = [];
  var current = this;

  while (current) {
    var oy = window.getComputedStyle(current);
    oy = oy['overflow-y'] || oy['overflowY'];

    if (oy == 'auto' || oy == 'scroll') {
      scrollables.push(current);
    }

    current = current.parentElement;
  }

  scrollables.push(document.body.parentElement);
};

DraggableVStack.prototype._findDragzone = function (elt) {
  var result = null;

  while (elt && elt != this) {
    if (elt.classList && elt.classList.contains('drag-zone')) {
      result = elt;
      break;
    }

    elt = elt.parentNode;
  }

  if (result) {
    elt = result;

    while (elt && elt != this) {
      if (elt.classList && elt.classList.contains('absol-draggable-stack')) {
        result = null;
        break;
      }

      elt = elt.parentNode;
    }
  }

  return result;
};

DraggableVStack.prototype._findDirectChild = function (elt) {
  while (elt && elt != this) {
    if (elt.parentNode == this) return elt;
    elt = elt.parentNode;
  }

  return undefined;
};

DraggableVStack.property = {};
DraggableVStack.property.friends = {
  set: function (value) {
    if (!(value instanceof Array)) value = [value];
    this._friends = value;
  },
  get: function () {
    return this._friends;
  }
};

_ACore.default.install(DraggableVStack);

var _default = DraggableVStack;
exports.default = _default;

VaKeR 2022