I have organized this better into a complete self-contained class with static data bound to a datasource.
Here is the grid/datasource code. Attached is the json data file. When you run it you can see the ordering sent to the console & the normalizer is returning things in the correct orders, but the sorting does not reflect what the normalizer is returning.
	
		
							
						
					Here is the grid/datasource code. Attached is the json data file. When you run it you can see the ordering sent to the console & the normalizer is returning things in the correct orders, but the sorting does not reflect what the normalizer is returning.
Code:
	
	isc.PositionGrid = isc.defineClass("PositionGrid", isc.TreeGrid);
	
isc.DataSource.create({
	ID:"positionAccountDS",
	dataFormat:"json",
	dataURL:"./positionData.js",
	fields:[
		{ hidden:"true", name:"key", primaryKey:true, type:"text" },
		{ hidden:"true", name:"isOpen", type:"boolean" },
		{ hidden:"true", name:"containedIn", type:"text", foreignKey:"positionAccountDS.key" },
		{ title:"Name", name:"sec_name", type:"text", required:"true" },
		{ title:"Cur %", name:"amt_percent", type:"float" }
	]
});
		
var gridFields = [
	{ name:"sec_name", width: 300, treeField:true },
	{ name:"amt_percent", width: 100 }
];
		
for (var i = 0; i < gridFields.length; i++) {
	if (isc.isA.Object(gridFields[i]) && (gridFields[i] != null)) {
		gridFields[i].sortNormalizer = function(record, fieldName, grid) {
			return grid.sortNormalizer(record, fieldName);
		};
	}
}
			
isc.PositionGrid.addProperties({
	width: 500,
	height: 300,
	canEdit: false,
	canSort: true,
	loadDataOnDemand: false,
	groupStartOpen:"all",
	position: "relative",
	alternateRecordStyles: true,
	showAllRecords: true,
	autoFetchData: false,
	useSortIndexesInNormalizer: true,
	sortIndexes: []
});
		
isc.PositionGrid.addMethods({
	sortNormalizer: function(record, fieldName) {	
		console.log("sortNormalizer(" + record['name'] + ", " + fieldName + ") = " + this.sortIndexes[record.key]);
		return this.useSortIndexesInNormalizer ? this.sortIndexes[record.key] : record[fieldName];
	},
			
	setSort: function(sortSpecifiers) {
		this.recomputeSortIndexes(sortSpecifiers);		
		
		return this.Super("setSort", arguments);
	},
	
	recomputeSortIndexes: function(sortSpecifiers) {
		if ((this.data) && (this.data != null) && isc.isA.Tree(this.data)) {			
			// 1st re-initialize the sort indexes
			this.sortIndexes = [];
			this.sortIndexesByName = [];
				
			// Now process the tree
			var currentIndexObj = { currentIndex: 0 };
			this.useSortIndexesInNormalizer = false;
			this.computeSortIndexes(this.data.getRoot(), currentIndexObj, sortSpecifiers);
			this.useSortIndexesInNormalizer = true;
			this.sortIndexes.setLength(currentIndexObj.currentIndex);
					
			console.log(this.sortIndexesByName.valueOf());
		}
	},
	
	computeSortIndexes: function(node, currentIndexObj, sortSpecifiers) {
		if (node && (node != null)) {			
			if (this.data.getLevel(node) <= 2) {
				// 	This is a level above what we want sorted, so just add it as-is (if its not the tree's root),
				// then go onto any children, if any
				
				if (!this.data.isRoot(node)) {
					// This isn't the root of the tree. The actual root node of the tree we don't show. It's just a dummy row
					this.sortIndexes[node.key] = currentIndexObj.currentIndex++;
					this.sortIndexesByName.push(node.name);
				}
					
				if (!this.data.isLeaf(node)) {
					// This node is not a leaf, so get the children & call ourselves for each child
					var children = this.data.getChildren(node);
						
					if ((children != null) && isc.isA.Array(children)) {
						for (var i = 0; i < children.length; i++) {		
							this.computeSortIndexes(children[i], currentIndexObj, sortSpecifiers);
						}
					}
				}
			}
			else if ((typeof this.sortIndexes[node.key] == "undefined") || (this.sortIndexes[node.key] == null)) {
				// We're at a level where we want to sort & the node has not already been added to the sortIndexes
				// So get our parent and then perform the sort on the paren't direct children
				// Then map the results to the sort indexes
				var parent = this.data.getParent(node);
					
				if (parent != null) {
					var parentsChildren = this.data.getChildren(parent);
						
					if ((parentsChildren != null) && isc.isA.Array(parentsChildren)) {
						var arrayToSort = [];
						arrayToSort.addList(parentsChildren); // Don't want to modify the actual array
						arrayToSort.setSort(sortSpecifiers);
							
						// Now that its sorted, we'll walk it and add them to the sort indexes
						for (var i = 0; i < arrayToSort.length; i++) {
							this.sortIndexes[arrayToSort[i].key] = currentIndexObj.currentIndex++;
							this.sortIndexesByName.push(arrayToSort[i].name);
								
							if (!this.data.isLeaf(arrayToSort[i])) {
								var children = this.data.getChildren(arrayToSort[i]);
									
								if ((children != null) && isc.isA.Array(children)) {
									for (var j = 0; j < children.length; j++) {
										this.computeSortIndexes(children[j], currentIndexObj, sortSpecifiers);
									}
								}
							}
						}					
					}
				}
			}
		}
	}
});
	
isc.PositionGrid.create({
	ID: "positions",
	dataSource: "positionAccountDS",
	fields: gridFields	
});
		
positions.fetchData(null, 'positions.data.openAll()');
Comment