mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2026-04-30 18:51:30 +00:00
Fix list widget bug with counter-last when appending items (#7712)
* Add failing test for list widget with counter-last The failing test appends a value to a list without changing the rest of the list, and the counter-last value doesn't get updated correctly when that happens. Also added another test, which passes, testing removing the last item of the list, just in case of a regression. * Improve unit tests for counter-last list widget bug The unit tests were looking very similar to each other, so I factored out the common code and made them into simple data-driven tests. * Fix bug where counter-last fails in list widget The only scenario that was failing was when counter-last was used, but the list was strictly appended to with no other changes made. The one unit test that was failing now passes with this fix. * Improve bugfix to list widget counter-last Now we only refresh the last item if it was truly necessary.
This commit is contained in:
@@ -225,6 +225,8 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
|
||||
// If we are providing an counter variable then we must refresh the items, otherwise we can rearrange them
|
||||
var hasRefreshed = false,t;
|
||||
if(this.counterName) {
|
||||
var mustRefreshOldLast = false;
|
||||
var oldLength = this.children.length;
|
||||
// Cycle through the list and remove and re-insert the first item that has changed, and all the remaining items
|
||||
for(t=0; t<this.list.length; t++) {
|
||||
if(hasRefreshed || !this.children[t] || this.children[t].parseTreeNode.itemTitle !== this.list[t]) {
|
||||
@@ -232,6 +234,9 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
|
||||
this.removeListItem(t);
|
||||
}
|
||||
this.insertListItem(t,this.list[t]);
|
||||
if(!hasRefreshed && t === oldLength) {
|
||||
mustRefreshOldLast = true;
|
||||
}
|
||||
hasRefreshed = true;
|
||||
} else {
|
||||
// Refresh the item we're reusing
|
||||
@@ -239,6 +244,12 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
|
||||
hasRefreshed = hasRefreshed || refreshed;
|
||||
}
|
||||
}
|
||||
// If items were inserted then we must recreate the item that used to be at the last position as it is no longer last
|
||||
if(mustRefreshOldLast && oldLength > 0) {
|
||||
var oldLastIdx = oldLength-1;
|
||||
this.removeListItem(oldLastIdx);
|
||||
this.insertListItem(oldLastIdx,this.list[oldLastIdx]);
|
||||
}
|
||||
// If there are items to remove and we have not refreshed then recreate the item that will now be at the last position
|
||||
if(!hasRefreshed && this.children.length > this.list.length) {
|
||||
this.removeListItem(this.list.length-1);
|
||||
|
||||
Reference in New Issue
Block a user