reports.component.ts 2.8 KB

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