account for staff users who do not have the ADMIN_PROVIDER permission
authorGalen Charlton <gmc@equinoxinitiative.org>
Tue, 18 Aug 2020 18:03:18 +0000 (14:03 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Tue, 18 Aug 2020 18:03:18 +0000 (14:03 -0400)
TODO: make the Delete Provider and New Provider buttons be deactivated
      or not appear as relevant.

Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Open-ILS/src/eg2/src/app/staff/acq/provider/acq-provider.component.html
Open-ILS/src/eg2/src/app/staff/acq/provider/provider-details.component.html
Open-ILS/src/eg2/src/app/staff/acq/provider/provider-details.component.ts
Open-ILS/src/eg2/src/app/staff/acq/provider/provider-record.service.ts
Open-ILS/src/eg2/src/app/staff/acq/provider/summary-pane.component.ts

index a1167b4..3453163 100644 (file)
@@ -51,7 +51,7 @@
           <eg-provider-details #providerDetails (desireSummarize)="onDesireSummarize($event, true)"></eg-provider-details>
         </ng-template>
       </ngb-tab>
-      <ngb-tab title="Addresses" i18n-title id="addresses" [disabled]="!id">
+      <ngb-tab title="Addresses" i18n-title id="addresses" [disabled]="!id || !this.providerRecord.currentProvider.canAdmin">
         <ng-template ngbTabContent>
           <div class="row mt-3">
             <div class="col-lg-12 text-right pb-1">
@@ -62,7 +62,7 @@
           <eg-provider-addresses></eg-provider-addresses>
         </ng-template>
       </ngb-tab>
-      <ngb-tab title="Contacts" i18n-title id="contacts" [disabled]="!id">
+      <ngb-tab title="Contacts" i18n-title id="contacts" [disabled]="!id || !this.providerRecord.currentProvider.canAdmin">
         <ng-template ngbTabContent>
           <div class="row mt-3">
             <div class="col-lg-12 text-right pb-1">
@@ -73,7 +73,7 @@
           <eg-provider-contacts (desireSummarize)="onDesireSummarize($event, true)"></eg-provider-contacts>
         </ng-template>
       </ngb-tab>
-      <ngb-tab title="Attribute Definitions" i18n-title id="attributes" [disabled]="!id">
+      <ngb-tab title="Attribute Definitions" i18n-title id="attributes" [disabled]="!id || !this.providerRecord.currentProvider.canAdmin">
         <ng-template ngbTabContent>
           <div class="row mt-3">
             <div class="col-lg-12 text-right pb-1">
@@ -84,7 +84,7 @@
           <eg-provider-attributes></eg-provider-attributes>
         </ng-template>
       </ngb-tab>
-      <ngb-tab title="Holdings Definitions" i18n-title id="holdings" [disabled]="!id">
+      <ngb-tab title="Holdings Definitions" i18n-title id="holdings" [disabled]="!id || !this.providerRecord.currentProvider.canAdmin">
         <ng-template ngbTabContent>
           <div class="row mt-3">
             <div class="col-lg-12 text-right pb-1">
@@ -95,7 +95,7 @@
           <eg-provider-holdings></eg-provider-holdings>
         </ng-template>
       </ngb-tab>
-      <ngb-tab title="EDI" i18n-title id="edi_accounts" [disabled]="!id">
+      <ngb-tab title="EDI" i18n-title id="edi_accounts" [disabled]="!id || !this.providerRecord.currentProvider.canAdmin">
         <ng-template ngbTabContent>
           <div class="row mt-3">
             <div class="col-lg-12 text-right pb-1">
index f548c5e..189e57c 100644 (file)
@@ -5,7 +5,7 @@
 
 <eg-fm-record-editor #editDialog
   idlClass="acqpro"
-  mode="update"
+  [mode]="permittedMode()"
   [hideBanner]="true" displayMode="inline"
   [record]="provider"
   (recordSaved)="updateProvider($event)"
index 89aa6ef..df3158c 100644 (file)
@@ -65,4 +65,14 @@ export class ProviderDetailsComponent implements OnInit {
         this._deflesh();
     }
 
+    permittedMode(): string {
+        // TODO - looks like fm-editor may have (via its modePerms) incompletely-implemented
+        //        work to vary the mode depending on whether the user has permission
+        //        to update a record, which would make this moot.
+        if (!this.providerRecord.currentProviderRecord()) {
+            return 'view';
+        }
+        return this.providerRecord.currentProviderRecord().canAdmin ? 'update' : 'view';
+    }
+
 }
index edac9ce..be775f0 100644 (file)
@@ -5,6 +5,7 @@ import {map} from 'rxjs/operators';
 import {PcrudService} from '@eg/core/pcrud.service';
 import {IdlService, IdlObject} from '@eg/core/idl.service';
 import {NetService} from '@eg/core/net.service';
+import {PermService} from '@eg/core/perm.service';
 
 export class ProviderSummary {
 }
@@ -13,11 +14,13 @@ export class ProviderRecord {
     id: number;
     record: IdlObject;
     canDelete: boolean;
+    canAdmin: boolean;
 
     constructor(record: IdlObject) {
         this.id = Number(record.id());
         this.record = record;
         this.canDelete = false;
+        this.canAdmin = false;
     }
 }
 
@@ -30,12 +33,22 @@ export class ProviderRecordService {
     private providerUpdatedSource = new Subject<number>();
     providerUpdated$ = this.providerUpdatedSource.asObservable();
 
+    private permissions: any;
+
     constructor(
         private idl: IdlService,
         private net: NetService,
-        private pcrud: PcrudService
+        private pcrud: PcrudService,
+        private perm: PermService
     ) { 
         this.currentProvider = null;
+        this.loadPerms();
+    }
+
+    loadPerms() {
+        this.perm.hasWorkPermAt(['ADMIN_PROVIDER','MANAGE_PROVIDER'], true).then(permMap => {
+            this.permissions = permMap;
+        });
     }
 
     getProviderRecord(id: number): Observable<ProviderRecord> {
@@ -77,6 +90,7 @@ export class ProviderRecordService {
             });
             this.currentProvider = provider;
             this.checkIfCanDelete(provider);
+            this.checkIfCanManage(provider);
             return provider;
         }));
     }
@@ -98,6 +112,13 @@ export class ProviderRecordService {
         });
     }
 
+    checkIfCanManage(prov: ProviderRecord) {
+        if (Object.keys(this.permissions).length > 0 &&
+            this.permissions['ADMIN_PROVIDER'].includes(prov.record.owner())) {
+            prov.canAdmin = true;
+        }
+    }
+
     current(): IdlObject {
         return this.currentProvider ? this.currentProvider.record : null;
     }
index 64d0f6a..929c389 100644 (file)
@@ -146,7 +146,13 @@ export class AcqProviderSummaryPaneComponent implements OnInit, AfterViewInit {
                 this.provider_holding_tag = provider.holding_tag();
                 this.provider_addresses = provider.addresses();
                 this.provider_san = provider.san();
-                this.provider_edi_default = provider.edi_default() ? provider.edi_default().label() : '';
+                if (typeof provider.edi_default() === 'object') {
+                    this.provider_edi_default = provider.edi_default() ? provider.edi_default().label() : '';
+                } else {
+                    // not fleshed, presumably because user doesn't have
+                    // permission to retrieve EDI accounts
+                    this.provider_edi_default = '';
+                }
                 this.provider_active = provider.active();
                 this.provider_prepayment_required = provider.prepayment_required();
                 this.provider_url = provider.url();