text: "use strict";
  var __extends = (this && this.__extends) || (function () {
      var extendStatics = function (d, b) {
          extendStatics = Object.setPrototypeOf ||
              ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
              function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
          return extendStatics(d, b);
      };
      return function (d, b) {
          if (typeof b !== "function" && b !== null)
              throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
          extendStatics(d, b);
          function __() { this.constructor = d; }
          d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
      };
  })();
  var __assign = (this && this.__assign) || function () {
      __assign = Object.assign || function(t) {
          for (var s, i = 1, n = arguments.length; i < n; i++) {
              s = arguments[i];
              for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                  t[p] = s[p];
          }
          return t;
      };
      return __assign.apply(this, arguments);
  };
  var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
      if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
          if (ar || !(i in from)) {
              if (!ar) ar = Array.prototype.slice.call(from, 0, i);
              ar[i] = from[i];
          }
      }
      return to.concat(ar || Array.prototype.slice.call(from));
  };
  var __importDefault = (this && this.__importDefault) || function (mod) {
      return (mod && mod.__esModule) ? mod : { "default": mod };
  };
  Object.defineProperty(exports, "__esModule", { value: true });
  exports.View = void 0;
  var jquery_1 = __importDefault(require("jquery"));
  var util_1 = require("../util");
  var common_1 = require("../common");
  var global_1 = require("../global");
  var View = /** @class */ (function (_super) {
      __extends(View, _super);
      function View() {
          var _this = _super.call(this) || this;
          _this.cid = Private.uniqueId();
          View.views[_this.cid] = _this;
          return _this;
      }
      Object.defineProperty(View.prototype, "priority", {
          get: function () {
              return 2;
          },
          enumerable: false,
          configurable: true
      });
      // eslint-disable-next-line @typescript-eslint/no-unused-vars
      View.prototype.confirmUpdate = function (flag, options) {
          return 0;
      };
      View.prototype.$ = function (elem) {
          return View.$(elem);
      };
      View.prototype.empty = function (elem) {
          if (elem === void 0) { elem = this.container; }
          this.$(elem).empty();
          return this;
      };
      View.prototype.unmount = function (elem) {
          if (elem === void 0) { elem = this.container; }
          this.$(elem).remove();
          return this;
      };
      View.prototype.remove = function (elem) {
          if (elem === void 0) { elem = this.container; }
          if (elem === this.container) {
              this.removeEventListeners(document);
              this.onRemove();
              delete View.views[this.cid];
          }
          this.unmount(elem);
          return this;
      };
      View.prototype.onRemove = function () { };
      View.prototype.setClass = function (className, elem) {
          if (elem === void 0) { elem = this.container; }
          elem.classList.value = Array.isArray(className)
              ? className.join(' ')
              : className;
      };
      View.prototype.addClass = function (className, elem) {
          if (elem === void 0) { elem = this.container; }
          this.$(elem).addClass(Array.isArray(className) ? className.join(' ') : className);
          return this;
      };
      View.prototype.removeClass = function (className, elem) {
          if (elem === void 0) { elem = this.container; }
          this.$(elem).removeClass(Array.isArray(className) ? className.join(' ') : className);
          return this;
      };
      View.prototype.setStyle = function (style, elem) {
          if (elem === void 0) { elem = this.container; }
          this.$(elem).css(style);
          return this;
      };
      View.prototype.setAttrs = function (attrs, elem) {
          if (elem === void 0) { elem = this.container; }
          if (attrs != null && elem != null) {
              if (elem instanceof SVGElement) {
                  util_1.Dom.attr(elem, attrs);
              }
              else {
                  this.$(elem).attr(attrs);
              }
          }
          return this;
      };
      /**
       * Returns the value of the specified attribute of `node`.
       *
       * If the node does not set a value for attribute, start recursing up
       * the DOM tree from node to lookup for attribute at the ancestors of
       * node. If the recursion reaches CellView's root node and attribute
       * is not found even there, return `null`.
       */
      View.prototype.findAttr = function (attrName, elem) {
          if (elem === void 0) { elem = this.container; }
          var current = elem;
          while (current && current.nodeType === 1) {
              var value = current.getAttribute(attrName);
              if (value != null) {
                  return value;
              }
              if (current === this.container) {
                  return null;
              }
              current = current.parentNode;
          }
          return null;
      };
      View.prototype.find = function (selector, rootElem, selectors) {
          if (rootElem === void 0) { rootElem = this.container; }
          if (selectors === void 0) { selectors = this.selectors; }
          return View.find(selector, rootElem, selectors).elems;
      };
      View.prototype.findOne = function (selector, rootElem, selectors) {
          if (rootElem === void 0) { rootElem = this.container; }
          if (selectors === void 0) { selectors = this.selectors; }
          var nodes = this.find(selector, rootElem, selectors);
          return nodes.length > 0 ? nodes[0] : null;
      };
      View.prototype.findByAttr = function (attrName, elem) {
          if (elem === void 0) { elem = this.container; }
          var node = elem;
          while (node && node.getAttribute) {
              var val = node.getAttribute(attrName);
              if ((val != null || node === this.container) && val !== 'false') {
                  return node;
              }
              node = node.parentNode;
          }
          // If the overall cell has set `magnet === false`, then returns
          // `null` to announce there is no magnet found for this cell.
          // This is especially useful to set on cells that have 'ports'.
          // In this case, only the ports have set `magnet === true` and the
          // overall element has `magnet === false`.
          return null;
      };
      View.prototype.getSelector = function (elem, prevSelector) {
          var selector;
          if (elem === this.container) {
              if (typeof prevSelector === 'string') {
                  selector = "> " + prevSelector;
              }
              return selector;
          }
          if (elem) {
              var nth = util_1.Dom.index(elem) + 1;
              selector = elem.tagName.toLowerCase() + ":nth-child(" + nth + ")";
              if (prevSelector) {
                  selector += " > " + prevSelector;
              }
              selector = this.getSelector(elem.parentNode, selector);
          }
          return selector;
      };
      View.prototype.prefixClassName = function (className) {
          return global_1.Util.prefix(className);
      };
      View.prototype.delegateEvents = function (events, append) {
          var _this = this;
          if (events == null) {
              return this;
          }
          if (!append) {
              this.undelegateEvents();
          }
          var splitter = /^(\S+)\s*(.*)$/;
          Object.keys(events).forEach(function (key) {
              var match = key.match(splitter);
              if (match == null) {
                  return;
              }
              var method = _this.getEventHandler(events[key]);
              if (typeof method === 'function') {
                  _this.delegateEvent(match[1], match[2], method);
              }
          });
          return this;
      };
      View.prototype.undelegateEvents = function () {
          this.$(this.container).off(this.getEventNamespace());
          return this;
      };
      View.prototype.delegateDocumentEvents = function (events, data) {
          this.addEventListeners(document, events, data);
          return this;
      };
      View.prototype.undelegateDocumentEvents = function () {
          this.removeEventListeners(document);
          return this;
      };
      View.prototype.delegateEvent = function (eventName, selector, listener) {
          this.$(this.container).on(eventName + this.getEventNamespace(), selector, listener);
          return this;
      };
      View.prototype.undelegateEvent = function (eventName, selector, listener) {
          var name = eventName + this.getEventNamespace();
          if (selector == null) {
              this.$(this.container).off(name);
          }
          else if (typeof selector === 'string') {
              this.$(this.container).off(name, selector, listener);
          }
          else {
              this.$(this.container).off(name, selector);
          }
          return this;
      };
      View.prototype.addEventListeners = function (elem, events, data) {
          var _this = this;
          if (events == null) {
              return this;
          }
          var ns = this.getEventNamespace();
          var $elem = this.$(elem);
          Object.keys(events).forEach(function (eventName) {
              var method = _this.getEventHandler(events[eventName]);
              if (typeof method === 'function') {
                  $elem.on(eventName + ns, data, method);
              }
          });
          return this;
      };
      View.prototype.removeEventListeners = function (elem) {
          if (elem != null) {
              this.$(elem).off(this.getEventNamespace());
          }
          return this;
      };
      View.prototype.getEventNamespace = function () {
          return "." + global_1.Config.prefixCls + "-event-" + this.cid;
      };
      // eslint-disable-next-line
      View.prototype.getEventHandler = function (handler) {
          var _this = this;
          // eslint-disable-next-line
          var method;
          if (typeof handler === 'string') {
              var fn_1 = this[handler];
              if (typeof fn_1 === 'function') {
                  method = function () {
                      var args = [];
                      for (var _i = 0; _i < arguments.length; _i++) {
                          args[_i] = arguments[_i];
                      }
                      return fn_1.call.apply(fn_1, __spreadArray([_this], args, false));
                  };
              }
          }
          else {
              method = function () {
                  var args = [];
                  for (var _i = 0; _i < arguments.length; _i++) {
                      args[_i] = arguments[_i];
                  }
                  return handler.call.apply(handler, __spreadArray([_this], args, false));
              };
          }
          return method;
      };
      View.prototype.getEventTarget = function (e, options) {
          if (options === void 0) { options = {}; }
          // Touchmove/Touchend event's target is not reflecting the element
          // under the coordinates as mousemove does.
          // It holds the element when a touchstart triggered.
          var target = e.target, type = e.type, _a = e.clientX, clientX = _a === void 0 ? 0 : _a, _b = e.clientY, clientY = _b === void 0 ? 0 : _b;
          if (options.fromPoint || type === 'touchmove' || type === 'touchend') {
              return document.elementFromPoint(clientX, clientY);
          }
          return target;
      };
      View.prototype.stopPropagation = function (e) {
          this.setEventData(e, { propagationStopped: true });
          return this;
      };
      View.prototype.isPropagationStopped = function (e) {
          return this.getEventData(e).propagationStopped === true;
      };
      View.prototype.getEventData = function (e) {
          return this.eventData(e);
      };
      View.prototype.setEventData = function (e, data) {
          return this.eventData(e, data);
      };
      View.prototype.eventData = function (e, data) {
          if (e == null) {
              throw new TypeError('Event object required');
          }
          var currentData = e.data;
          var key = "__" + this.cid + "__";
          // get
          if (data == null) {
              if (currentData == null) {
                  return {};
              }
              return currentData[key] || {};
          }
          // set
          if (currentData == null) {
              currentData = e.data = {};
          }
          if (currentData[key] == null) {
              currentData[key] = __assign({}, data);
          }
          else {
              currentData[key] = __assign(__assign({}, currentData[key]), data);
          }
          return currentData[key];
      };
      View.prototype.normalizeEvent = function (evt) {
          return View.normalizeEvent(evt);
      };
      return View;
  }(common_1.Basecoat));
  exports.View = View;
  (function (View) {
      function $(elem) {
          return (0, jquery_1.default)(elem);
      }
      View.$ = $;
      function createElement(tagName, isSvgElement) {
          return isSvgElement
              ? util_1.Dom.createSvgElement(tagName || 'g')
              : util_1.Dom.createElementNS(tagName || 'div');
      }
      View.createElement = createElement;
      function find(selector, rootElem, selectors) {
          if (!selector || selector === '.') {
              return { elems: [rootElem] };
          }
          if (selectors) {
              var nodes = selectors[selector];
              if (nodes) {
                  return { elems: Array.isArray(nodes) ? nodes : [nodes] };
              }
          }
          if (global_1.Config.useCSSSelector) {
              return {
                  isCSSSelector: true,
                  // elems: Array.prototype.slice.call(rootElem.querySelectorAll(selector)),
                  elems: $(rootElem).find(selector).toArray(),
              };
          }
          return { elems: [] };
      }
      View.find = find;
      function normalizeEvent(evt) {
          var normalizedEvent = evt;
          var originalEvent = evt.originalEvent;
          var touchEvt = originalEvent &&
              originalEvent.changedTouches &&
              originalEvent.changedTouches[0];
          if (touchEvt) {
              // eslint-disable-next-line no-restricted-syntax
              for (var key in evt) {
                  // copy all the properties from the input event that are not
                  // defined on the touch event (functions included).
                  if (touchEvt[key] === undefined) {
                      touchEvt[key] = evt[key];
                  }
              }
              normalizedEvent = touchEvt;
          }
          // IE: evt.target could be set to SVGElementInstance for SVGUseElement
          var target = normalizedEvent.target;
          if (target) {
              var useElement = target.correspondingUseElement;
              if (useElement) {
                  normalizedEvent.target = useElement;
              }
          }
          return normalizedEvent;
      }
      View.normalizeEvent = normalizeEvent;
  })(View = exports.View || (exports.View = {}));
  exports.View = View;
  (function (View) {
      View.views = {};
      function getView(cid) {
          return View.views[cid] || null;
      }
      View.getView = getView;
  })(View = exports.View || (exports.View = {}));
  exports.View = View;
  var Private;
  (function (Private) {
      var counter = 0;
      function uniqueId() {
          var id = "v" + counter;
          counter += 1;
          return id;
      }
      Private.uniqueId = uniqueId;
  })(Private || (Private = {}));
  //# sourceMappingURL=view.js.map