curvature
Version:

408 lines (407 loc) • 16 kB
JavaScript
"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;