Ang: start work on fund details dialog
authorGalen Charlton <gmc@equinoxinitiative.org>
Tue, 16 Mar 2021 22:05:21 +0000 (18:05 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Thu, 25 Mar 2021 17:56:26 +0000 (13:56 -0400)
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Open-ILS/src/eg2/src/app/staff/admin/acq/funds/fund-details-dialog.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/acq/funds/fund-details-dialog.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds-manager.component.html
Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds-manager.component.ts
Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds.module.ts

diff --git a/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/fund-details-dialog.component.html b/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/fund-details-dialog.component.html
new file mode 100644 (file)
index 0000000..5cbcd85
--- /dev/null
@@ -0,0 +1,93 @@
+<ng-template #dialogContent>
+  <div class="modal-header bg-info">
+    <h3 class="modal-title" i18n>Fund Details - {{fund.name()}} ({{fund.code()}} {{fund.year()}})</h3>
+    <button type="button" class="close"
+      i18n-aria-label aria-label="Close" (click)="close()">
+      <span aria-hidden="true">&times;</span>
+    </button>
+  </div>
+  <div class="modal-body">
+    <ul ngbNav #fundDetailsNav="ngbNav" class="nav-tabs">
+      <li ngbNavItem>
+        <a ngbNavLink i18n>Summary</a>
+        <ng-template ngbNavContent>
+          <div class="mt-2">
+           </div>
+        </ng-template>
+      </li>
+      <li ngbNavItem>
+        <a ngbNavLink i18n>Allocations</a>
+        <ng-template ngbNavContent>
+          <div class="mt-2">
+            <eg-grid #fundDetailsAllocationsGrid idlClass="acqfa" [dataSource]="acqfaDataSource"
+                [sortable]="true" persistKey="acq.fund.fund_allocation"
+                [filterable]="true" [stickyHeader]="true">
+
+              <eg-grid-column path="funding_source"></eg-grid-column>
+              <eg-grid-column path="amount"></eg-grid-column>
+              <eg-grid-column path="create_time"></eg-grid-column>
+              <eg-grid-column path="allocator"></eg-grid-column>
+              <eg-grid-column path="note"></eg-grid-column>
+              <eg-grid-column path="id" [hidden]="true"></eg-grid-column>
+              <eg-grid-column path="fund" [hidden]="true" [filterable]="false"></eg-grid-column>
+            </eg-grid>
+          </div>
+        </ng-template>
+      </li>
+      <li ngbNavItem>
+        <a ngbNavLink i18n>Transfers</a>
+        <ng-template ngbNavContent>
+          <div class="mt-2">
+            <eg-grid #fundDetailsTransfersGrid idlClass="acqftr" [dataSource]="acqftrDataSource"
+                [sortable]="true" persistKey="acq.fund.fund_transfer"
+                [filterable]="true" [stickyHeader]="true">
+
+              <eg-grid-column path="src_fund"></eg-grid-column>
+              <eg-grid-column path="src_amount"></eg-grid-column>
+              <eg-grid-column path="dest_fund"></eg-grid-column>
+              <eg-grid-column path="dest_amount"></eg-grid-column>
+              <eg-grid-column path="transfer_time"></eg-grid-column>
+              <eg-grid-column path="transfer_user"></eg-grid-column>
+              <eg-grid-column path="note"></eg-grid-column>
+              <eg-grid-column path="id" [hidden]="true"></eg-grid-column>
+            </eg-grid>
+           </div>
+        </ng-template>
+      </li>
+      <li ngbNavItem>
+        <a ngbNavLink i18n>Debits</a>
+        <ng-template ngbNavContent>
+          <div class="mt-2">
+            <eg-grid #fundDetailsDebitsGrid idlClass="acqfdeb" [dataSource]="acqfdebDataSource"
+                [sortable]="true" persistKey="acq.fund.fund_debit"
+                [filterable]="true" [stickyHeader]="true">
+
+              <eg-grid-column path="amount"></eg-grid-column>
+              <eg-grid-column path="encumbrance"></eg-grid-column>
+              <eg-grid-column path="debit_type"></eg-grid-column>
+              <eg-grid-column path="origin_amount"></eg-grid-column>
+              <eg-grid-column path="origin_currency_type"></eg-grid-column>
+              <eg-grid-column path="create_time"></eg-grid-column>
+              <eg-grid-column path="invoice_entry"></eg-grid-column>
+              <eg-grid-column path="id" [hidden]="true"></eg-grid-column>
+              <eg-grid-column path="fund" [hidden]="true" [filterable]="false"></eg-grid-column>
+            </eg-grid>
+           </div>
+        </ng-template>
+      </li>
+      <li ngbNavItem>
+        <a ngbNavLink i18n>Tags</a>
+        <ng-template ngbNavContent>
+          <div class="mt-2">
+           </div>
+        </ng-template>
+      </li>
+    </ul>
+    <div [ngbNavOutlet]="fundDetailsNav"></div>
+  </div>
+  <div class="modal-footer">
+    <button type="button" class="btn btn-warning"
+      (click)="close()" i18n>Close</button>
+  </div>
+</ng-template>
+
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/fund-details-dialog.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/fund-details-dialog.component.ts
new file mode 100644 (file)
index 0000000..a7c8b5f
--- /dev/null
@@ -0,0 +1,110 @@
+import {Component, Input, ViewChild, TemplateRef, OnInit} from '@angular/core';
+import {DialogComponent} from '@eg/share/dialog/dialog.component';
+import {IdlService, IdlObject} from '@eg/core/idl.service';
+import {EventService} from '@eg/core/event.service';
+import {NetService} from '@eg/core/net.service';
+import {AuthService} from '@eg/core/auth.service';
+import {PcrudService} from '@eg/core/pcrud.service';
+import {GridDataSource} from '@eg/share/grid/grid';
+import {Pager} from '@eg/share/util/pager';
+import {NgbModal} from '@ng-bootstrap/ng-bootstrap';
+
+@Component({
+  selector: 'eg-fund-details-dialog',
+  templateUrl: './fund-details-dialog.component.html'
+})
+
+export class FundDetailsDialogComponent
+  extends DialogComponent implements OnInit {
+
+    @Input() fundId: number;
+    fund: IdlObject;
+    acqfaDataSource: GridDataSource
+    acqftrDataSource: GridDataSource
+    acqfdebDataSource: GridDataSource
+    constructor(
+        private idl: IdlService,
+        private evt: EventService,
+        private net: NetService,
+        private auth: AuthService,
+        private pcrud: PcrudService,
+        private modal: NgbModal
+    ) {
+        super(modal);
+    }
+    
+    ngOnInit() {
+        this.fund = null;
+        this.onOpen$.subscribe(() => this.initRecord());
+    }
+
+    private initRecord() {
+        this.acqfaDataSource = this._getDataSource('acqfa', 'create_time ASC');
+        this.acqftrDataSource = this._getDataSource('acqftr', 'transfer_time ASC');
+        this.acqfdebDataSource = this._getDataSource('acqfdeb', 'create_time ASC');
+        this.pcrud.retrieve('acqf', this.fundId, {
+            flesh: 1,
+            flesh_fields: {
+                acqf: [
+                    'spent_balance',
+                    'combined_balance',
+                    'spent_total',
+                    'encumbrance_total',
+                    'debit_total',
+                    'allocation_total'
+                ]
+            }
+        }).subscribe(res => this.fund = res);
+    }
+
+    _getDataSource(idlClass: string, sortField: string): GridDataSource {
+        const gridSource = new GridDataSource();
+
+        gridSource.getRows = (pager: Pager, sort: any[]) => {
+            const orderBy: any = {};
+            if (sort.length) {
+                // Sort specified from grid
+                orderBy[idlClass] = sort[0].name + ' ' + sort[0].dir;
+            } else if (sortField) {
+                // Default sort field
+                orderBy[idlClass] = sortField;
+            }
+
+            const searchOps = {
+                offset: pager.offset,
+                limit: pager.limit,
+                order_by: orderBy,
+            };
+            const reqOps = {
+                fleshSelectors: true,
+            };
+
+            const search: any = new Array();
+            if (idlClass === 'acqfa') {
+                search.push({ fund: this.fundId });
+            } else if (idlClass === 'acqftr') {
+                search.push({ 
+                    '-or': [
+                        { src_fund: this.fundId },
+                        { dest_fund: this.fundId }
+                    ]
+                });
+            } else if (idlClass === 'acqfdeb') {
+                search.push({ fund: this.fundId });
+            }
+
+            Object.keys(gridSource.filters).forEach(key => {
+                Object.keys(gridSource.filters[key]).forEach(key2 => {
+                    search.push(gridSource.filters[key][key2]);
+                });
+            });
+
+            return this.pcrud.search(
+                idlClass, search, searchOps, reqOps);
+        };
+
+        return gridSource;
+    }
+
+}
index e9a623b..26f478a 100644 (file)
@@ -50,6 +50,9 @@
   <eg-grid-toolbar-button [disabled]="!canCreate" 
     label="New {{idlClassDef.label}}" i18n-label (onClick)="createNew()">
   </eg-grid-toolbar-button>
+  <eg-grid-toolbar-action label="View Selected" i18n-label
+    (onClick)="openFundDetailsDialog($event)">
+  </eg-grid-toolbar-action>
   <eg-grid-toolbar-action label="Edit Selected" i18n-label (onClick)="editSelected($event)">
   </eg-grid-toolbar-action>
   <eg-grid-toolbar-action label="Delete Selected" i18n-label (onClick)="deleteSelected($event)">
@@ -96,4 +99,4 @@
     [readonlyFields]="readonlyFields">
 </eg-fm-record-editor>
 
-
+<eg-fund-details-dialog #fundDetailsDialog></eg-fund-details-dialog>
index d48643c..b998184 100644 (file)
@@ -13,6 +13,7 @@ import {PermService} from '@eg/core/perm.service';
 import {AuthService} from '@eg/core/auth.service';
 import {NetService} from '@eg/core/net.service';
 import {StringComponent} from '@eg/share/string/string.component';
+import {FundDetailsDialogComponent} from './fund-details-dialog.component';
 
 @Component({
     selector: 'eg-funds-manager',
@@ -23,6 +24,8 @@ export class FundsManagerComponent extends AdminPageComponent implements OnInit
     idlClass = 'acqf';
     classLabel: string;
 
+    @ViewChild('fundDetailsDialog', { static: true }) fundDetailsDialog: FundDetailsDialogComponent;
+
     constructor(
         route: ActivatedRoute,
         ngLocation: Location,
@@ -105,4 +108,12 @@ export class FundsManagerComponent extends AdminPageComponent implements OnInit
         this.classLabel = this.idlClassDef.label;
         this.includeOrgDescendants = true;
     }
+
+    openFundDetailsDialog(rows: IdlObject[]) {
+        if (rows.length > 0) {
+            this.fundDetailsDialog.fundId = rows[0].id();
+            this.fundDetailsDialog.open({size: 'xl'}).subscribe(
+            );
+        }
+    }
 }
index 7f3deff..cf371e0 100644 (file)
@@ -4,11 +4,13 @@ import {AdminCommonModule} from '@eg/staff/admin/common.module';
 import {FundsComponent} from './funds.component';
 import {FundsRoutingModule} from './routing.module';
 import {FundsManagerComponent} from './funds-manager.component';
+import {FundDetailsDialogComponent} from './fund-details-dialog.component';
 
 @NgModule({
   declarations: [
     FundsComponent,
-    FundsManagerComponent
+    FundsManagerComponent,
+    FundDetailsDialogComponent
   ],
   imports: [
     StaffCommonModule,