reports.component.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { Component, Inject } from '@angular/core';
  2. import { BehaviorSubject } from 'rxjs/BehaviorSubject';
  3. import { DataSource } from '@angular/cdk/collections';
  4. import { Observable } from 'rxjs/Observable';
  5. import 'rxjs/add/observable/merge';
  6. import 'rxjs/add/observable/of';
  7. import 'rxjs/add/operator/map';
  8. import 'rxjs/add/operator/take';
  9. import { Report, ReportDataService } from './services/reportData.service';
  10. import { ActivatedRoute, ParamMap } from '@angular/router';
  11. import { WindowService } from './services/window.service';
  12. export class ReportsDataSource extends DataSource<any> {
  13. constructor(private dataSource: ReportDataService) {
  14. super();
  15. }
  16. connect(): Observable<Report[]> {
  17. return this
  18. .dataSource
  19. .dataChange
  20. .map(data => data);
  21. }
  22. disconnect() { }
  23. }
  24. function mapUser(params: ParamMap, index: number): boolean {
  25. const userName = params.get('user') || '';
  26. return userName.indexOf('admin') > -1;
  27. }
  28. function toggleApprovedStyle(this: HTMLElement, approved: boolean) {
  29. if (approved && this.className.indexOf('approved') === -1) {
  30. this.className += ' approved';
  31. } else {
  32. this.className = this.className.replace('approved', '');
  33. }
  34. }
  35. @Component({
  36. selector: 'ps-reports',
  37. templateUrl: './reports.component.html',
  38. styleUrls: ['./reports.component.css']
  39. })
  40. export class ReportsComponent {
  41. reports: ReportsDataSource;
  42. isAdmin = Observable.of(false);
  43. displayedColumns = ['id', 'description', 'date', 'amount', 'approved', 'actions'];
  44. private isLoading: boolean;
  45. constructor(private route: ActivatedRoute,
  46. private reportDataService: ReportDataService,
  47. @Inject(WindowService) private _window: Window) {
  48. this.reports = new ReportsDataSource(reportDataService);
  49. this.isAdmin = this.route.queryParamMap.map(mapUser);
  50. }
  51. approve(report: Report) {
  52. this.toggleApproval(report, true);
  53. this.toggleApprovedStyle(report.id, true);
  54. }
  55. reject(report: Report) {
  56. this.toggleApproval(report, false);
  57. this.toggleApprovedStyle(report.id, false);
  58. }
  59. private toggleApprovedStyle(reportId: number, approved: boolean) {
  60. setTimeout(function () {
  61. const row = this._window.document.getElementById(`report$${reportId}`).closest("mat-row");
  62. toggleApprovedStyle.call(row, approved);
  63. }, 50);
  64. }
  65. private toggleApproval(report: Report, approved: boolean) {
  66. report.approved = approved;
  67. const user = this.route
  68. .queryParamMap
  69. .take(1)
  70. .subscribe(params => this.reportDataService.toggleApproval(report, params.get('user')));
  71. }
  72. }