LP1818927 Angular admin splash page sorting user/berick/lp1818927-admin-splash-sorting
authorBill Erickson <berickxx@gmail.com>
Fri, 2 Aug 2019 17:18:09 +0000 (13:18 -0400)
committerBill Erickson <berickxx@gmail.com>
Fri, 2 Aug 2019 17:18:11 +0000 (13:18 -0400)
Adds support for a sortKey value that may be applied to a link table
link.  When present, the sortKey is used to group link links together
and indicates where in the overall page the group should be sorted.
Links within each group are subsequently sorted by label.

Non grouped links are sorted solely by label.

Adds a default set of sortKey values to Angular server admin splash
page.

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/eg2/src/app/staff/admin/server/admin-server-splash.component.html
Open-ILS/src/eg2/src/app/staff/share/link-table/link-table.component.ts

index 99cb478..965f790 100644 (file)
@@ -3,45 +3,45 @@
 
 <div class="container">
   <eg-link-table columnCount="3">
-    <eg-link-table-link i18n-label label="Actor Stat Cat Sip Fields"  
-      routerLink="/staff/admin/server/actor/stat_cat_sip_fields"></eg-link-table-link>
     <eg-link-table-link i18n-label label="Age Hold Protect Rules"  
       routerLink="/staff/admin/server/config/rule_age_hold_protect"></eg-link-table-link>
+    <eg-link-table-link i18n-label label="Actor Stat Cat Sip Fields"  
+      routerLink="/staff/admin/server/actor/stat_cat_sip_fields"></eg-link-table-link>
     <eg-link-table-link i18n-label label="Asset Stat Cat Sip Fields"  
       routerLink="/staff/admin/server/asset/stat_cat_sip_fields"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Authority Browse Axes"  
+    <eg-link-table-link i18n-label label="Authority Browse Axes" sortKey="authority"
       routerLink="/staff/admin/server/authority/browse_axis"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Authority Control Sets"  
+    <eg-link-table-link i18n-label label="Authority Control Sets" sortKey="authority"
       routerLink="/staff/admin/server/authority/control_set"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Authority Heading Fields"  
+    <eg-link-table-link i18n-label label="Authority Heading Fields" sortKey="authority"
       routerLink="/staff/admin/server/authority/heading_field"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Authority Thesauri"  
+    <eg-link-table-link i18n-label label="Authority Thesauri" sortKey="authority"
       routerLink="/staff/admin/server/authority/thesaurus"></eg-link-table-link>
     <eg-link-table-link i18n-label label="Best-Hold Selection Sort Order"  
       routerLink="/staff/admin/server/config/best_hold_order"></eg-link-table-link>
     <eg-link-table-link i18n-label label="Billing Types"  
       routerLink="/staff/admin/server/config/billing_type"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Call Number Prefixes"  
+    <eg-link-table-link i18n-label label="Call Number Prefixes" sortKey="callnumber" 
       routerLink="/staff/admin/server/asset/call_number_prefix"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Call Number Suffixes"  
+    <eg-link-table-link i18n-label label="Call Number Suffixes" sortKey="callnumber" 
       routerLink="/staff/admin/server/asset/call_number_suffix"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Circulation Duration Rules"  
+    <eg-link-table-link i18n-label label="Circulation Duration Rules" sortKey="circulation"
       routerLink="/staff/admin/server/config/rule_circ_duration"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Circulation Limit Groups"  
+    <eg-link-table-link i18n-label label="Circulation Limit Groups" sortKey="circulation"
       routerLink="/staff/admin/server/config/circ_limit_group"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Circulation Matchpoint Weights"  
+    <eg-link-table-link i18n-label label="Circulation Matchpoint Weights" sortKey="circulation"
       routerLink="/staff/admin/server/config/circ_matrix_weights"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Circulation Max Fine Rules"  
+    <eg-link-table-link i18n-label label="Circulation Max Fine Rules" sortKey="circulation"
       routerLink="/staff/admin/server/config/rule_max_fine"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Circulation Modifiers"  
+    <eg-link-table-link i18n-label label="Circulation Modifiers" sortKey="circulation"
       routerLink="/staff/admin/server/config/circ_modifier"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Circulation Recurring Fine Rules"  
+    <eg-link-table-link i18n-label label="Circulation Recurring Fine Rules" sortKey="circulation"
       routerLink="/staff/admin/server/config/rule_recurring_fine"></eg-link-table-link>
     <eg-link-table-link i18n-label label="Item Statuses"  
       routerLink="/staff/admin/server/config/copy_status"></eg-link-table-link>
     <eg-link-table-link i18n-label label="Item Tag Types"  
       routerLink="/staff/admin/server/config/copy_tag_type"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Custom Org Unit Trees"  
+    <eg-link-table-link i18n-label label="Org Unit Custom Trees" sortKey="org"
       url="/eg/staff/admin/server/actor/org_unit_custom_tree"></eg-link-table-link>
     <eg-link-table-link i18n-label label="Floating Groups"  
       routerLink="/staff/admin/server/config/floating_group"></eg-link-table-link>
       routerLink="/staff/admin/server/config/hold_matrix_weights"></eg-link-table-link>
     <eg-link-table-link i18n-label label="Import Match Sets"  
       routerLink="/staff/admin/server/vandelay/match_set"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="MARC Coded Value Maps"  
+    <eg-link-table-link i18n-label label="MARC Coded Value Maps" sortKey="marc"
       routerLink="/staff/admin/server/config/coded_value_map"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="MARC Import Remove Fields"  
+    <eg-link-table-link i18n-label label="MARC Import Remove Fields" sortKey="marc"
       routerLink="/staff/admin/server/vandelay/import_bib_trash_group"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="MARC Record Attributes"  
+    <eg-link-table-link i18n-label label="MARC Record Attributes" sortKey="marc"
       routerLink="/staff/admin/server/config/record_attr_definition"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="MARC Search/Facet Class FTS Maps"  
+    <eg-link-table-link i18n-label label="MARC Search/Facet Class FTS Maps" sortKey="marc"
       routerLink="/staff/admin/server/config/metabib_class_ts_map"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="MARC Search/Facet Classes"  
+    <eg-link-table-link i18n-label label="MARC Search/Facet Classes" sortKey="marc"
       routerLink="/staff/admin/server/config/metabib_class"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="MARC Search/Facet Field FTS Maps"  
+    <eg-link-table-link i18n-label label="MARC Search/Facet Field FTS Maps" sortKey="marc"
       routerLink="/staff/admin/server/config/metabib_field_ts_map"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="MARC Search/Facet Fields"  
+    <eg-link-table-link i18n-label label="MARC Search/Facet Fields" sortKey="marc"
       routerLink="/staff/admin/server/config/metabib_field"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="MARC Tag Tables"  
+    <eg-link-table-link i18n-label label="MARC Tag Tables" sortKey="marc"
       routerLink="/staff/admin/server/config/marc_field"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Org Unit Proximity Adjustments"  
+    <eg-link-table-link i18n-label label="Org Unit Proximity Adjustments" sortKey="org"
       routerLink="/staff/admin/server/actor/org_unit_proximity_adjustment"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Organization Types"  
+    <eg-link-table-link i18n-label label="Organization Types" sortKey="org"
       routerLink="/staff/admin/server/actor/org_unit_type"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Org Unit Setting Types"  
+    <eg-link-table-link i18n-label label="Org Unit Setting Types" sortKey="org"
       routerLink="/staff/admin/server/config/org_unit_setting_type"></eg-link-table-link>
-    <eg-link-table-link i18n-label label="Organizational Units"  
+    <eg-link-table-link i18n-label label="Organizational Units" sortKey="org"
       url="/eg/staff/admin/server/legacy/actor/org_unit"></eg-link-table-link>
     <eg-link-table-link i18n-label label="Permission Groups"  
       url="/eg/staff/admin/server/legacy/permission/grp_tree"></eg-link-table-link>
index 9b06c92..2652956 100644 (file)
@@ -4,6 +4,7 @@ interface LinkTableLink {
     label: string;
     url?: string;
     routerLink?: string;
+    sortKey?: string;
 }
 
 @Component({
@@ -25,6 +26,8 @@ export class LinkTableComponent implements AfterViewInit {
     }
 
     ngAfterViewInit() {
+        this.sortLinks();
+
         // table-ize the links
         const rowCount = Math.ceil(this.links.length / this.columnCount);
         this.colWidth = Math.floor(12 / this.columnCount); // Bootstrap 12-grid
@@ -47,6 +50,33 @@ export class LinkTableComponent implements AfterViewInit {
             }
         });
     }
+
+    // Links with sortKeys are first sorted and grouped by sortKey.
+    // Links within each group are then sorted by label.  Ungrouped
+    // links are sorted by label only.
+    sortLinks() {
+        this.links = this.links.sort((a: LinkTableLink, b: LinkTableLink) => {
+            let aVal: string = a.label;
+            let bVal: string = b.label;
+
+            if (a.sortKey) {
+                if (b.sortKey) {
+                    if (b.sortKey === a.sortKey) {
+                        // Sort within groups on label
+                    } else {
+                        aVal = a.sortKey;
+                        bVal = b.sortKey;
+                    }
+                } else {
+                    aVal = a.sortKey;
+                }
+            } else if (b.sortKey) {
+                bVal = b.sortKey;
+            }
+
+            return aVal.toLowerCase() < bVal.toLowerCase() ? -1 : 1;
+        });
+    }
 }
 
 @Component({
@@ -58,6 +88,7 @@ export class LinkTableLinkComponent implements OnInit {
     @Input() label: string;
     @Input() url: string;
     @Input() routerLink: string;
+    @Input() sortKey: string;
 
     constructor(@Host() private linkTable: LinkTableComponent) {}
 
@@ -65,7 +96,8 @@ export class LinkTableLinkComponent implements OnInit {
         this.linkTable.links.push({
             label : this.label,
             url: this.url,
-            routerLink: this.routerLink
+            routerLink: this.routerLink,
+            sortKey: this.sortKey
         });
     }
 }