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