1 import {AfterViewInit, ChangeDetectorRef, Component, Input, OnInit} from '@angular/core';
2 import {Router} from '@angular/router';
3 import {DomSanitizer, SafeUrl} from '@angular/platform-browser';
4 import {GridToolbarButton, GridToolbarAction, GridContext} from '@eg/share/grid/grid';
5 import {GridColumnWidthComponent} from './grid-column-width.component';
6 import {GridPrintComponent} from './grid-print.component';
7 import {GridColumn} from './grid';
10 selector: 'eg-grid-toolbar',
11 templateUrl: 'grid-toolbar.component.html'
14 export class GridToolbarComponent implements OnInit, AfterViewInit {
16 @Input() gridContext: GridContext;
17 @Input() colWidthConfig: GridColumnWidthComponent;
18 @Input() gridPrinter: GridPrintComponent;
19 @Input() disableSaveSettings = false;
21 renderedGroups: {[group: string]: boolean} = {};
23 csvExportInProgress: boolean;
24 csvExportUrl: SafeUrl;
25 csvExportFileName: string;
28 private router: Router,
29 private sanitizer: DomSanitizer,
30 private cd: ChangeDetectorRef
37 ngAfterViewInit(): void {
38 this.cd.detectChanges();
42 const actions = this.gridContext.toolbarActions;
44 const unGrouped = actions.filter(a => !a.group)
46 return a.label < b.label ? -1 : 1;
49 const grouped = actions.filter(a => Boolean(a.group))
51 if (a.group === b.group) {
52 return a.label < b.label ? -1 : 1;
54 return a.group < b.group ? -1 : 1;
58 // Insert group markers for rendering
60 const grouped2: any[] = [];
61 grouped.forEach(action => {
62 if (!seen[action.group]) {
63 seen[action.group] = true;
64 const act = new GridToolbarAction();
65 act.label = action.group;
69 grouped2.push(action);
72 this.gridContext.toolbarActions = unGrouped.concat(grouped2);
76 // TODO: when server-side settings are supported, this operation
77 // may offer to save to user/workstation OR org unit settings
78 // depending on perms.
80 this.gridContext.saveGridConfig().then(
81 // hide the with config after saving
82 ok => this.colWidthConfig.isVisible = false,
83 err => console.error(`Error saving columns: ${err}`)
87 performButtonAction(button: GridToolbarButton) {
88 const rows = this.gridContext.getSelectedRows();
89 if (button.routerLink) {
90 this.router.navigate([button.routerLink]);
92 button.onClick.emit(rows);
93 if (button.action) { button.action(); }
98 this.gridPrinter.printGrid();
101 printSelectedRows(): void {
102 this.gridPrinter.printSelectedRows();
105 generateCsvExportUrl($event) {
107 if (this.csvExportInProgress) {
108 // This is secondary href click handler. Give the
109 // browser a moment to start the download, then reset
110 // the CSV download attributes / state.
112 this.csvExportUrl = null;
113 this.csvExportFileName = '';
114 this.csvExportInProgress = false;
115 }, 500 // eslint-disable-line no-magic-numbers
120 this.csvExportInProgress = true;
122 // let the file name describe the grid
123 this.csvExportFileName = (
124 this.gridContext.persistKey || 'eg_grid_data'
125 ).replace(/\s+/g, '_') + '.csv';
127 this.gridContext.gridToCsv().then(csv => {
128 const blob = new Blob([csv], {type : 'text/plain'});
129 const win: any = window; // avoid TS errors
130 this.csvExportUrl = this.sanitizer.bypassSecurityTrustUrl(
131 (win.URL || win.webkitURL).createObjectURL(blob)
134 // Fire the 2nd click event now that the browser has
135 // information on how to download the CSV file.
136 setTimeout(() => $event.target.click());
139 $event.preventDefault();
142 toggleVisibility(col: GridColumn) {
143 col.visible = !col.visible;
144 if (this.gridContext.reloadOnColumnChange) {
145 this.gridContext.reloadWithoutPagerReset();