[open-ils-commits] [GIT] Evergreen ILS branch master updated. 32d52c674e6663e319b4f22a4ba46b16a9791de8

Evergreen Git git at git.evergreen-ils.org
Fri Jan 25 12:28:22 EST 2019


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Evergreen ILS".

The branch, master has been updated
       via  32d52c674e6663e319b4f22a4ba46b16a9791de8 (commit)
       via  7ae23c6e8dd126f525a1eae9b5f936274618760f (commit)
       via  e85ce6c10d5b7295bda9821be358cf6ed32bf481 (commit)
       via  5be172fdae30e68e8036a7b066e8b29cbdfbc67b (commit)
       via  b901a7e97d7e7be96aceb8cff3cbec6ac83b6cc6 (commit)
       via  2e60910340c3d7c55685e6421f4749f86092e19c (commit)
       via  6d19d729d6348926ecc31a59c934202bd85fef40 (commit)
       via  0c19eb5c596735ddcd4c9eb1fa0c1b70a050ce6e (commit)
      from  795c2f3c93356059439788e32950e767be343d43 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 32d52c674e6663e319b4f22a4ba46b16a9791de8
Author: Bill Erickson <berickxx at gmail.com>
Date:   Fri Jan 25 12:27:42 2019 -0500

    LP1809288 Angular Booking Admin release notes
    
    Signed-off-by: Bill Erickson <berickxx at gmail.com>

diff --git a/docs/RELEASE_NOTES_NEXT/Client/angular-booking-admin.adoc b/docs/RELEASE_NOTES_NEXT/Client/angular-booking-admin.adoc
new file mode 100644
index 0000000..399ee02
--- /dev/null
+++ b/docs/RELEASE_NOTES_NEXT/Client/angular-booking-admin.adoc
@@ -0,0 +1,7 @@
+Booking Administration Moved To Angular
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The Administration => Booking Administration pages have been ported to
+Angular using the new Angular grids.  Entry points from both AngularJS
+and Angular apps point to the new interfaces.
+

commit 7ae23c6e8dd126f525a1eae9b5f936274618760f
Author: Bill Erickson <berickxx at gmail.com>
Date:   Fri Jan 25 12:10:14 2019 -0500

    LP1809288 Stamping SQL upgrade for booking admin
    
    Signed-off-by: Bill Erickson <berickxx at gmail.com>

diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql
index 0eefd04..c9685b5 100644
--- a/Open-ILS/src/sql/Pg/002.schema.config.sql
+++ b/Open-ILS/src/sql/Pg/002.schema.config.sql
@@ -92,7 +92,7 @@ CREATE TRIGGER no_overlapping_deps
     BEFORE INSERT OR UPDATE ON config.db_patch_dependencies
     FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
 
-INSERT INTO config.upgrade_log (version, applied_to) VALUES ('1142', :eg_version); -- csharp/bshum
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('1143', :eg_version); -- sandbergja/berick
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.data.booking-admin-grid-settings.sql b/Open-ILS/src/sql/Pg/upgrade/1143.data.booking-admin-grid-settings.sql
similarity index 94%
rename from Open-ILS/src/sql/Pg/upgrade/XXXX.data.booking-admin-grid-settings.sql
rename to Open-ILS/src/sql/Pg/upgrade/1143.data.booking-admin-grid-settings.sql
index aad2707..273d83e 100644
--- a/Open-ILS/src/sql/Pg/upgrade/XXXX.data.booking-admin-grid-settings.sql
+++ b/Open-ILS/src/sql/Pg/upgrade/1143.data.booking-admin-grid-settings.sql
@@ -1,6 +1,6 @@
 BEGIN;
 
--- SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+SELECT evergreen.upgrade_deps_block_check('1143', :eg_version);
 
 INSERT into config.workstation_setting_type (name, grp, datatype, label)
 VALUES (

commit e85ce6c10d5b7295bda9821be358cf6ed32bf481
Author: Jane Sandberg <sandbej at linnbenton.edu>
Date:   Fri Jan 4 12:08:08 2019 -0800

    LP1809288: Fix a small javascript error when value is undefined
    
    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
    Signed-off-by: Bill Erickson <berickxx at gmail.com>

diff --git a/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html b/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html
index 233c302..0d7fe1e 100644
--- a/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html
+++ b/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html
@@ -138,9 +138,9 @@
   
             <ng-container *ngIf="field.datatype == 'link'">
               <ng-container *ngIf="field.readOnly">
-                <!-- in readOnly mode, if a value is presetn, it will
+                <!-- in readOnly mode, if a value is present, it will
                     live as the only item in the linkedValues array -->
-                <ng-container *ngIf="field.linkedValues[0]">
+                <ng-container *ngIf="(field.linkedValues != null) && (field.linkedValues.length)">
                   <span>{{field.linkedValues[0].name}}</span>
                 </ng-container>
               </ng-container>

commit 5be172fdae30e68e8036a7b066e8b29cbdfbc67b
Author: Bill Erickson <berickxx at gmail.com>
Date:   Thu Jan 3 10:36:07 2019 -0500

    LP1809288 Avoid booking grid prefix doubling
    
    Teach the booking admin to avoid doubling up the grid prefix, which
    would lead to grid settings with names like eg.grid.booking.booking.*
    
    Signed-off-by: Bill Erickson <berickxx at gmail.com>
    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>

diff --git a/Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts
index 908dadf..84219f1 100644
--- a/Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts
+++ b/Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts
@@ -41,12 +41,15 @@ export class BasicAdminPageComponent implements OnInit {
         }
         const fullTable = schema + '.' + table;
 
-
         // Set the prefix to "server", "local", "workstation",
         // extracted from the URL path.
+        // For admin pages that use none of these, avoid setting
+        // the prefix because that will cause it to double-up.
+        // e.g. eg.grid.acq.acq.cancel_reason
         this.persistKeyPfx = this.route.snapshot.parent.url[0].path;
-        if (this.persistKeyPfx === 'acq') {
-            // ACQ is a special case, becaus unlike 'server', 'local',
+        const selfPrefixers = ['acq', 'booking'];
+        if (selfPrefixers.indexOf(this.persistKeyPfx) > -1) {
+            // ACQ is a special case, because unlike 'server', 'local',
             // 'workstation', the schema ('acq') is the root of the path.
             this.persistKeyPfx = '';
         }
diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
index f0d4a6a..649ced5 100644
--- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql
+++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
@@ -19457,38 +19457,38 @@ VALUES (
 
 INSERT into config.workstation_setting_type (name, grp, datatype, label)
 VALUES (
-    'eg.grid.admin.booking.booking.resource', 'gui', 'object',
+    'eg.grid.admin.booking.resource', 'gui', 'object',
     oils_i18n_gettext (
-        'eg.grid.admin.booking.booking.resource',
-        'Grid Config: admin.booking.booking.resource',
+        'eg.grid.admin.booking.resource',
+        'Grid Config: admin.booking.resource',
         'cwst', 'label'
     )
 ), (
-    'eg.grid.admin.booking.booking.resource_attr', 'gui', 'object',
+    'eg.grid.admin.booking.resource_attr', 'gui', 'object',
     oils_i18n_gettext (
-    'eg.grid.admin.booking.booking.resource_attr',
-        'Grid Config: admin.booking.booking.resource_attr',
+    'eg.grid.admin.booking.resource_attr',
+        'Grid Config: admin.booking.resource_attr',
         'cwst', 'label'
     )
 ), (
-    'eg.grid.admin.booking.booking.resource_attr_map', 'gui', 'object',
+    'eg.grid.admin.booking.resource_attr_map', 'gui', 'object',
     oils_i18n_gettext (
-    'eg.grid.admin.booking.booking.resource_attr_map',
-        'Grid Config: admin.booking.booking.resource_attr_map',
+    'eg.grid.admin.booking.resource_attr_map',
+        'Grid Config: admin.booking.resource_attr_map',
         'cwst', 'label'
     )
 ), (
-    'eg.grid.admin.booking.booking.resource_attr_value', 'gui', 'object',
+    'eg.grid.admin.booking.resource_attr_value', 'gui', 'object',
     oils_i18n_gettext (
-    'eg.grid.admin.booking.booking.resource_attr_value',
-        'Grid Config: admin.booking.booking.resource_attr_value',
+    'eg.grid.admin.booking.resource_attr_value',
+        'Grid Config: admin.booking.resource_attr_value',
         'cwst', 'label'
     )
 ), (
-    'eg.grid.admin.booking.booking.resource_type', 'gui', 'object',
+    'eg.grid.admin.booking.resource_type', 'gui', 'object',
     oils_i18n_gettext (
-    'eg.grid.admin.booking.booking.resource_type',
-        'Grid Config: admin.booking.booking.resource_type',
+    'eg.grid.admin.booking.resource_type',
+        'Grid Config: admin.booking.resource_type',
         'cwst', 'label'
     )
 );
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.data.booking-admin-grid-settings.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.data.booking-admin-grid-settings.sql
index 5f2d5d1..aad2707 100644
--- a/Open-ILS/src/sql/Pg/upgrade/XXXX.data.booking-admin-grid-settings.sql
+++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.data.booking-admin-grid-settings.sql
@@ -4,38 +4,38 @@ BEGIN;
 
 INSERT into config.workstation_setting_type (name, grp, datatype, label)
 VALUES (
-    'eg.grid.admin.booking.booking.resource', 'gui', 'object',
+    'eg.grid.admin.booking.resource', 'gui', 'object',
     oils_i18n_gettext (
-        'eg.grid.admin.booking.booking.resource',
-        'Grid Config: admin.booking.booking.resource',
+        'eg.grid.admin.booking.resource',
+        'Grid Config: admin.booking.resource',
         'cwst', 'label'
     )
 ), (
-    'eg.grid.admin.booking.booking.resource_attr', 'gui', 'object',
+    'eg.grid.admin.booking.resource_attr', 'gui', 'object',
     oils_i18n_gettext (
-    'eg.grid.admin.booking.booking.resource_attr',
-        'Grid Config: admin.booking.booking.resource_attr',
+    'eg.grid.admin.booking.resource_attr',
+        'Grid Config: admin.booking.resource_attr',
         'cwst', 'label'
     )
 ), (
-    'eg.grid.admin.booking.booking.resource_attr_map', 'gui', 'object',
+    'eg.grid.admin.booking.resource_attr_map', 'gui', 'object',
     oils_i18n_gettext (
-    'eg.grid.admin.booking.booking.resource_attr_map',
-        'Grid Config: admin.booking.booking.resource_attr_map',
+    'eg.grid.admin.booking.resource_attr_map',
+        'Grid Config: admin.booking.resource_attr_map',
         'cwst', 'label'
     )
 ), (
-    'eg.grid.admin.booking.booking.resource_attr_value', 'gui', 'object',
+    'eg.grid.admin.booking.resource_attr_value', 'gui', 'object',
     oils_i18n_gettext (
-    'eg.grid.admin.booking.booking.resource_attr_value',
-        'Grid Config: admin.booking.booking.resource_attr_value',
+    'eg.grid.admin.booking.resource_attr_value',
+        'Grid Config: admin.booking.resource_attr_value',
         'cwst', 'label'
     )
 ), (
-    'eg.grid.admin.booking.booking.resource_type', 'gui', 'object',
+    'eg.grid.admin.booking.resource_type', 'gui', 'object',
     oils_i18n_gettext (
-    'eg.grid.admin.booking.booking.resource_type',
-        'Grid Config: admin.booking.booking.resource_type',
+    'eg.grid.admin.booking.resource_type',
+        'Grid Config: admin.booking.resource_type',
         'cwst', 'label'
     )
 );

commit b901a7e97d7e7be96aceb8cff3cbec6ac83b6cc6
Author: Bill Erickson <berickxx at gmail.com>
Date:   Thu Jan 3 10:17:42 2019 -0500

    LP1809288 Angular fm-editor read-only additions
    
    * Add read-only view to org-select
    * FM editor displays read-only values as plain text
    * Mark readOnly checkboxes "disabled"
    * Link fields only fetch linked data when an IDL selector exists
    * Minor code/style changes
    ** Define all class vars before class methods (ng-lint)
    ** Replace some tabs with spaces (ng-lint)
    ** Avoid unnecessary type defs with default values (ng-lint)
    ** More const goodness (ng-lint)
    ** camelCase some vars for consistentcy
    
    Signed-off-by: Bill Erickson <berickxx at gmail.com>
    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>

diff --git a/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html b/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html
index 4aab72d..233c302 100644
--- a/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html
+++ b/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html
@@ -27,28 +27,42 @@
               {{record[field.name]()}}
             </span>
   
-            <input *ngIf="field.datatype == 'id' && pkeyIsEditable"
-              class="form-control"
-              name="{{field.name}}"
-              id="{{idPrefix}}-{{field.name}}"
-              placeholder="{{field.label}}..."
-              i18n-placeholder
-              [readonly]="field.readOnly"
-              [required]="field.isRequired()"
-              [ngModel]="record[field.name]()"
-              (ngModelChange)="record[field.name]($event)"/>
+            <ng-container *ngIf="field.datatype == 'id' && pkeyIsEditable">
+              <ng-container *ngIf="field.readOnly">
+                <span>{{record[field.name]()}}</span>
+              </ng-container>
+              <ng-container *ngIf="!field.readOnly">
+                <input
+                  class="form-control"
+                  name="{{field.name}}"
+                  id="{{idPrefix}}-{{field.name}}"
+                  placeholder="{{field.label}}..."
+                  i18n-placeholder
+                  [required]="field.isRequired()"
+                  [ngModel]="record[field.name]()"
+                  (ngModelChange)="record[field.name]($event)"/>
+              </ng-container>
+            </ng-container>
   
-            <input *ngIf="field.datatype == 'text' || field.datatype == 'interval'"
-              class="form-control"
-              name="{{field.name}}"
-              id="{{idPrefix}}-{{field.name}}"
-              placeholder="{{field.label}}..."
-              i18n-placeholder
-              [readonly]="field.readOnly"
-              [required]="field.isRequired()"
-              [ngModel]="record[field.name]()"
-              (ngModelChange)="record[field.name]($event)"/>
+            <ng-container 
+              *ngIf="field.datatype == 'text' || field.datatype == 'interval'">
+              <ng-container *ngIf="field.readOnly">
+                <span>{{record[field.name]()}}</span>
+              </ng-container>
+              <ng-container *ngIf="!field.readOnly">
+                <input
+                  class="form-control"
+                  name="{{field.name}}"
+                  id="{{idPrefix}}-{{field.name}}"
+                  placeholder="{{field.label}}..."
+                  i18n-placeholder
+                  [required]="field.isRequired()"
+                  [ngModel]="record[field.name]()"
+                  (ngModelChange)="record[field.name]($event)"/>
+              </ng-container>
+            </ng-container>
 
+            <!-- TODO: add support to eg-date-select for read-only view -->
             <span *ngIf="field.datatype == 'timestamp'">
               <eg-date-select
                 domId="{{idPrefix}}-{{field.name}}"
@@ -57,83 +71,101 @@
               </eg-date-select>
             </span>
 
-            <input *ngIf="field.datatype == 'int'"
-              class="form-control"
-              type="number"
-              name="{{field.name}}"
-              id="{{idPrefix}}-{{field.name}}"
-              placeholder="{{field.label}}..."
-              i18n-placeholder
-              [readonly]="field.readOnly"
-              [required]="field.isRequired()"
-              [ngModel]="record[field.name]()"
-              (ngModelChange)="record[field.name]($event)"/>
-  
-            <input *ngIf="field.datatype == 'float'"
-              class="form-control"
-              type="number" step="0.1"
-              name="{{field.name}}"
-              id="{{idPrefix}}-{{field.name}}"
-              placeholder="{{field.label}}..."
-              i18n-placeholder
-              [readonly]="field.readOnly"
-              [required]="field.isRequired()"
-              [ngModel]="record[field.name]()"
-              (ngModelChange)="record[field.name]($event)"/>
-  
-            <span *ngIf="field.datatype == 'money'">
-              <!-- in read-only mode display the local-aware currency -->
-              <input *ngIf="field.readOnly"
-                class="form-control"
-                type="number" step="0.1"
-                name="{{field.name}}"
-                id="{{idPrefix}}-{{field.name}}"
-                [readonly]="field.readOnly"
-                [required]="field.isRequired()"
-                [ngModel]="record[field.name]() | currency"/>
-  
-              <input *ngIf="!field.readOnly"
+            <ng-container *ngIf="field.datatype == 'int'">
+              <ng-container *ngIf="field.readOnly">
+                <span>{{record[field.name]()}}</span>
+              </ng-container>
+              <ng-container *ngIf="!field.readOnly">
+
+              <input
                 class="form-control"
-                type="number" step="0.1"
+                type="number"
                 name="{{field.name}}"
                 id="{{idPrefix}}-{{field.name}}"
                 placeholder="{{field.label}}..."
                 i18n-placeholder
-                [readonly]="field.readOnly"
                 [required]="field.isRequired()"
                 [ngModel]="record[field.name]()"
                 (ngModelChange)="record[field.name]($event)"/>
-            </span>
+              </ng-container>
+            </ng-container>
+
+            <ng-container *ngIf="field.datatype == 'float'">
+              <ng-container *ngIf="field.readOnly">
+                <span>{{record[field.name]()}}</span>
+              </ng-container>
+              <ng-container *ngIf="!field.readOnly">
+                <input
+                  class="form-control"
+                  type="number" step="0.1"
+                  name="{{field.name}}"
+                  id="{{idPrefix}}-{{field.name}}"
+                  placeholder="{{field.label}}..."
+                  i18n-placeholder
+                  [required]="field.isRequired()"
+                  [ngModel]="record[field.name]()"
+                  (ngModelChange)="record[field.name]($event)"/>
+              </ng-container>
+            </ng-container>
+      
+            <ng-container *ngIf="field.datatype == 'money'">
+              <ng-container *ngIf="field.readOnly">
+                <span>{{record[field.name]() | currency}}</span>
+              </ng-container>
+              <ng-container *ngIf="!field.readOnly">
+                <input
+                  class="form-control"
+                  type="number" step="0.1"
+                  name="{{field.name}}"
+                  id="{{idPrefix}}-{{field.name}}"
+                  placeholder="{{field.label}}..."
+                  i18n-placeholder
+                  [readonly]="field.readOnly"
+                  [required]="field.isRequired()"
+                  [ngModel]="record[field.name]()"
+                  (ngModelChange)="record[field.name]($event)"/>
+              </ng-container>
+            </ng-container>
   
             <input *ngIf="field.datatype == 'bool'"
               class="form-check-input"
               type="checkbox"
               name="{{field.name}}"
               id="{{idPrefix}}-{{field.name}}"
-              [readonly]="field.readOnly"
+              [disabled]="field.readOnly"
               [ngModel]="record[field.name]()"
               (ngModelChange)="record[field.name]($event)"/>
   
-            <span *ngIf="field.datatype == 'link'"
-              [ngClass]="{nullable : !field.isRequired()}">
-              <select
-                class="form-control"
-                name="{{field.name}}"
-                id="{{idPrefix}}-{{field.name}}"
-                [disabled]="field.readOnly"
-                [required]="field.isRequired()"
-                [ngModel]="record[field.name]()"
-                (ngModelChange)="record[field.name]($event)">
-                <option *ngFor="let item of field.linkedValues" 
-                  [value]="item.id">{{item.name}}</option>
-              </select>
-            </span>
+            <ng-container *ngIf="field.datatype == 'link'">
+              <ng-container *ngIf="field.readOnly">
+                <!-- in readOnly mode, if a value is presetn, it will
+                    live as the only item in the linkedValues array -->
+                <ng-container *ngIf="field.linkedValues[0]">
+                  <span>{{field.linkedValues[0].name}}</span>
+                </ng-container>
+              </ng-container>
+              <ng-container *ngIf="!field.readOnly">
+                <span [ngClass]="{nullable : !field.isRequired()}">
+                  <select
+                    class="form-control"
+                    name="{{field.name}}"
+                    id="{{idPrefix}}-{{field.name}}"
+                    [required]="field.isRequired()"
+                    [ngModel]="record[field.name]()"
+                    (ngModelChange)="record[field.name]($event)">
+                    <option *ngFor="let item of field.linkedValues" 
+                      [value]="item.id">{{item.name}}</option>
+                  </select>
+                </span>
+              </ng-container>
+            </ng-container>
   
             <eg-org-select *ngIf="field.datatype == 'org_unit'"
               placeholder="{{field.label}}..."
               i18n-placeholder
               domId="{{idPrefix}}-{{field.name}}"
               [limitPerms]="modePerms[mode]"
+              [readOnly]="field.readOnly"
               [applyDefault]="field.orgDefaultAllowed"
               [initialOrgId]="record[field.name]()"
               (onChange)="record[field.name]($event)">
diff --git a/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts b/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts
index 7b90a02..25d0552 100644
--- a/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts
+++ b/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts
@@ -100,6 +100,9 @@ export class FmRecordEditorComponent
     // list of fields on the IDL, since some are hidden, virtual, etc.
     fields: any[];
 
+    // DOM id prefix to prevent id collisions.
+    idPrefix: string;
+
     @Input() editMode(mode: 'create' | 'update' | 'view') {
         this.mode = mode;
     }
@@ -110,8 +113,6 @@ export class FmRecordEditorComponent
         if (id) { this.recId = id; }
     }
 
-    idPrefix: string;
-
     constructor(
       private modal: NgbModal, // required for passing to parent
       private idl: IdlService,
@@ -127,8 +128,8 @@ export class FmRecordEditorComponent
         this.idlDef = this.idl.classes[this.idlClass];
         this.recordLabel = this.idlDef.label;
 
-	// Add some randomness to the generated DOM IDs to ensure against clobbering
-	this.idPrefix = 'fm-editor-' + Math.floor(Math.random() * 100000);
+        // Add some randomness to the generated DOM IDs to ensure against clobbering
+        this.idPrefix = 'fm-editor-' + Math.floor(Math.random() * 100000);
     }
 
     // Opening dialog, fetch data.
@@ -256,16 +257,33 @@ export class FmRecordEditorComponent
                 };
             }
 
-            if (field.datatype === 'link' && field.readOnly) { // no need to fetch all possible values for read-only fields
-                let id_to_fetch = this.record[field.name]();
-                if (id_to_fetch) {
-                    promises.push(
-                        this.pcrud.retrieve(field.class, this.record[field.name]())
-                        .toPromise().then(list => {
-                            field.linkedValues =
-                                this.flattenLinkedValues(field.class, Array(list));
-                        })
-                    );
+            if (field.datatype === 'link' && field.readOnly) {
+
+                // no need to fetch all possible values for read-only fields
+                const idToFetch = this.record[field.name]();
+
+                if (idToFetch) {
+
+                    // If the linked class defines a selector field, fetch the
+                    // linked data so we can display the data within the selector
+                    // field.  Otherwise, avoid the network lookup and let the
+                    // bare value (usually an ID) be displayed.
+                    const idField = this.idl.classes[field.class].pkey;
+                    const selector =
+                        this.idl.classes[field.class].field_map[idField].selector;
+
+                    if (selector && selector !== field.name) {
+                        promises.push(
+                            this.pcrud.retrieve(field.class, this.record[field.name]())
+                            .toPromise().then(list => {
+                                field.linkedValues =
+                                    this.flattenLinkedValues(field.class, Array(list));
+                            })
+                        );
+                    } else {
+                        // No selector, display the raw id/key value.
+                        field.linkedValues = [{id: idToFetch, name: idToFetch}];
+                    }
                 }
             } else if (field.datatype === 'link') {
                 promises.push(
diff --git a/Open-ILS/src/eg2/src/app/share/org-select/org-select.component.html b/Open-ILS/src/eg2/src/app/share/org-select/org-select.component.html
index b032114..d4ffd53 100644
--- a/Open-ILS/src/eg2/src/app/share/org-select/org-select.component.html
+++ b/Open-ILS/src/eg2/src/app/share/org-select/org-select.component.html
@@ -4,15 +4,23 @@
 {{r.label}}
 </ng-template>
 
-<input type="text" 
-  class="form-control"
-  [attr.id]="domId.length ? domId : null"
-  [placeholder]="placeholder"
-  [(ngModel)]="selected" 
-  [ngbTypeahead]="filter"
-  [resultTemplate]="displayTemplate"
-  [inputFormatter]="formatter"
-  (click)="click$.next($event.target.value)"
-  (selectItem)="orgChanged($event)"
-  #instance="ngbTypeahead"
-/>
+<ng-container *ngIf="readOnly">
+  <span>{{selected.label}}</span>
+</ng-container>
+
+<ng-container *ngIf="!readOnly">
+
+  <input type="text" 
+    class="form-control"
+    [attr.id]="domId.length ? domId : null"
+    [placeholder]="placeholder"
+    [(ngModel)]="selected" 
+    [ngbTypeahead]="filter"
+    [resultTemplate]="displayTemplate"
+    [inputFormatter]="formatter"
+    (click)="click$.next($event.target.value)"
+    (selectItem)="orgChanged($event)"
+    #instance="ngbTypeahead"
+  />
+
+</ng-container>
diff --git a/Open-ILS/src/eg2/src/app/share/org-select/org-select.component.ts b/Open-ILS/src/eg2/src/app/share/org-select/org-select.component.ts
index 598a988..25ed2b0 100644
--- a/Open-ILS/src/eg2/src/app/share/org-select/org-select.component.ts
+++ b/Open-ILS/src/eg2/src/app/share/org-select/org-select.component.ts
@@ -54,6 +54,8 @@ export class OrgSelectComponent implements OnInit {
     // An onChange event WILL be generated when a default is applied.
     @Input() applyDefault = false;
 
+    @Input() readOnly = false;
+
     // List of org unit IDs to exclude from the selector
     @Input() set hideOrgs(ids: number[]) {
         if (ids) { this.hidden = ids; }
@@ -153,10 +155,13 @@ export class OrgSelectComponent implements OnInit {
 
     // Format for display in the selector drop-down and input.
     formatForDisplay(org: IdlObject): OrgDisplay {
+        let label = org[this.displayField]();
+        if (!this.readOnly) {
+            label = PAD_SPACE.repeat(org.ou_type().depth()) + label;
+        }
         return {
             id : org.id(),
-            label : PAD_SPACE.repeat(org.ou_type().depth())
-              + org[this.displayField](),
+            label : label,
             disabled : false
         };
     }
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts
index 0427646..908dadf 100644
--- a/Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts
+++ b/Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts
@@ -19,7 +19,7 @@ export class BasicAdminPageComponent implements OnInit {
     idlClass: string;
     classLabel: string;
     persistKeyPfx: string;
-    readonlyFields: string = '';
+    readonlyFields = '';
 
     constructor(
         private route: ActivatedRoute,
@@ -39,7 +39,7 @@ export class BasicAdminPageComponent implements OnInit {
             const data = this.route.snapshot.data[0];
             if (data) { table = data.table; }
         }
-        const full_table = schema + '.' + table;
+        const fullTable = schema + '.' + table;
 
 
         // Set the prefix to "server", "local", "workstation",
@@ -59,14 +59,14 @@ export class BasicAdminPageComponent implements OnInit {
 
         Object.keys(this.idl.classes).forEach(class_ => {
             const classDef = this.idl.classes[class_];
-            if (classDef.table === full_table) {
+            if (classDef.table === fullTable) {
                 this.idlClass = class_;
                 this.classLabel = classDef.label;
             }
         });
 
         if (!this.idlClass) {
-            throw new Error('Unable to find IDL class for table ' + full_table);
+            throw new Error('Unable to find IDL class for table ' + fullTable);
         }
     }
 }

commit 2e60910340c3d7c55685e6421f4749f86092e19c
Author: Jane Sandberg <sandbej at linnbenton.edu>
Date:   Sat Dec 29 16:40:10 2018 -0800

    LP1809288: Make some brt fields read-only
    
    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
    Signed-off-by: Bill Erickson <berickxx at gmail.com>

diff --git a/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts b/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts
index 3ad4892..7b90a02 100644
--- a/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts
+++ b/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts
@@ -256,7 +256,18 @@ export class FmRecordEditorComponent
                 };
             }
 
-            if (field.datatype === 'link') {
+            if (field.datatype === 'link' && field.readOnly) { // no need to fetch all possible values for read-only fields
+                let id_to_fetch = this.record[field.name]();
+                if (id_to_fetch) {
+                    promises.push(
+                        this.pcrud.retrieve(field.class, this.record[field.name]())
+                        .toPromise().then(list => {
+                            field.linkedValues =
+                                this.flattenLinkedValues(field.class, Array(list));
+                        })
+                    );
+                }
+            } else if (field.datatype === 'link') {
                 promises.push(
                     this.pcrud.retrieveAll(field.class, {}, {atomic : true})
                     .toPromise().then(list => {
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts
index 0d6be84..0427646 100644
--- a/Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts
+++ b/Open-ILS/src/eg2/src/app/staff/admin/basic-admin-page.component.ts
@@ -10,7 +10,7 @@ import {IdlService} from '@eg/core/idl.service';
     template: `
       <eg-staff-banner bannerText="{{classLabel}} Configuration" i18n-bannerText>
       </eg-staff-banner>
-      <eg-admin-page persistKeyPfx="{{persistKeyPfx}}" idlClass="{{idlClass}}"></eg-admin-page>
+      <eg-admin-page persistKeyPfx="{{persistKeyPfx}}" idlClass="{{idlClass}}" readonlyFields="{{readonlyFields}}"></eg-admin-page>
     `
 })
 
@@ -19,6 +19,7 @@ export class BasicAdminPageComponent implements OnInit {
     idlClass: string;
     classLabel: string;
     persistKeyPfx: string;
+    readonlyFields: string = '';
 
     constructor(
         private route: ActivatedRoute,
@@ -33,7 +34,13 @@ export class BasicAdminPageComponent implements OnInit {
             const data = this.route.snapshot.data[0];
             if (data) { schema = data.schema; }
         }
-        const table = schema + '.' + this.route.snapshot.paramMap.get('table');
+        let table = this.route.snapshot.paramMap.get('table');
+        if (!table) {
+            const data = this.route.snapshot.data[0];
+            if (data) { table = data.table; }
+        }
+        const full_table = schema + '.' + table;
+
 
         // Set the prefix to "server", "local", "workstation",
         // extracted from the URL path.
@@ -44,16 +51,22 @@ export class BasicAdminPageComponent implements OnInit {
             this.persistKeyPfx = '';
         }
 
+        // Pass the readonlyFields param if available
+        if (this.route.snapshot.data[0].readonlyFields) {
+            this.readonlyFields = this.route.snapshot.data[0].readonlyFields;
+        }
+
+
         Object.keys(this.idl.classes).forEach(class_ => {
             const classDef = this.idl.classes[class_];
-            if (classDef.table === table) {
+            if (classDef.table === full_table) {
                 this.idlClass = class_;
                 this.classLabel = classDef.label;
             }
         });
 
         if (!this.idlClass) {
-            throw new Error('Unable to find IDL class for table ' + table);
+            throw new Error('Unable to find IDL class for table ' + full_table);
         }
     }
 }
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/booking/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/booking/routing.module.ts
index 1cbf480..cb5ef9e 100644
--- a/Open-ILS/src/eg2/src/app/staff/admin/booking/routing.module.ts
+++ b/Open-ILS/src/eg2/src/app/staff/admin/booking/routing.module.ts
@@ -7,6 +7,10 @@ const routes: Routes = [{
     path: 'splash',
     component: AdminBookingSplashComponent
 }, {
+    path: 'resource_type',
+    component: BasicAdminPageComponent,
+    data: [{schema: 'booking', table: 'resource_type', readonlyFields: 'catalog_item,record'}]
+}, {
     path: ':table',
     component: BasicAdminPageComponent,
     // All booking admin pages cover data in the booking.* schema.  No need to
diff --git a/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html b/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html
index 194f06b..0fc5c44 100644
--- a/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html
+++ b/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html
@@ -53,7 +53,7 @@
   </eg-grid-toolbar-action>
 </eg-grid>
 
-<eg-fm-record-editor #editDialog idlClass="{{idlClass}}">
+<eg-fm-record-editor #editDialog idlClass="{{idlClass}}" readonlyFields="{{readonlyFields}}">
 </eg-fm-record-editor>
 
 
diff --git a/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts b/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts
index be4452b..80fd2fd 100644
--- a/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts
+++ b/Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts
@@ -62,6 +62,9 @@ export class AdminPageComponent implements OnInit {
     // 'eg.grid.admin.${persistKeyPfx}.config.billing_type'
     @Input() persistKeyPfx: string;
 
+    // Optional comma-separated list of read-only fields
+    @Input() readonlyFields: string;
+
     @ViewChild('grid') grid: GridComponent;
     @ViewChild('editDialog') editDialog: FmRecordEditorComponent;
     @ViewChild('successString') successString: StringComponent;

commit 6d19d729d6348926ecc31a59c934202bd85fef40
Author: Jane Sandberg <sandbej at linnbenton.edu>
Date:   Sat Dec 29 15:17:02 2018 -0800

    LP1809288: Add workstation grid settings for booking admin
    
    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
    Signed-off-by: Bill Erickson <berickxx at gmail.com>

diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
index e83dc04..f0d4a6a 100644
--- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql
+++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
@@ -19455,5 +19455,43 @@ VALUES (
 );
 
 
+INSERT into config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.grid.admin.booking.booking.resource', 'gui', 'object',
+    oils_i18n_gettext (
+        'eg.grid.admin.booking.booking.resource',
+        'Grid Config: admin.booking.booking.resource',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.booking.booking.resource_attr', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.booking.booking.resource_attr',
+        'Grid Config: admin.booking.booking.resource_attr',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.booking.booking.resource_attr_map', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.booking.booking.resource_attr_map',
+        'Grid Config: admin.booking.booking.resource_attr_map',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.booking.booking.resource_attr_value', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.booking.booking.resource_attr_value',
+        'Grid Config: admin.booking.booking.resource_attr_value',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.booking.booking.resource_type', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.booking.booking.resource_type',
+        'Grid Config: admin.booking.booking.resource_type',
+        'cwst', 'label'
+    )
+);
+
 
 
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.data.booking-admin-grid-settings.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.data.booking-admin-grid-settings.sql
new file mode 100644
index 0000000..5f2d5d1
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.data.booking-admin-grid-settings.sql
@@ -0,0 +1,43 @@
+BEGIN;
+
+-- SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+
+INSERT into config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.grid.admin.booking.booking.resource', 'gui', 'object',
+    oils_i18n_gettext (
+        'eg.grid.admin.booking.booking.resource',
+        'Grid Config: admin.booking.booking.resource',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.booking.booking.resource_attr', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.booking.booking.resource_attr',
+        'Grid Config: admin.booking.booking.resource_attr',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.booking.booking.resource_attr_map', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.booking.booking.resource_attr_map',
+        'Grid Config: admin.booking.booking.resource_attr_map',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.booking.booking.resource_attr_value', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.booking.booking.resource_attr_value',
+        'Grid Config: admin.booking.booking.resource_attr_value',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.booking.booking.resource_type', 'gui', 'object',
+    oils_i18n_gettext (
+    'eg.grid.admin.booking.booking.resource_type',
+        'Grid Config: admin.booking.booking.resource_type',
+        'cwst', 'label'
+    )
+);
+
+COMMIT;

commit 0c19eb5c596735ddcd4c9eb1fa0c1b70a050ce6e
Author: Jane Sandberg <sandbej at linnbenton.edu>
Date:   Thu Dec 20 11:39:03 2018 -0600

    LP1809288: Port Booking Admin to Angular
    
    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
    Signed-off-by: Bill Erickson <berickxx at gmail.com>

diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml
index 1be2c88..d541e5f 100644
--- a/Open-ILS/examples/fm_IDL.xml
+++ b/Open-ILS/examples/fm_IDL.xml
@@ -4932,11 +4932,11 @@ SELECT  usr,
 	<class id="brt" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="booking::resource_type" oils_persist:tablename="booking.resource_type" reporter:label="Resource Type">
 		<fields oils_persist:primary="id" oils_persist:sequence="booking.resource_type_id_seq">
 			<field reporter:label="Resource Type ID" name="id" reporter:datatype="id" reporter:selector="name"/>
-			<field reporter:label="Resource Type Name" name="name" reporter:datatype="text"/>
+			<field reporter:label="Resource Type Name" name="name" reporter:datatype="text" oils_obj:required="true"/>
 			<field reporter:label="Fine Interval" name="fine_interval" reporter:datatype="interval"/>
 			<field reporter:label="Fine Amount" name="fine_amount" reporter:datatype="money"/>
 			<field reporter:label="Max Fine Amount" name="max_fine" reporter:datatype="money"/>
-			<field reporter:label="Owning Library" name="owner" reporter:datatype="org_unit"/>
+			<field reporter:label="Owning Library" name="owner" reporter:datatype="org_unit" oils_obj:required="true"/>
 			<field reporter:label="Catalog Item" name="catalog_item" reporter:datatype="bool"/>
 			<field reporter:label="Bibliographic Record" name="record" reporter:datatype="link"/>
 			<field reporter:label="Transferable" name="transferable" reporter:datatype="bool"/>
@@ -4965,10 +4965,10 @@ SELECT  usr,
 	<class id="brsrc" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="booking::resource" oils_persist:tablename="booking.resource" reporter:label="Resource">
 		<fields oils_persist:primary="id" oils_persist:sequence="booking.resource_id_seq">
 			<field reporter:label="Resource ID" name="id" reporter:datatype="id" reporter:selector="barcode" />
-			<field reporter:label="Owning Library" name="owner" reporter:datatype="org_unit"/>
-			<field reporter:label="Resource Type" name="type" reporter:datatype="link"/>
+			<field reporter:label="Owning Library" name="owner" reporter:datatype="org_unit" oils_obj:required="true"/>
+			<field reporter:label="Resource Type" name="type" reporter:datatype="link" oils_obj:required="true"/>
 			<field reporter:label="Overbook" name="overbook" reporter:datatype="bool"/>
-			<field reporter:label="Barcode" name="barcode" reporter:datatype="text"/>
+			<field reporter:label="Barcode" name="barcode" reporter:datatype="text" oils_obj:required="true"/>
 			<field reporter:label="Is Deposit Required" name="deposit" reporter:datatype="bool"/>
 			<field reporter:label="Deposit Amount" name="deposit_amount" reporter:datatype="money"/>
 			<field reporter:label="User Fee" name="user_fee" reporter:datatype="money"/>
@@ -4997,8 +4997,8 @@ SELECT  usr,
 	<class id="bra" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="booking::resource_attr" oils_persist:tablename="booking.resource_attr" reporter:label="Resource Attribute">
 		<fields oils_persist:primary="id" oils_persist:sequence="booking.resource_attr_id_seq">
 			<field reporter:label="Resource Attribute ID" name="id" reporter:datatype="id" reporter:selector="name" />
-			<field reporter:label="Owning Library" name="owner" reporter:datatype="org_unit"/>
-			<field reporter:label="Resource Attribute Name" name="name" reporter:datatype="text"/>
+			<field reporter:label="Owning Library" name="owner" reporter:datatype="org_unit" oils_obj:required="true"/>
+			<field reporter:label="Resource Attribute Name" name="name" reporter:datatype="text" oils_obj:required="true"/>
 			<field reporter:label="Resource Type" name="resource_type" reporter:datatype="link"/>
 			<field reporter:label="Is Required" name="required" reporter:datatype="bool"/>
 			<field reporter:label="Valid Values" name="valid_values" oils_persist:virtual="true" reporter:datatype="link"/>
@@ -5023,9 +5023,9 @@ SELECT  usr,
 	<class id="brav" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="booking::resource_attr_value" oils_persist:tablename="booking.resource_attr_value" reporter:label="Resource Attribute Value">
 		<fields oils_persist:primary="id" oils_persist:sequence="booking.resource_attr_value_id_seq">
 			<field reporter:label="Resource Attribute Value ID" name="id" reporter:datatype="id" reporter:selector="valid_value" />
-			<field reporter:label="Owning Library" name="owner" reporter:datatype="org_unit"/>
-			<field reporter:label="Resource Attribute" name="attr" reporter:datatype="link"/>
-			<field reporter:label="Valid Value" name="valid_value" reporter:datatype="text"/>
+			<field reporter:label="Owning Library" name="owner" reporter:datatype="org_unit" oils_obj:required="true"/>
+			<field reporter:label="Resource Attribute" name="attr" reporter:datatype="link" oils_obj:required="true"/>
+			<field reporter:label="Valid Value" name="valid_value" reporter:datatype="text" oils_obj:required="true"/>
 			<field reporter:label="Resource Attribute Maps" name="attr_maps" oils_persist:virtual="true" reporter:datatype="link"/>
 			<field reporter:label="Resource Attribute Value Maps" name="attr_val_maps" oils_persist:virtual="true" reporter:datatype="link"/>
 		</fields>
@@ -5048,9 +5048,9 @@ SELECT  usr,
 	<class id="bram" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="booking::resource_attr_map" oils_persist:tablename="booking.resource_attr_map" reporter:label="Resource Attribute Map">
 		<fields oils_persist:primary="id" oils_persist:sequence="booking.resource_attr_map_id_seq">
 			<field reporter:label="Resource Attribute Map ID" name="id" reporter:datatype="id"/>
-			<field reporter:label="Resource" name="resource" reporter:datatype="link"/>
-			<field reporter:label="Resource Attribute" name="resource_attr" reporter:datatype="link"/>
-			<field reporter:label="Attribute Value" name="value" reporter:datatype="link"/>
+			<field reporter:label="Resource" name="resource" reporter:datatype="link" oils_obj:required="true"/>
+			<field reporter:label="Resource Attribute" name="resource_attr" reporter:datatype="link" oils_obj:required="true"/>
+			<field reporter:label="Attribute Value" name="value" reporter:datatype="link" oils_obj:required="true"/>
 		</fields>
 		<links>
 			<link field="resource" reltype="has_a" key="id" map="" class="brsrc"/>
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/booking/admin-booking-splash.component.html b/Open-ILS/src/eg2/src/app/staff/admin/booking/admin-booking-splash.component.html
new file mode 100644
index 0000000..e33da8e
--- /dev/null
+++ b/Open-ILS/src/eg2/src/app/staff/admin/booking/admin-booking-splash.component.html
@@ -0,0 +1,18 @@
+<eg-staff-banner bannerText="Booking Administration" i18n-bannerText>
+</eg-staff-banner>
+
+<div class="container">
+  <eg-link-table columnCount="3">
+    <eg-link-table-link i18n-label label="Resources"
+      routerLink="/staff/admin/booking/resource"></eg-link-table-link>
+    <eg-link-table-link i18n-label label="Resource Attributes"
+      routerLink="/staff/admin/booking/resource_attr"></eg-link-table-link>
+    <eg-link-table-link i18n-label label="Resource Attribute Maps"
+      routerLink="/staff/admin/booking/resource_attr_map"></eg-link-table-link>
+    <eg-link-table-link i18n-label label="Resource Attribute Values"
+      routerLink="/staff/admin/booking/resource_attr_value"></eg-link-table-link>
+    <eg-link-table-link i18n-label label="Resource Types"
+      routerLink="/staff/admin/booking/resource_type"></eg-link-table-link>
+  </eg-link-table>
+</div>
+
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/booking/admin-booking-splash.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/booking/admin-booking-splash.component.ts
new file mode 100644
index 0000000..e6be070
--- /dev/null
+++ b/Open-ILS/src/eg2/src/app/staff/admin/booking/admin-booking-splash.component.ts
@@ -0,0 +1,11 @@
+import {Component, Input, ViewChildren,
+    AfterViewInit, QueryList} from '@angular/core';
+
+ at Component({
+    templateUrl: './admin-booking-splash.component.html'
+})
+
+export class AdminBookingSplashComponent {
+}
+
+
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/booking/admin-booking.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/booking/admin-booking.module.ts
new file mode 100644
index 0000000..b6ea6e1
--- /dev/null
+++ b/Open-ILS/src/eg2/src/app/staff/admin/booking/admin-booking.module.ts
@@ -0,0 +1,24 @@
+import {NgModule} from '@angular/core';
+import {StaffCommonModule} from '@eg/staff/common.module';
+import {AdminBookingRoutingModule} from './routing.module';
+import {AdminCommonModule} from '@eg/staff/admin/common.module';
+import {AdminBookingSplashComponent} from './admin-booking-splash.component';
+
+ at NgModule({
+  declarations: [
+      AdminBookingSplashComponent
+  ],
+  imports: [
+    AdminCommonModule,
+    AdminBookingRoutingModule
+  ],
+  exports: [
+  ],
+  providers: [
+  ]
+})
+
+export class AdminBookingModule {
+}
+
+
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/booking/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/booking/routing.module.ts
new file mode 100644
index 0000000..1cbf480
--- /dev/null
+++ b/Open-ILS/src/eg2/src/app/staff/admin/booking/routing.module.ts
@@ -0,0 +1,22 @@
+import {NgModule} from '@angular/core';
+import {RouterModule, Routes} from '@angular/router';
+import {AdminBookingSplashComponent} from './admin-booking-splash.component';
+import {BasicAdminPageComponent} from '@eg/staff/admin/basic-admin-page.component';
+
+const routes: Routes = [{
+    path: 'splash',
+    component: AdminBookingSplashComponent
+}, {
+    path: ':table',
+    component: BasicAdminPageComponent,
+    // All booking admin pages cover data in the booking.* schema.  No need to
+    // duplicate it within the URL path.  Pass it manually instead.
+    data: [{schema: 'booking'}]
+}];
+
+ at NgModule({
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule]
+})
+
+export class AdminBookingRoutingModule {}
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/routing.module.ts
index a93f9ee..29df72c 100644
--- a/Open-ILS/src/eg2/src/app/staff/admin/routing.module.ts
+++ b/Open-ILS/src/eg2/src/app/staff/admin/routing.module.ts
@@ -12,6 +12,9 @@ const routes: Routes = [{
   }, {
     path: 'acq',
     loadChildren: '@eg/staff/admin/acq/admin-acq.module#AdminAcqModule'
+  }, {
+    path: 'booking',
+    loadChildren: '@eg/staff/admin/booking/admin-booking.module#AdminBookingModule'
   }]
 }];
 
diff --git a/Open-ILS/src/eg2/src/app/staff/nav.component.html b/Open-ILS/src/eg2/src/app/staff/nav.component.html
index feed30b..7c30c00 100644
--- a/Open-ILS/src/eg2/src/app/staff/nav.component.html
+++ b/Open-ILS/src/eg2/src/app/staff/nav.component.html
@@ -360,7 +360,8 @@
             <span class="material-icons">layers</span>
             <span i18n>Serials Administration</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/admin/booking/index">
+          <a class="dropdown-item"
+              routerLink="/staff/admin/booking/splash">
             <span class="material-icons">business_center</span>
             <span i18n>Booking Administration</span>
           </a>
diff --git a/Open-ILS/src/templates/staff/navbar.tt2 b/Open-ILS/src/templates/staff/navbar.tt2
index d82ca1f..1ca59d5 100644
--- a/Open-ILS/src/templates/staff/navbar.tt2
+++ b/Open-ILS/src/templates/staff/navbar.tt2
@@ -508,7 +508,7 @@
             </a>
           </li>
           <li>
-            <a href="./admin/booking/index" target="_self">
+            <a href="/eg2/staff/admin/booking/splash" target="_self">
               <span class="glyphicon glyphicon-calendar"></span>
               [% l('Booking Administration') %]
             </a>

-----------------------------------------------------------------------

Summary of changes:
 Open-ILS/examples/fm_IDL.xml                       |   26 ++--
 .../app/share/fm-editor/fm-editor.component.html   |  180 ++++++++++++--------
 .../src/app/share/fm-editor/fm-editor.component.ts |   39 ++++-
 .../app/share/org-select/org-select.component.html |   32 +++--
 .../app/share/org-select/org-select.component.ts   |    9 +-
 .../app/staff/admin/basic-admin-page.component.ts  |   28 +++-
 .../booking/admin-booking-splash.component.html    |   18 ++
 .../admin-booking-splash.component.ts}             |    4 +-
 .../admin-booking.module.ts}                       |   10 +-
 .../staff/admin/{acq => booking}/routing.module.ts |   14 +-
 .../src/eg2/src/app/staff/admin/routing.module.ts  |    3 +
 Open-ILS/src/eg2/src/app/staff/nav.component.html  |    3 +-
 .../share/admin-page/admin-page.component.html     |    2 +-
 .../staff/share/admin-page/admin-page.component.ts |    3 +
 Open-ILS/src/sql/Pg/002.schema.config.sql          |    2 +-
 Open-ILS/src/sql/Pg/950.data.seed-values.sql       |   38 ++++
 .../1143.data.booking-admin-grid-settings.sql      |   43 +++++
 Open-ILS/src/templates/staff/navbar.tt2            |    2 +-
 .../Client/angular-booking-admin.adoc              |    7 +
 19 files changed, 335 insertions(+), 128 deletions(-)
 create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/booking/admin-booking-splash.component.html
 copy Open-ILS/src/eg2/src/app/staff/admin/{acq/admin-acq-splash.component.ts => booking/admin-booking-splash.component.ts} (53%)
 copy Open-ILS/src/eg2/src/app/staff/admin/{server/admin-server.module.ts => booking/admin-booking.module.ts} (54%)
 copy Open-ILS/src/eg2/src/app/staff/admin/{acq => booking}/routing.module.ts (50%)
 create mode 100644 Open-ILS/src/sql/Pg/upgrade/1143.data.booking-admin-grid-settings.sql
 create mode 100644 docs/RELEASE_NOTES_NEXT/Client/angular-booking-admin.adoc


hooks/post-receive
-- 
Evergreen ILS


More information about the open-ils-commits mailing list