SitePen/dgrid

(ColumnSet +) CompoundColumns_findSortArrowParent(field) fails to find parent out of the 1st column set

claudeG opened this issue · 0 comments

Hello !
We worked with Dgrid-0.3 plus an integration layer for several years and I am currently preparing the upgrade to the lastest Dgrid.

I have the case of an OnDemandGrid that results from declare([MyOnDemanGrid, ColumnHider, ColumnResizer, CompoundColumns, ColumnSet, Keyboard, Editor, DijitRegistry], {...})
where MyOnDemanGrid results from declare([OnDemandGrid, Selector, MouseOverEvents, ProgressDialog], {...}).

This grid instance holds 2 sets of columns. In boths sets, columns may be sortable or not.
When the header of a sortable column is clicked, the sort arrow must update.
In our case, the retrieval of the sort arrow node relies on CompoundColumns_findSortArrowParent(field) because the "this._sortNode" is null.

The issue I encounter :
When I click the header label from the second column set, such a node is not found. Debugging CompoundColumns_findSortArrowParent(field),

	_findSortArrowParent: function () {
		var parent = this.inherited(arguments),
			spacerRow = query('.dgrid-spacer-row', this.headerNode)[0],
			columnId,
			nodes;

		if (parent && spacerRow.contains(parent)) {
			columnId = parent.columnId;
			nodes = query('.dgrid-column-' + columnId, this.headerNode);
			return nodes[nodes.length - 1];
		}
	}

I noted that the node search is constrained by spacerRow.contains(parent) where spacerRow is the 1st '.dgrid-spacer-row' element. But our case fails because 'parent' belongs to the 2nd spacerRow. PROBLEM.

The way I solved this issue temporary:

lang.extend(CompoundColumns, {
	_findSortArrowParent: function(field) {
		// dgrid/CompoundColumns searches for 'parent' in the first '.dgrid-spacer-row' element only
		// while it exists as many '.dgrid-spacer-row' elements as compound column sets
		var parent = this.inherited("_findSortArrowParent", arguments); // Grid
		if (parent) {
			var allSpacerRows = query('.dgrid-spacer-row', this.headerNode);
			var someSpacerRowContainsParent = allSpacerRows.some(function(row) {
				return row.contains(parent);
			});
			if(someSpacerRowContainsParent) {
				var columnId = parent.columnId;
				var nodes = query('.dgrid-column-' + columnId, this.headerNode);
				return nodes[nodes.length - 1];						
			}
		}
	}
});

One more issue (I did not try to correct it) : The presence of a given data column should not be required to be unique in a grid. Sorting any column instance should be reflected on the sort icon of each of its "clones".

Thanks for your attention.

Claude