aurelia-bootstrap
Version:
Bootstrap components written in Aurelia.
244 lines (194 loc) • 8.72 kB
JavaScript
/* */
define(['exports', './repeat-utilities', 'aurelia-binding'], function (exports, _repeatUtilities, _aureliaBinding) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ArrayRepeatStrategy = undefined;
var ArrayRepeatStrategy = exports.ArrayRepeatStrategy = function () {
function ArrayRepeatStrategy() {
}
ArrayRepeatStrategy.prototype.getCollectionObserver = function getCollectionObserver(observerLocator, items) {
return observerLocator.getArrayObserver(items);
};
ArrayRepeatStrategy.prototype.instanceChanged = function instanceChanged(repeat, items) {
var _this = this;
var itemsLength = items.length;
if (!items || itemsLength === 0) {
repeat.removeAllViews(true, !repeat.viewsRequireLifecycle);
return;
}
var children = repeat.views();
var viewsLength = children.length;
if (viewsLength === 0) {
this._standardProcessInstanceChanged(repeat, items);
return;
}
if (repeat.viewsRequireLifecycle) {
(function () {
var childrenSnapshot = children.slice(0);
var itemNameInBindingContext = repeat.local;
var matcher = repeat.matcher();
var itemsPreviouslyInViews = [];
var viewsToRemove = [];
for (var index = 0; index < viewsLength; index++) {
var view = childrenSnapshot[index];
var oldItem = view.bindingContext[itemNameInBindingContext];
if ((0, _repeatUtilities.indexOf)(items, oldItem, matcher) === -1) {
viewsToRemove.push(view);
} else {
itemsPreviouslyInViews.push(oldItem);
}
}
var updateViews = void 0;
var removePromise = void 0;
if (itemsPreviouslyInViews.length > 0) {
removePromise = repeat.removeViews(viewsToRemove, true, !repeat.viewsRequireLifecycle);
updateViews = function updateViews() {
for (var _index = 0; _index < itemsLength; _index++) {
var item = items[_index];
var indexOfView = (0, _repeatUtilities.indexOf)(itemsPreviouslyInViews, item, matcher, _index);
var _view = void 0;
if (indexOfView === -1) {
var overrideContext = (0, _repeatUtilities.createFullOverrideContext)(repeat, items[_index], _index, itemsLength);
repeat.insertView(_index, overrideContext.bindingContext, overrideContext);
itemsPreviouslyInViews.splice(_index, 0, undefined);
} else if (indexOfView === _index) {
_view = children[indexOfView];
itemsPreviouslyInViews[indexOfView] = undefined;
} else {
_view = children[indexOfView];
repeat.moveView(indexOfView, _index);
itemsPreviouslyInViews.splice(indexOfView, 1);
itemsPreviouslyInViews.splice(_index, 0, undefined);
}
if (_view) {
(0, _repeatUtilities.updateOverrideContext)(_view.overrideContext, _index, itemsLength);
}
}
_this._inPlaceProcessItems(repeat, items);
};
} else {
removePromise = repeat.removeAllViews(true, !repeat.viewsRequireLifecycle);
updateViews = function updateViews() {
return _this._standardProcessInstanceChanged(repeat, items);
};
}
if (removePromise instanceof Promise) {
removePromise.then(updateViews);
} else {
updateViews();
}
})();
} else {
this._inPlaceProcessItems(repeat, items);
}
};
ArrayRepeatStrategy.prototype._standardProcessInstanceChanged = function _standardProcessInstanceChanged(repeat, items) {
for (var i = 0, ii = items.length; i < ii; i++) {
var overrideContext = (0, _repeatUtilities.createFullOverrideContext)(repeat, items[i], i, ii);
repeat.addView(overrideContext.bindingContext, overrideContext);
}
};
ArrayRepeatStrategy.prototype._inPlaceProcessItems = function _inPlaceProcessItems(repeat, items) {
var itemsLength = items.length;
var viewsLength = repeat.viewCount();
while (viewsLength > itemsLength) {
viewsLength--;
repeat.removeView(viewsLength, true, !repeat.viewsRequireLifecycle);
}
var local = repeat.local;
for (var i = 0; i < viewsLength; i++) {
var view = repeat.view(i);
var last = i === itemsLength - 1;
var middle = i !== 0 && !last;
if (view.bindingContext[local] === items[i] && view.overrideContext.$middle === middle && view.overrideContext.$last === last) {
continue;
}
view.bindingContext[local] = items[i];
view.overrideContext.$middle = middle;
view.overrideContext.$last = last;
repeat.updateBindings(view);
}
for (var _i = viewsLength; _i < itemsLength; _i++) {
var overrideContext = (0, _repeatUtilities.createFullOverrideContext)(repeat, items[_i], _i, itemsLength);
repeat.addView(overrideContext.bindingContext, overrideContext);
}
};
ArrayRepeatStrategy.prototype.instanceMutated = function instanceMutated(repeat, array, splices) {
var _this2 = this;
if (repeat.__queuedSplices) {
for (var i = 0, ii = splices.length; i < ii; ++i) {
var _splices$i = splices[i],
index = _splices$i.index,
removed = _splices$i.removed,
addedCount = _splices$i.addedCount;
(0, _aureliaBinding.mergeSplice)(repeat.__queuedSplices, index, removed, addedCount);
}
repeat.__array = array.slice(0);
return;
}
var maybePromise = this._runSplices(repeat, array.slice(0), splices);
if (maybePromise instanceof Promise) {
(function () {
var queuedSplices = repeat.__queuedSplices = [];
var runQueuedSplices = function runQueuedSplices() {
if (!queuedSplices.length) {
repeat.__queuedSplices = undefined;
repeat.__array = undefined;
return;
}
var nextPromise = _this2._runSplices(repeat, repeat.__array, queuedSplices) || Promise.resolve();
queuedSplices = repeat.__queuedSplices = [];
nextPromise.then(runQueuedSplices);
};
maybePromise.then(runQueuedSplices);
})();
}
};
ArrayRepeatStrategy.prototype._runSplices = function _runSplices(repeat, array, splices) {
var _this3 = this;
var removeDelta = 0;
var rmPromises = [];
for (var i = 0, ii = splices.length; i < ii; ++i) {
var splice = splices[i];
var removed = splice.removed;
for (var j = 0, jj = removed.length; j < jj; ++j) {
var viewOrPromise = repeat.removeView(splice.index + removeDelta + rmPromises.length, true);
if (viewOrPromise instanceof Promise) {
rmPromises.push(viewOrPromise);
}
}
removeDelta -= splice.addedCount;
}
if (rmPromises.length > 0) {
return Promise.all(rmPromises).then(function () {
var spliceIndexLow = _this3._handleAddedSplices(repeat, array, splices);
(0, _repeatUtilities.updateOverrideContexts)(repeat.views(), spliceIndexLow);
});
}
var spliceIndexLow = this._handleAddedSplices(repeat, array, splices);
(0, _repeatUtilities.updateOverrideContexts)(repeat.views(), spliceIndexLow);
return undefined;
};
ArrayRepeatStrategy.prototype._handleAddedSplices = function _handleAddedSplices(repeat, array, splices) {
var spliceIndex = void 0;
var spliceIndexLow = void 0;
var arrayLength = array.length;
for (var i = 0, ii = splices.length; i < ii; ++i) {
var splice = splices[i];
var addIndex = spliceIndex = splice.index;
var end = splice.index + splice.addedCount;
if (typeof spliceIndexLow === 'undefined' || spliceIndexLow === null || spliceIndexLow > splice.index) {
spliceIndexLow = spliceIndex;
}
for (; addIndex < end; ++addIndex) {
var overrideContext = (0, _repeatUtilities.createFullOverrideContext)(repeat, array[addIndex], addIndex, arrayLength);
repeat.insertView(addIndex, overrideContext.bindingContext, overrideContext);
}
}
return spliceIndexLow;
};
return ArrayRepeatStrategy;
}();
});