--- /dev/null
+
+<span *ngIf="!column.cellTemplate"
+ ngbTooltip="{{context.getRowColumnValue(row, column)}}"
+ triggers="mouseenter:mouseleave">
+ {{context.getRowColumnValue(row, column)}}
+</span>
+<span *ngIf="column.cellTemplate"
+ [ngbTooltip]="column.cellTemplate"
+ #tooltip="ngbTooltip"
+ (mouseenter)="tooltip.open(column.getCellContext(row))"
+ (mouseleave)="tooltip.close()" triggers="manual">
+ <ng-container #templateContainer
+ *ngTemplateOutlet="column.cellTemplate; context: column.getCellContext(row)">
+ </ng-container>
+</span>
+
--- /dev/null
+import {Component, Input, OnInit, TemplateRef} from '@angular/core';
+import {GridContext, GridColumn, GridRowSelector,
+ GridColumnSet, GridDataSource} from './grid';
+
+@Component({
+ selector: 'eg-grid-body-cell',
+ templateUrl: './grid-body-cell.component.html'
+})
+
+export class GridBodyCellComponent implements OnInit {
+
+ /** TODO: extract component text content for printing compiled cells */
+
+ @Input() context: GridContext;
+ @Input() row: any;
+ @Input() column: GridColumn;
+
+ constructor() {}
+
+ ngOnInit() {}
+}
+
--- /dev/null
+<!--
+ tabindex=1 so the grid body can capture keyboard events.
+-->
+<div class="eg-grid-body" tabindex="1" (keydown)="onGridKeyDown($event)">
+ <div class="eg-grid-row eg-grid-body-row"
+ [ngClass]="{'selected': context.rowSelector.contains(context.getRowIndex(row))}"
+ *ngFor="let row of context.dataSource.getPageOfRows(context.pager); let idx = index">
+
+ <div class="eg-grid-cell eg-grid-checkbox-cell eg-grid-cell-skinny">
+ <input type='checkbox' [(ngModel)]="context.rowSelector.indexes[context.getRowIndex(row)]">
+ </div>
+ <div class="eg-grid-cell eg-grid-header-cell eg-grid-number-cell eg-grid-cell-skinny">
+ {{context.pager.rowNumber(idx)}}
+ </div>
+ <div class="eg-grid-cell eg-grid-body-cell" [ngStyle]="{flex:col.flex}"
+ (dblclick)="onRowDblClick(row)"
+ (click)="onRowClick($event, row, idx)"
+ *ngFor="let col of context.columnSet.displayColumns()">
+
+ <eg-grid-body-cell [context]="context" [row]="row" [column]="col">
+ </eg-grid-body-cell>
+ </div>
+ </div>
+</div>
+
--- /dev/null
+import {Component, Input, OnInit, Host} from '@angular/core';
+import {GridContext, GridColumn, GridRowSelector,
+ GridColumnSet, GridDataSource} from './grid';
+import {GridComponent} from './grid.component';
+
+@Component({
+ selector: 'eg-grid-body',
+ templateUrl: './grid-body.component.html'
+})
+
+export class GridBodyComponent implements OnInit {
+
+ @Input() context: GridContext;
+
+ constructor(@Host() private grid: GridComponent) {
+ }
+
+ ngOnInit() {}
+
+ // Not using @HostListener because it only works globally.
+ onGridKeyDown(evt: KeyboardEvent) {
+ switch (evt.key) {
+ case 'ArrowUp':
+ this.context.selectPreviousRow();
+ evt.stopPropagation();
+ break;
+ case 'ArrowDown':
+ this.context.selectNextRow();
+ evt.stopPropagation();
+ break;
+ case 'ArrowLeft':
+ this.context.toPrevPage()
+ .then(ok => this.context.selectFirstRow(), err => {});
+ evt.stopPropagation();
+ break;
+ case 'ArrowRight':
+ this.context.toNextPage()
+ .then(ok => this.context.selectFirstRow(), err => {});
+ evt.stopPropagation();
+ break;
+ case 'Enter':
+ if (this.context.lastSelectedIndex) {
+ this.grid.onRowActivate$.emit(
+ this.context.getRowByIndex(
+ this.context.lastSelectedIndex)
+ );
+ }
+ evt.stopPropagation();
+ break;
+ }
+ }
+
+ onRowClick($event: any, row: any, idx: number) {
+ const index = this.context.getRowIndex(row);
+
+ if (this.context.disableMultiSelect) {
+ this.context.selectOneRow(index);
+ } else if ($event.ctrlKey || $event.metaKey /* mac command */) {
+ if (this.context.toggleSelectOneRow(index)) {
+ this.context.lastSelectedIndex = index;
+ }
+
+ } else if ($event.shiftKey) {
+ // TODO shift range click
+
+ } else {
+ this.context.selectOneRow(index);
+ }
+
+ this.grid.onRowClick$.emit(row);
+ }
+
+ onRowDblClick(row: any) {
+ this.grid.onRowActivate$.emit(row);
+ }
+
+}
+
<ng-template #printTemplate let-context>
<div>
<style>
- .grid-table {
+ .grid-print-table {
border-collapse: collapse;
margin: 1px;
}
- .grid-table td {
+ .grid-print-table td {
padding: 2px;
border: 1px solid #aaa;
}
</style>
- <table class="grid-table">
+ <table class="grid-print-table">
<thead>
<tr><th *ngFor="let col of context.columns">{{col.label}}</th></tr>
</thead>
<eg-grid-print #gridPrinter [gridContext]="context">
</eg-grid-print>
+ <!-- move me too -->
<div class="row" *ngIf="dataSource.data.length == 0">
<div class="col-lg-12 text-center alert alert-light font-italic" i18n>
Nothing to Display
</div>
</div>
- <div class="eg-grid-body" tabindex="1" (keydown)="onGridKeyDown($event)">
- <div class="eg-grid-row eg-grid-body-row"
- [ngClass]="{'selected': context.rowSelector.contains(context.getRowIndex(row))}"
- *ngFor="let row of dataSource.getPageOfRows(context.pager); let idx = index">
-
- <div class="eg-grid-cell eg-grid-checkbox-cell eg-grid-cell-skinny">
- <input type='checkbox' [(ngModel)]="context.rowSelector.indexes[context.getRowIndex(row)]">
- </div>
- <div class="eg-grid-cell eg-grid-header-cell eg-grid-number-cell eg-grid-cell-skinny">
- {{context.pager.rowNumber(idx)}}
- </div>
- <div class="eg-grid-cell eg-grid-body-cell" [ngStyle]="{flex:col.flex}"
- (dblclick)="onRowDblClick(row)"
- (click)="onRowClick($event, row, idx)"
- *ngFor="let col of context.columnSet.displayColumns()">
- <span *ngIf="!col.cellTemplate"
- ngbTooltip="{{context.getRowColumnValue(row, col)}}"
- triggers="mouseenter:mouseleave">
- {{context.getRowColumnValue(row, col)}}
- </span>
- <span *ngIf="col.cellTemplate"
- [ngbTooltip]="col.cellTemplate"
- #tooltip="ngbTooltip"
- (mouseenter)="tooltip.open(col.getCellContext(row))"
- (mouseleave)="tooltip.close()" triggers="manual">
- <ng-container #templateContainer
- *ngTemplateOutlet="col.cellTemplate; context: col.getCellContext(row)">
- </ng-container>
- </span>
- </div>
- </div>
- </div>
+ <eg-grid-body [context]="context"></eg-grid-body>
</div>
@Input() disableMultiSelect: boolean;
context: GridContext;
+
+ // These events are emitted from our grid-body component.
onRowActivate$: EventEmitter<any>;
onRowClick$: EventEmitter<any>;
this.context.destroy();
}
- // Not using @HostListener because it only works globally.
- onGridKeyDown(evt: KeyboardEvent) {
- switch (evt.key) {
- case 'ArrowUp':
- this.context.selectPreviousRow();
- evt.stopPropagation();
- break;
- case 'ArrowDown':
- this.context.selectNextRow();
- evt.stopPropagation();
- break;
- case 'ArrowLeft':
- this.context.toPrevPage()
- .then(ok => this.context.selectFirstRow(), err => {});
- evt.stopPropagation();
- break;
- case 'ArrowRight':
- this.context.toNextPage()
- .then(ok => this.context.selectFirstRow(), err => {});
- evt.stopPropagation();
- break;
- case 'Enter':
- if (this.context.lastSelectedIndex) {
- this.onRowActivate$.emit(
- this.context.getRowByIndex(
- this.context.lastSelectedIndex)
- );
- }
- evt.stopPropagation();
- break;
- }
- }
-
reload() {
this.context.reload();
}
-
- onRowClick($event: any, row: any, idx: number) {
- const index = this.context.getRowIndex(row);
-
- if (this.context.disableMultiSelect) {
- this.context.selectOneRow(index);
- } else if ($event.ctrlKey || $event.metaKey /* mac command */) {
- if (this.context.toggleSelectOneRow(index)) {
- this.context.lastSelectedIndex = index;
- }
-
- } else if ($event.shiftKey) {
- // TODO shift range click
-
- } else {
- this.context.selectOneRow(index);
- }
-
- this.onRowClick$.emit(row);
- }
-
- onRowDblClick(row: any) {
- this.onRowActivate$.emit(row);
- }
}
import {GridComponent} from './grid.component';
import {GridColumnComponent} from './grid-column.component';
import {GridHeaderComponent} from './grid-header.component';
+import {GridBodyComponent} from './grid-body.component';
+import {GridBodyCellComponent} from './grid-body-cell.component';
import {GridToolbarComponent} from './grid-toolbar.component';
import {GridToolbarButtonComponent} from './grid-toolbar-button.component';
import {GridToolbarActionComponent} from './grid-toolbar-action.component';
GridComponent,
GridColumnComponent,
GridHeaderComponent,
+ GridBodyComponent,
+ GridBodyCellComponent,
GridToolbarComponent,
GridToolbarButtonComponent,
GridToolbarActionComponent,
There should only be one print component active in a page.
-->
-<!-- container for inline template compilation -->
-<ng-container *ngIf="template">
- <ng-container *ngTemplateOutlet="template; context:context">
+<div id='eg-print-container'>
+ <!-- container for inline template compilation -->
+ <ng-container *ngIf="template">
+ <ng-container *ngTemplateOutlet="template; context:context">
+ </ng-container>
</ng-container>
-</ng-container>
-
+ <div id='eg-print-html-container'>
+ </div>
<!-- container for pre-compiled HTML -->
-<div id='eg-print-container'>
</div>
printReq => this.handlePrintRequest(printReq));
this.htmlContainer =
- this.renderer.selectRootElement('#eg-print-container');
+ this.renderer.selectRootElement('#eg-print-html-container');
}
handlePrintRequest(printReq: PrintRequest) {
summary: BibRecordSummary;
@Input() set bibSummary(s: any) {
this.summary = s;
- if (this.initDone) {
+ if (this.initDone && this.summary) {
this.summary.getBibCallNumber();
}
}