UNPKG

curvature

Version:

![avatar](https://avatars3.githubusercontent.com/u/640101?s=80&v=4)

408 lines (407 loc) 16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ViewList = void 0; var _Bindable = require("./Bindable"); var _SetMap = require("./SetMap"); var _Bag = require("./Bag"); function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } var ViewList = /*#__PURE__*/function () { function ViewList(template, subProperty, list, parent) { var _this = this; var keyProperty = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; var viewClass = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null; _classCallCheck(this, ViewList); this.removed = false; this.args = _Bindable.Bindable.makeBindable({}); this.args.value = _Bindable.Bindable.makeBindable(list || {}); this.subArgs = _Bindable.Bindable.makeBindable({}); this.views = []; this.cleanup = []; this.viewClass = viewClass; this._onRemove = new _Bag.Bag(); this.template = template; this.subProperty = subProperty; this.keyProperty = keyProperty; this.tag = null; this.downDebind = []; this.upDebind = []; this.paused = false; this.parent = parent; this.rendered = new Promise(function (accept, reject) { Object.defineProperty(_this, 'renderComplete', { configurable: false, writable: true, value: accept }); }); this.willReRender = false; this.args.___before(function (t, e, s, o, a) { if (e == 'bindTo') { return; } _this.paused = true; }); this.args.___after(function (t, e, s, o, a) { if (e == 'bindTo') { return; } _this.paused = s.length > 1; _this.reRender(); }); var debind = this.args.value.bindTo(function (v, k, t, d) { if (_this.paused) { return; } var kk = k; if (_typeof(k) === 'symbol') { return; } if (isNaN(k)) { kk = '_' + k; } if (d) { if (_this.views[kk]) { _this.views[kk].remove(); } delete _this.views[kk]; for (var i in _this.views) { if (isNaN(i)) { _this.views[i].args[_this.keyProperty] = i.substr(1); continue; } _this.views[i].args[_this.keyProperty] = i; } } else if (!_this.views[kk]) { cancelAnimationFrame(_this.willReRender); _this.willReRender = requestAnimationFrame(function () { _this.reRender(); }); } else if (_this.views[kk] && _this.views[kk].args) { _this.views[kk].args[_this.keyProperty] = k; _this.views[kk].args[_this.subProperty] = v; } }); this._onRemove.add(debind); Object.preventExtensions(this); } _createClass(ViewList, [{ key: "render", value: function render(tag) { var _this2 = this; var renders = []; var _iterator = _createForOfIteratorHelper(this.views), _step; try { var _loop = function _loop() { var view = _step.value; view.render(tag); renders.push(view.rendered.then(function () { return view; })); }; for (_iterator.s(); !(_step = _iterator.n()).done;) { _loop(); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } this.tag = tag; Promise.all(renders).then(function (views) { return _this2.renderComplete(views); }); this.parent.dispatchEvent(new CustomEvent('listRendered', { detail: { detail: { key: this.subProperty, value: this.args.value } } })); } }, { key: "reRender", value: function reRender() { var _this3 = this; if (this.paused || !this.tag) { return; } var views = []; var existingViews = new _SetMap.SetMap(); for (var i in this.views) { var view = this.views[i]; var rawValue = view.args[this.subProperty]; existingViews.add(rawValue, view); views[i] = view; } var finalViews = []; var finalViewSet = new Set(); this.downDebind.length && this.downDebind.forEach(function (d) { return d && d(); }); this.upDebind.length && this.upDebind.forEach(function (d) { return d && d(); }); this.upDebind.length = 0; this.downDebind.length = 0; var minKey = Infinity; var anteMinKey = Infinity; var _loop2 = function _loop2() { var found = false; var k = _i; if (isNaN(k)) { k = '_' + _i; } else if (String(k).length) { k = Number(k); } if (_this3.args.value[_i] !== undefined && existingViews.has(_this3.args.value[_i])) { var existingView = existingViews.getOne(_this3.args.value[_i]); if (existingView) { existingView.args[_this3.keyProperty] = _i; finalViews[k] = existingView; finalViewSet.add(existingView); found = true; if (!isNaN(k)) { minKey = Math.min(minKey, k); k > 0 && (anteMinKey = Math.min(anteMinKey, k)); } existingViews.remove(_this3.args.value[_i], existingView); } } if (!found) { var viewArgs = {}; var _view = finalViews[k] = new _this3.viewClass(viewArgs, _this3.parent); if (!isNaN(k)) { minKey = Math.min(minKey, k); k > 0 && (anteMinKey = Math.min(anteMinKey, k)); } finalViews[k].template = _this3.template; finalViews[k].viewList = _this3; finalViews[k].args[_this3.keyProperty] = _i; finalViews[k].args[_this3.subProperty] = _this3.args.value[_i]; _this3.upDebind[k] = viewArgs.bindTo(_this3.subProperty, function (v, k, t, d) { var index = viewArgs[_this3.keyProperty]; if (d) { delete _this3.args.value[index]; return; } _this3.args.value[index] = v; }); _this3.downDebind[k] = _this3.subArgs.bindTo(function (v, k, t, d) { if (d) { delete viewArgs[k]; return; } viewArgs[k] = v; }); var upDebind = function upDebind() { _this3.upDebind.filter(function (x) { return x; }).forEach(function (d) { return d(); }); _this3.upDebind.length = 0; }; var downDebind = function downDebind() { _this3.downDebind.filter(function (x) { return x; }).forEach(function (d) { return d(); }); _this3.downDebind.length = 0; }; _view.onRemove(function () { _this3._onRemove.remove(upDebind); _this3._onRemove.remove(downDebind); _this3.upDebind[k] && _this3.upDebind[k](); _this3.downDebind[k] && _this3.downDebind[k](); delete _this3.upDebind[k]; delete _this3.downDebind[k]; }); _this3._onRemove.add(upDebind); _this3._onRemove.add(downDebind); viewArgs[_this3.subProperty] = _this3.args.value[_i]; } }; for (var _i in this.args.value) { _loop2(); } for (var _i2 in views) { if (!finalViewSet.has(views[_i2])) { views[_i2].remove(); } } if (Array.isArray(this.args.value)) { var localMin = minKey === 0 && finalViews[1] !== undefined && finalViews.length > 1 || anteMinKey === Infinity ? minKey : anteMinKey; var renderRecurse = function renderRecurse() { var i = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var ii = finalViews.length - i - 1; while (ii > localMin && finalViews[ii] === undefined) { ii--; } if (ii < localMin) { return Promise.resolve(); } if (finalViews[ii] === _this3.views[ii]) { if (finalViews[ii] && !finalViews[ii].firstNode) { finalViews[ii].render(_this3.tag, finalViews[ii + 1]); return finalViews[ii].rendered.then(function () { return renderRecurse(Number(i) + 1); }); } else { var split = 500; if (i === 0 || i % split) { return renderRecurse(Number(i) + 1); } else { return new Promise(function (accept) { return requestAnimationFrame(function () { return accept(renderRecurse(Number(i) + 1)); }); }); } } } finalViews[ii].render(_this3.tag, finalViews[ii + 1]); _this3.views.splice(ii, 0, finalViews[ii]); return finalViews[ii].rendered.then(function () { return renderRecurse(i + 1); }); }; this.rendered = renderRecurse(); } else { var renders = []; var leftovers = Object.assign({}, finalViews); var isInt = function isInt(x) { return parseInt(x) === x - 0; }; var keys = Object.keys(finalViews).sort(function (a, b) { if (isInt(a) && isInt(b)) { return Math.sign(a - b); } if (!isInt(a) && !isInt(b)) { return 0; } if (!isInt(a) && isInt(b)) { return -1; } if (isInt(a) && !isInt(b)) { return 1; } }); var _iterator2 = _createForOfIteratorHelper(keys), _step2; try { var _loop3 = function _loop3() { var i = _step2.value; delete leftovers[i]; if (finalViews[i].firstNode && finalViews[i] === _this3.views[i]) { return "continue"; } finalViews[i].render(_this3.tag); renders.push(finalViews[i].rendered.then(function () { return finalViews[i]; })); }; for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var _ret = _loop3(); if (_ret === "continue") continue; } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } for (var _i3 in leftovers) { delete this.args.views[_i3]; leftovers.remove(); } this.rendered = Promise.all(renders); } for (var _i4 in finalViews) { if (isNaN(_i4)) { finalViews[_i4].args[this.keyProperty] = _i4.substr(1); continue; } finalViews[_i4].args[this.keyProperty] = _i4; } this.views = Array.isArray(this.args.value) ? [].concat(finalViews) : finalViews; finalViewSet.clear(); this.willReRender = false; this.rendered.then(function () { _this3.parent.dispatchEvent(new CustomEvent('listRendered', { detail: { detail: { key: _this3.subProperty, value: _this3.args.value, tag: _this3.tag } } })); _this3.tag.dispatchEvent(new CustomEvent('listRendered', { detail: { detail: { key: _this3.subProperty, value: _this3.args.value, tag: _this3.tag } } })); }); } }, { key: "pause", value: function pause() { var _pause = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; for (var i in this.views) { this.views[i].pause(_pause); } } }, { key: "onRemove", value: function onRemove(callback) { this._onRemove.add(callback); } }, { key: "remove", value: function remove() { for (var i in this.views) { this.views[i].remove(); } var onRemove = this._onRemove.items(); for (var _i5 in onRemove) { this._onRemove.remove(onRemove[_i5]); onRemove[_i5](); } var cleanup; while (this.cleanup.length) { cleanup = this.cleanup.pop(); cleanup(); } this.views = []; while (this.tag && this.tag.firstChild) { this.tag.removeChild(this.tag.firstChild); } if (this.subArgs) { _Bindable.Bindable.clearBindings(this.subArgs); } _Bindable.Bindable.clearBindings(this.args); if (this.args.value && !this.args.value.isBound()) { _Bindable.Bindable.clearBindings(this.args.value); } this.removed = true; } }]); return ViewList; }(); exports.ViewList = ViewList;