Skip to content
This repository was archived by the owner on Jul 29, 2019. It is now read-only.
27 changes: 27 additions & 0 deletions lib/timeline/component/Group.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ function Group (groupId, data, itemSet) {
this.subgroupIndex = 0;
this.subgroupOrderer = data && data.subgroupOrder;
this.itemSet = itemSet;
this.isVisible = null;

this.dom = {};
this.props = {
Expand Down Expand Up @@ -180,6 +181,8 @@ Group.prototype.redraw = function(range, margin, restack) {
// recalculate the height of the subgroups
this._calculateSubGroupHeights();

this.isVisible = this._isGroupVisible(range);

// reposition visible items vertically
if (typeof this.itemSet.options.order === 'function') {
// a custom order function
Expand Down Expand Up @@ -219,6 +222,10 @@ Group.prototype.redraw = function(range, margin, restack) {
}
}

if (!this.isVisible && this.height) {
return resized = false;
}

// recalculate the height of the group
var height = this._calculateHeight(margin);

Expand Down Expand Up @@ -265,6 +272,17 @@ Group.prototype._calculateSubGroupHeights = function () {
}
};

/**
* check if group is visible
* @private
*/
Group.prototype._isGroupVisible = function (range) {
var isVisible =
(this.top < range.body.domProps.centerContainer.height - range.body.domProps.scrollTop) &&
(this.top + this.height > - range.body.domProps.scrollTop);
return isVisible;
}

/**
* recalculate the height of the group
* @param {{item: {horizontal: number, vertical: number}, axis: number}} margin
Expand Down Expand Up @@ -475,6 +493,15 @@ Group.prototype.order = function() {
Group.prototype._updateVisibleItems = function(orderedItems, oldVisibleItems, range) {
var visibleItems = [];
var visibleItemsLookup = {}; // we keep this to quickly look up if an item already exists in the list without using indexOf on visibleItems

if (!this.isVisible) {
Copy link
Member

@mojoaxel mojoaxel Sep 4, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the problem why examples with no groups are no longer working. Please rethink this lines again.

Copy link
Member Author

@yotamberk yotamberk Sep 4, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I solved it by add equals in the
Group.prototype._isGroupVisible = function (range) { var isVisible = (this.top <= range.body.domProps.centerContainer.height - range.body.domProps.scrollTop) && (this.top + this.height >= - range.body.domProps.scrollTop); return isVisible; }
So that when there are no groups, it will see it as one group with top 0 and we get 0==0 which leads to visible items.
This seems to solve the problem I caused. Examples now work well. Something doesn't sit well with me in this solution...

I think there should be a calculation of the initial group height and it should not be 0. It should calculate the height as if all the groups' items in the horizontal range are visible initially and then remove them if they aren't in the vertical range.
I'm working on a more elegant solution then the one supplied in this merge request.

for (i = 0; i < oldVisibleItems.length; i++) {
item = oldVisibleItems[i];
if (item.displayed) item.hide();
}
return visibleItems;
}

var interval = (range.end - range.start) / 4;
var lowerBound = range.start - interval;
var upperBound = range.end + interval;
Expand Down
10 changes: 8 additions & 2 deletions lib/timeline/component/item/RangeItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,14 @@ RangeItem.prototype.baseClassName = 'vis-item vis-range';
*/
RangeItem.prototype.isVisible = function(range) {
// determine visibility
return (this.data.start < range.end) && (this.data.end > range.start);
};
var isVisible =
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code formatting is broken here. Please check the indent of this function.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've fixed it

// determine horizontal visibillity
(this.data.start < range.end) &&
(this.data.end > range.start) &&
// determine vertical visibillity
(this.parent.top < range.body.domProps.centerContainer.height - range.body.domProps.scrollTop) &&
(this.parent.top + this.parent.height > - range.body.domProps.scrollTop)
return isVisible;};

/**
* Repaint the item
Expand Down