LP1857350 Org selector sorts by display value
authorBill Erickson <berickxx@gmail.com>
Thu, 26 Dec 2019 18:18:26 +0000 (13:18 -0500)
committerBill Erickson <berickxx@gmail.com>
Mon, 30 Dec 2019 15:09:41 +0000 (10:09 -0500)
When displaying the org unit selector, sort each set of children by the
display label (defaults to shortname).

Fixes issues with the org server sortTree function and adds a unit test
to test the repaired sort function.

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Open-ILS/src/eg2/src/app/core/org.service.ts
Open-ILS/src/eg2/src/app/core/org.spec.ts
Open-ILS/src/eg2/src/app/share/org-select/org-select.component.ts
Open-ILS/src/eg2/src/test_data/eg_mock.js

index 6615851..2a2a59d 100644 (file)
@@ -161,11 +161,11 @@ export class OrgService {
         if (!sortField) { sortField = 'shortname'; }
         if (!node) { node = this.orgTree; }
         node.children(
-            node.children.sort((a, b) => {
+            node.children().sort((a, b) => {
                 return a[sortField]() < b[sortField]() ? -1 : 1;
             })
         );
-        node.children.forEach(n => this.sortTree(n));
+        node.children().forEach(n => this.sortTree(sortField, n));
     }
 
     absorbTree(node?: IdlObject): void {
index 90c5ac5..9ebb028 100644 (file)
@@ -64,6 +64,12 @@ describe('OrgService', () => {
         expect(orgService.root().id()).toEqual(1);
     });
 
+    it('should sort tree by shortname', () => {
+        initTestData();
+        orgService.sortTree('shortname');
+        expect(orgService.root().children()[0].shortname()).toEqual('A');
+    });
+
 });
 
 
index 4a72301..7db87e9 100644 (file)
@@ -110,6 +110,8 @@ export class OrgSelectComponent implements OnInit {
         return this.org.get(this.selected.id);
     }
 
+    sortedOrgs: IdlObject[] = [];
+
     constructor(
       private auth: AuthService,
       private store: StoreService,
@@ -119,6 +121,14 @@ export class OrgSelectComponent implements OnInit {
 
     ngOnInit() {
 
+        // Sort the tree and reabsorb to propagate the sorted nodes to the
+        // org.list() used by this component.
+        this.org.sortTree(this.displayField);
+        this.org.absorbTree();
+        // Maintain our own copy of the org list in case the org service
+        // is sorted in a different manner by other parts of the code.
+        this.sortedOrgs = this.org.list();
+
         // Apply a default org unit if desired and possible.
         if (!this.startOrg && this.applyDefault && this.auth.user()) {
             // note: ws_ou defaults to home_ou on the server
@@ -201,7 +211,7 @@ export class OrgSelectComponent implements OnInit {
             ),
             map(term => {
 
-                let orgs = this.org.list().filter(org =>
+                let orgs = this.sortedOrgs.filter(org =>
                     this.hidden.filter(id => org.id() === id).length === 0
                 );
 
index 3db3579..d0588f5 100644 (file)
@@ -30,11 +30,13 @@ window._eg_mock_data = {
         org2.id(2); 
         org2.parent_ou(1);
         org2.ou_type(type2);
+        org2.shortname('B'); // to test sorting
 
         var org3 = idlService.create('aou'); 
         org3.id(3); 
         org3.parent_ou(1);
         org3.ou_type(type2);
+        org3.shortname('A'); // to test sorting
 
         var org4 = idlService.create('aou'); 
         org4.id(4);