review-histogram.component.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { ChangeDetectionStrategy, Component, Input, OnChanges, Output, EventEmitter } from '@angular/core';
  2. import { SharedModule } from '@vendure/admin-ui/core';
  3. import { ProductReviewHistogramItem } from '../../generated-types';
  4. import { StarRatingComponent } from '../star-rating/star-rating.component';
  5. @Component({
  6. selector: 'review-histogram',
  7. templateUrl: './review-histogram.component.html',
  8. styleUrls: ['./review-histogram.component.scss'],
  9. changeDetection: ChangeDetectionStrategy.OnPush,
  10. standalone: true,
  11. imports: [SharedModule, StarRatingComponent],
  12. })
  13. export class ReviewHistogramComponent implements OnChanges {
  14. @Input() binData: ProductReviewHistogramItem[] | null = [];
  15. @Output() filterChange = new EventEmitter<number | null>();
  16. bins = [5, 4, 3, 2, 1];
  17. filteredBin: number | null = null;
  18. private max: number;
  19. ngOnChanges() {
  20. this.max = this.binData ? Math.max(...this.binData.map(d => d.frequency)) : 0;
  21. }
  22. getPercentage(bin: number): number {
  23. if (!this.binData) {
  24. return 0;
  25. }
  26. const data = this.binData.find(d => d.bin === bin);
  27. if (!data) {
  28. return 0;
  29. }
  30. return Math.round((data.frequency / this.max) * 100);
  31. }
  32. getFrequency(bin: number): number {
  33. if (!this.binData) {
  34. return 0;
  35. }
  36. const data = this.binData.find(d => d.bin === bin);
  37. if (!data) {
  38. return 0;
  39. }
  40. return data.frequency;
  41. }
  42. toggleBinFilter(bin: number) {
  43. if (this.filteredBin === bin) {
  44. this.filteredBin = null;
  45. } else {
  46. this.filteredBin = bin;
  47. }
  48. this.filterChange.emit(this.filteredBin);
  49. }
  50. }