--- /dev/null
+<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">×</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>
+
--- /dev/null
+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;
+ }
+
+}
<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)">
[readonlyFields]="readonlyFields">
</eg-fm-record-editor>
-
+<eg-fund-details-dialog #fundDetailsDialog></eg-fund-details-dialog>
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',
idlClass = 'acqf';
classLabel: string;
+ @ViewChild('fundDetailsDialog', { static: true }) fundDetailsDialog: FundDetailsDialogComponent;
+
constructor(
route: ActivatedRoute,
ngLocation: Location,
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(
+ );
+ }
+ }
}
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,