in src/Clients/Web/winjs/js/winjs.js [29806:29899]
this.inserted = function (newItem, previousKey, nextKey, index) {
/// <signature helpKeyword="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted">
/// <summary locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted">
/// Raises a notification that an item was inserted.
/// </summary>
/// <param name="newItem" type="Object" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted_p:newItem">
/// The inserted item. It must have a key and a data property (it must implement the IItem interface).
/// </param>
/// <param name="previousKey" mayBeNull="true" type="String" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted_p:previousKey">
/// The key of the item before the insertion point, or null if the item was inserted at the start of the
/// list. It can be null if you specified nextKey.
/// </param>
/// <param name="nextKey" mayBeNull="true" type="String" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted_p:nextKey">
/// The key of the item after the insertion point, or null if the item was inserted at the end of the list.
/// It can be null if you specified previousKey.
/// </param>
/// <param name="index" optional="true" type="Number" integer="true" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted_p:index">
/// The index of the inserted item.
/// </param>
/// </signature>
if (editsQueued) {
// We can't change the slots out from under any queued edits
beginRefresh();
} else {
var key = newItem.key,
slotPrev = keyMap[previousKey],
slotNext = keyMap[nextKey];
var havePreviousKey = typeof previousKey === "string",
haveNextKey = typeof nextKey === "string";
// Only one of previousKey, nextKey needs to be passed in
//
if (havePreviousKey) {
if (slotNext && !slotNext.firstInSequence) {
slotPrev = slotNext.prev;
}
} else if (haveNextKey) {
if (slotPrev && !slotPrev.lastInSequence) {
slotNext = slotPrev.next;
}
}
// If the VDS believes the list is empty but the data adapter believes the item has
// a adjacent item start a refresh.
//
if ((havePreviousKey || haveNextKey) && !(slotPrev || slotNext) && (slotsStart.next === slotListEnd)) {
beginRefresh();
return;
}
// If this key is known, something has changed, start a refresh.
//
if (keyMap[key]) {
beginRefresh();
return;
}
// If the slots aren't adjacent or are thought to be distinct sequences by the
// VDS something has changed so start a refresh.
//
if (slotPrev && slotNext) {
if (slotPrev.next !== slotNext || slotPrev.lastInSequence || slotNext.firstInSequence) {
beginRefresh();
return;
}
}
// If one of the adjacent keys or indicies has only just been requested - rare,
// and easier to deal with in a refresh.
//
if ((slotPrev && (slotPrev.keyRequested || slotPrev.indexRequested)) ||
(slotNext && (slotNext.keyRequested || slotNext.indexRequested))) {
beginRefresh();
return;
}
if (slotPrev || slotNext) {
insertNewSlot(key, newItem, (slotNext ? slotNext : slotPrev.next), !!slotPrev, !!slotNext);
} else if (slotsStart.next === slotListEnd) {
insertNewSlot(key, newItem, slotsStart.next, true, true);
} else if (index !== undefined) {
updateNewIndicesFromIndex(index, 1);
} else {
// We could not find a previous or next slot and an index was not provided, start a refresh
//
beginRefresh();
return;
}
completeNotification();
}
};