@datarailsshared/datarailsshared 1.3.49 → 1.3.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/_datarailsshared.styles.css +3 -3
  2. package/assets/styles/_styles.scss +2 -2
  3. package/assets/styles/img/default-avatar.svg +5 -5
  4. package/bundles/datarailsshared-datarailsshared.umd.js +3984 -3995
  5. package/bundles/datarailsshared-datarailsshared.umd.js.map +1 -1
  6. package/datarailsshared-datarailsshared-1.3.51.tgz +0 -0
  7. package/datarailsshared-datarailsshared.d.ts +9 -9
  8. package/datarailsshared-datarailsshared.metadata.json +1 -1
  9. package/esm2015/datarailsshared-datarailsshared.js +9 -9
  10. package/esm2015/lib/date-tags/date-tag.component.js +70 -70
  11. package/esm2015/lib/date-tags/date-tag.module.js +50 -50
  12. package/esm2015/lib/date-tags/day-tag/day-tag.component.js +81 -81
  13. package/esm2015/lib/date-tags/forecast-tag/forecast-tag.component.js +143 -143
  14. package/esm2015/lib/date-tags/month-tag/month-tag.component.js +87 -87
  15. package/esm2015/lib/date-tags/quarter-tag/quarter-tag.component.js +101 -101
  16. package/esm2015/lib/date-tags/week-tag/week-tag.component.js +124 -124
  17. package/esm2015/lib/date-tags/year-tag/year-tag.component.js +93 -93
  18. package/esm2015/lib/dr-accordion/accordion-item-body.component.js +57 -57
  19. package/esm2015/lib/dr-accordion/accordion-item-header.component.js +79 -79
  20. package/esm2015/lib/dr-accordion/accordion-item.component.js +123 -123
  21. package/esm2015/lib/dr-accordion/accordion.component.js +43 -43
  22. package/esm2015/lib/dr-accordion/accordion.module.js +23 -23
  23. package/esm2015/lib/dr-avatar/dr-avatar.component.js +42 -42
  24. package/esm2015/lib/dr-avatar/dr-avatar.module.js +26 -26
  25. package/esm2015/lib/dr-avatar/dr-avatar.pipe.js +15 -15
  26. package/esm2015/lib/dr-dropdown/dr-dropdown-item-show.pipe.js +12 -12
  27. package/esm2015/lib/dr-dropdown/dr-dropdown-position.directive.js +97 -97
  28. package/esm2015/lib/dr-dropdown/dr-dropdown.component.js +110 -110
  29. package/esm2015/lib/dr-dropdown/dr-dropdown.directive.js +89 -89
  30. package/esm2015/lib/dr-dropdown/dr-dropdown.module.js +34 -34
  31. package/esm2015/lib/dr-dropdown/dr-dropdown.service.js +24 -24
  32. package/esm2015/lib/dr-inputs/button/button.component.js +80 -80
  33. package/esm2015/lib/dr-inputs/checkbox/checkbox.component.js +63 -63
  34. package/esm2015/lib/dr-inputs/dr-date-picker/dr-date-picker-format.directive.js +47 -47
  35. package/esm2015/lib/dr-inputs/dr-date-picker/dr-date-picker.component.js +183 -186
  36. package/esm2015/lib/dr-inputs/dr-date-picker/dr-date-picker.service.js +41 -41
  37. package/esm2015/lib/dr-inputs/dr-date-picker/dr-date-picker_custom-header/dr-date-picker_custom-header.component.js +129 -129
  38. package/esm2015/lib/dr-inputs/dr-input/dr-input.component.js +185 -185
  39. package/esm2015/lib/dr-inputs/dr-inputs.module.js +51 -51
  40. package/esm2015/lib/dr-inputs/dr-model-debounce-change.directive.js +31 -31
  41. package/esm2015/lib/dr-inputs/dr-select/dr-select.component.js +90 -90
  42. package/esm2015/lib/dr-inputs/dr-toggle/dr-toggle.component.js +64 -64
  43. package/esm2015/lib/dr-inputs/dr-toggle-button/dr-toggle-button.component.js +56 -56
  44. package/esm2015/lib/dr-inputs/radio-button/radio-button.component.js +64 -64
  45. package/esm2015/lib/dr-inputs/radio-button/radio-group.component.js +164 -164
  46. package/esm2015/lib/dr-popover/dr-popover-ref.js +20 -20
  47. package/esm2015/lib/dr-popover/dr-popover.component.js +77 -77
  48. package/esm2015/lib/dr-popover/dr-popover.directive.js +72 -72
  49. package/esm2015/lib/dr-popover/dr-popover.module.js +23 -23
  50. package/esm2015/lib/dr-popover/dr-popover.service.js +102 -102
  51. package/esm2015/lib/dr-spinner/dr-spinner.component.js +29 -29
  52. package/esm2015/lib/dr-spinner/dr-spinner.directive.js +53 -53
  53. package/esm2015/lib/dr-spinner/dr-spinner.module.js +18 -18
  54. package/esm2015/lib/dr-tabs/dr-tab.component.js +23 -23
  55. package/esm2015/lib/dr-tabs/dr-tabs.component.js +28 -28
  56. package/esm2015/lib/dr-tabs/dr-tabs.module.js +30 -30
  57. package/esm2015/lib/dr-tags/dr-tag.component.js +54 -54
  58. package/esm2015/lib/dr-tags/dr-tag.module.js +22 -22
  59. package/esm2015/lib/dr-tooltip/dr-tooltip.component.js +30 -30
  60. package/esm2015/lib/dr-tooltip/dr-tooltip.directive.js +102 -102
  61. package/esm2015/lib/dr-tooltip/dr-tooltip.module.js +23 -23
  62. package/esm2015/lib/list-tags/list-tag.component.js +41 -41
  63. package/esm2015/lib/list-tags/list-tag.module.js +29 -29
  64. package/esm2015/lib/models/constants.js +97 -97
  65. package/esm2015/lib/models/datePicker.js +40 -40
  66. package/esm2015/lib/models/dropdown.js +2 -2
  67. package/esm2015/lib/models/popover.js +27 -27
  68. package/esm2015/lib/models/serverTags.js +2 -2
  69. package/esm2015/public-api.js +57 -57
  70. package/fesm2015/datarailsshared-datarailsshared.js +3365 -3368
  71. package/fesm2015/datarailsshared-datarailsshared.js.map +1 -1
  72. package/lib/date-tags/date-tag.component.d.ts +27 -27
  73. package/lib/date-tags/date-tag.module.d.ts +4 -4
  74. package/lib/date-tags/day-tag/day-tag.component.d.ts +12 -12
  75. package/lib/date-tags/forecast-tag/forecast-tag.component.d.ts +21 -21
  76. package/lib/date-tags/month-tag/month-tag.component.d.ts +14 -14
  77. package/lib/date-tags/quarter-tag/quarter-tag.component.d.ts +17 -17
  78. package/lib/date-tags/week-tag/week-tag.component.d.ts +19 -19
  79. package/lib/date-tags/year-tag/year-tag.component.d.ts +14 -14
  80. package/lib/dr-accordion/accordion-item-body.component.d.ts +11 -11
  81. package/lib/dr-accordion/accordion-item-header.component.d.ts +16 -16
  82. package/lib/dr-accordion/accordion-item.component.d.ts +53 -53
  83. package/lib/dr-accordion/accordion.component.d.ts +19 -19
  84. package/lib/dr-accordion/accordion.module.d.ts +2 -2
  85. package/lib/dr-avatar/dr-avatar.component.d.ts +10 -10
  86. package/lib/dr-avatar/dr-avatar.module.d.ts +2 -2
  87. package/lib/dr-avatar/dr-avatar.pipe.d.ts +4 -4
  88. package/lib/dr-dropdown/dr-dropdown-item-show.pipe.d.ts +5 -5
  89. package/lib/dr-dropdown/dr-dropdown-position.directive.d.ts +12 -12
  90. package/lib/dr-dropdown/dr-dropdown.component.d.ts +26 -26
  91. package/lib/dr-dropdown/dr-dropdown.directive.d.ts +23 -23
  92. package/lib/dr-dropdown/dr-dropdown.module.d.ts +2 -2
  93. package/lib/dr-dropdown/dr-dropdown.service.d.ts +11 -11
  94. package/lib/dr-inputs/button/button.component.d.ts +21 -21
  95. package/lib/dr-inputs/checkbox/checkbox.component.d.ts +20 -20
  96. package/lib/dr-inputs/dr-date-picker/dr-date-picker-format.directive.d.ts +10 -10
  97. package/lib/dr-inputs/dr-date-picker/dr-date-picker.component.d.ts +54 -54
  98. package/lib/dr-inputs/dr-date-picker/dr-date-picker.service.d.ts +12 -12
  99. package/lib/dr-inputs/dr-date-picker/dr-date-picker_custom-header/dr-date-picker_custom-header.component.d.ts +41 -41
  100. package/lib/dr-inputs/dr-input/dr-input.component.d.ts +58 -58
  101. package/lib/dr-inputs/dr-inputs.module.d.ts +2 -2
  102. package/lib/dr-inputs/dr-model-debounce-change.directive.d.ts +11 -11
  103. package/lib/dr-inputs/dr-select/dr-select.component.d.ts +38 -38
  104. package/lib/dr-inputs/dr-toggle/dr-toggle.component.d.ts +23 -23
  105. package/lib/dr-inputs/dr-toggle-button/dr-toggle-button.component.d.ts +19 -19
  106. package/lib/dr-inputs/radio-button/radio-button.component.d.ts +21 -21
  107. package/lib/dr-inputs/radio-button/radio-group.component.d.ts +39 -39
  108. package/lib/dr-popover/dr-popover-ref.d.ts +16 -16
  109. package/lib/dr-popover/dr-popover.component.d.ts +26 -26
  110. package/lib/dr-popover/dr-popover.directive.d.ts +26 -26
  111. package/lib/dr-popover/dr-popover.module.d.ts +2 -2
  112. package/lib/dr-popover/dr-popover.service.d.ts +17 -17
  113. package/lib/dr-spinner/dr-spinner.component.d.ts +10 -10
  114. package/lib/dr-spinner/dr-spinner.directive.d.ts +15 -15
  115. package/lib/dr-spinner/dr-spinner.module.d.ts +2 -2
  116. package/lib/dr-tabs/dr-tab.component.d.ts +8 -8
  117. package/lib/dr-tabs/dr-tabs.component.d.ts +11 -11
  118. package/lib/dr-tabs/dr-tabs.module.d.ts +2 -2
  119. package/lib/dr-tags/dr-tag.component.d.ts +15 -15
  120. package/lib/dr-tags/dr-tag.module.d.ts +2 -2
  121. package/lib/dr-tooltip/dr-tooltip.component.d.ts +16 -16
  122. package/lib/dr-tooltip/dr-tooltip.directive.d.ts +23 -23
  123. package/lib/dr-tooltip/dr-tooltip.module.d.ts +2 -2
  124. package/lib/list-tags/list-tag.component.d.ts +14 -14
  125. package/lib/list-tags/list-tag.module.d.ts +2 -2
  126. package/lib/models/constants.d.ts +87 -87
  127. package/lib/models/datePicker.d.ts +25 -25
  128. package/lib/models/dropdown.d.ts +48 -48
  129. package/lib/models/popover.d.ts +32 -32
  130. package/lib/models/serverTags.d.ts +28 -28
  131. package/package.json +1 -1
  132. package/public-api.d.ts +55 -55
  133. package/datarailsshared-datarailsshared-1.3.49.tgz +0 -0
@@ -1,129 +1,129 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject } from "@angular/core";
2
- import { Subject } from "rxjs";
3
- import { take, takeUntil } from 'rxjs/operators';
4
- import { MatCalendar } from '@angular/material/datepicker';
5
- import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
6
- import { CustomDateFormat, MAT_DEFAULT_DATE_FORMAT, MONTH_YEAR_FORMAT, QUARTER_FORMAT, YEAR_FORMAT } from "../../../models/datePicker";
7
- import { DrDatePickerService } from "../dr-date-picker.service";
8
- const moment = require('moment');
9
- export class DrDatePickerCustomHeaderComponent {
10
- constructor(_calendar, _dateAdapter, _dateFormats, cdr, datePickerService) {
11
- this._calendar = _calendar;
12
- this._dateAdapter = _dateAdapter;
13
- this._dateFormats = _dateFormats;
14
- this.cdr = cdr;
15
- this.datePickerService = datePickerService;
16
- this._destroyed = new Subject();
17
- this.quarters = [1, 2, 3, 4];
18
- this.selectedQuarter = 1;
19
- this.timeframeOptions = [{
20
- title: 'Day',
21
- value: 'month',
22
- format: MAT_DEFAULT_DATE_FORMAT,
23
- periodLabel: () => this._dateAdapter
24
- .format(this._calendar.activeDate, this._dateFormats.display.monthYearLabel)
25
- .toLocaleUpperCase()
26
- }, {
27
- title: 'Month',
28
- value: 'year',
29
- format: MONTH_YEAR_FORMAT,
30
- periodLabel: () => String(moment(this._calendar.activeDate).year())
31
- }, {
32
- title: 'Quarter',
33
- value: 'none',
34
- format: QUARTER_FORMAT,
35
- periodLabel: () => String(moment(this._calendar.activeDate).year())
36
- }, {
37
- title: 'Year',
38
- value: 'multi-year',
39
- format: YEAR_FORMAT,
40
- periodLabel: () => {
41
- const currentYear = moment(this._calendar.activeDate).year();
42
- const startPeriod = Math.floor(currentYear / 24) * 24;
43
- return startPeriod + '-' + (startPeriod + 23);
44
- }
45
- }];
46
- this.pagingSetup = {
47
- 'year': (forward) => this.pagingDateChange('addCalendarYears', 1, forward),
48
- 'none': (forward) => this.pagingDateChange('addCalendarYears', 1, forward),
49
- 'month': (forward) => this.pagingDateChange('addCalendarMonths', 1, forward),
50
- 'multi-year': (forward) => this.pagingDateChange('addCalendarYears', 24, forward)
51
- };
52
- this.selectedTimeframe = 'month';
53
- this.timeframeSelection = false;
54
- this.periodMonthLabel = '';
55
- this.periodYearLabel = '';
56
- _calendar.stateChanges
57
- .pipe(takeUntil(this._destroyed))
58
- .subscribe(() => cdr.markForCheck());
59
- this.datePickerService.format
60
- .pipe(take(1))
61
- .subscribe(value => {
62
- this.selectedTimeframe = this.timeframeOptions.filter(option => option.format == value)[0].value;
63
- });
64
- }
65
- ngOnDestroy() {
66
- this._destroyed.next();
67
- this._destroyed.complete();
68
- }
69
- setPeriodLabels(currentTimeframeOption) {
70
- const fullPeriodLabel = currentTimeframeOption.periodLabel();
71
- if (this.selectedTimeframe === 'month') {
72
- this.periodMonthLabel = fullPeriodLabel.slice(0, 3);
73
- this.periodYearLabel = fullPeriodLabel.slice(4);
74
- }
75
- else {
76
- this.periodMonthLabel = '';
77
- this.periodYearLabel = fullPeriodLabel;
78
- }
79
- }
80
- setTimeframe() {
81
- this.timeframeSelection = false;
82
- this._calendar.currentView = this.selectedTimeframe;
83
- const chosenTimeframeOption = this.timeframeOptions.filter(option => option.value === this.selectedTimeframe)[0];
84
- this.setPeriodLabels(chosenTimeframeOption);
85
- this.datePickerService.format.next(chosenTimeframeOption.format);
86
- this.datePickerService.setTimeframe(chosenTimeframeOption.format);
87
- if (this.selectedTimeframe == 'none') {
88
- this.selectedQuarter = moment(this._calendar.activeDate).quarter();
89
- }
90
- }
91
- get currentViewIsQuater() {
92
- return !['month', 'year', 'multi-year'].includes(this._calendar.currentView);
93
- }
94
- switchViewOnClickOnPeriodLabel(view) {
95
- this._calendar.currentView = view;
96
- }
97
- onSelectQuater(quarterNumber) {
98
- const monthsInQuarter = 3;
99
- this.selectedQuarter = moment(this._calendar.activeDate).quarter();
100
- const unadaptedDate = this._dateAdapter.addCalendarMonths(this._calendar.activeDate, monthsInQuarter * (quarterNumber - this.selectedQuarter));
101
- this._calendar.activeDate = unadaptedDate;
102
- this.datePickerService.updatedQuater.next(moment(unadaptedDate));
103
- this.datePickerService.calendarInstance.close();
104
- }
105
- pagingClicked(forward) {
106
- this.pagingSetup[this.selectedTimeframe] && this.pagingSetup[this.selectedTimeframe](forward);
107
- }
108
- pagingDateChange(actionCall, amount, forward) {
109
- this._calendar.activeDate = this._dateAdapter[actionCall](this._calendar.activeDate, forward ? amount : -amount);
110
- const chosenTimeframeOption = this.timeframeOptions.filter(option => option.value === this.selectedTimeframe)[0];
111
- this.setPeriodLabels(chosenTimeframeOption);
112
- }
113
- }
114
- DrDatePickerCustomHeaderComponent.decorators = [
115
- { type: Component, args: [{
116
- selector: 'dr-date-picker_custom-header.component',
117
- template: "<div class=\"dr-datepicker__timeframe-select__wrapper\">\r\n <dr-select \r\n class=\"dr-datepicker__timeframe-select\"\r\n [(ngModel)]=\"selectedTimeframe\"\r\n [items]=\"timeframeOptions\"\r\n bindLabel=\"title\"\r\n bindValue=\"value\"\r\n (ngModelChange)=\"setTimeframe()\">\r\n </dr-select>\r\n</div>\r\n\r\n<div class=\"dr-date-paging\">\r\n <div class=\"dr-date-paging flip-page-button\"\r\n (click)=\"pagingClicked(false)\">\r\n <i class=\"dr-icon-arrow-left presentation_buttons-navigate_input\"></i> \r\n </div>\r\n <span class=\"example-header-label\">\r\n <span (click)=\"switchViewOnClickOnPeriodLabel('year')\">{{periodMonthLabel + ' '}}</span> \r\n <span (click)=\"switchViewOnClickOnPeriodLabel('multi-year')\">{{periodYearLabel}}</span>\r\n </span>\r\n <div class=\"dr-date-paging flip-page-button\"\r\n (click)=\"pagingClicked(true)\">\r\n <i class=\"dr-icon-arrow-right presentation_buttons-navigate_input\"></i>\r\n </div>\r\n</div>\r\n<div #quarterlyDatePicker class=\"dr-quarterly-datepicker\" *ngIf=\"currentViewIsQuater\">\r\n <div *ngFor=\"let quarter of quarters\" \r\n class=\"quarter-selector\" (click)=\"onSelectQuater(quarter)\"\r\n [class]=\"quarter == selectedQuarter ? 'selected' : ''\"\r\n >Q{{quarter}}</div>\r\n</div>\r\n\r\n",
118
- changeDetection: ChangeDetectionStrategy.OnPush,
119
- styles: [":host{height:54px;align-items:center;font-family:\"Poppins\";font-style:normal;font-weight:600;font-size:14px;line-height:22px}.dr-datepicker__timeframe-select__wrapper{background-color:#f9faff;padding:16px 32px;border-radius:18px 18px 0 0}.dr-date-paging{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:16px 8px;grid-gap:4px;gap:4px}.dr-date-paging.flip-page-button{width:20px;height:20px;padding:0;color:#4e566c}.dr-date-paging.flip-page-button:hover{border-radius:50%;background:#F2F2FB;color:#4646ce}.dr-quarterly-datepicker{display:flex;justify-content:space-between;padding:10px}.dr-quarterly-datepicker .quarter-selector{display:block;width:74px;height:40px;text-align:center;border-radius:40px;font-weight:400;padding-top:9px}.dr-quarterly-datepicker .quarter-selector:hover{background:#F2F2FB;color:#4646ce;font-weight:600;cursor:pointer}.dr-quarterly-datepicker .quarter-selector.selected{background-color:#4646ce;color:#f3f7ff;font-weight:600}\n"]
120
- },] }
121
- ];
122
- DrDatePickerCustomHeaderComponent.ctorParameters = () => [
123
- { type: MatCalendar },
124
- { type: DateAdapter },
125
- { type: CustomDateFormat, decorators: [{ type: Inject, args: [MAT_DATE_FORMATS,] }] },
126
- { type: ChangeDetectorRef },
127
- { type: DrDatePickerService }
128
- ];
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHItZGF0ZS1waWNrZXJfY3VzdG9tLWhlYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhcmFpbHNzaGFyZWQvc3JjL2xpYi9kci1pbnB1dHMvZHItZGF0ZS1waWNrZXIvZHItZGF0ZS1waWNrZXJfY3VzdG9tLWhlYWRlci9kci1kYXRlLXBpY2tlcl9jdXN0b20taGVhZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQWEsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBbUIsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2SSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVoRSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFpQmpDLE1BQU0sT0FBTyxpQ0FBaUM7SUEyQzFDLFlBQ1ksU0FBOEIsRUFDOUIsWUFBaUMsRUFDUCxZQUE4QixFQUN4RCxHQUFzQixFQUN0QixpQkFBc0M7UUFKdEMsY0FBUyxHQUFULFNBQVMsQ0FBcUI7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ1AsaUJBQVksR0FBWixZQUFZLENBQWtCO1FBQ3hELFFBQUcsR0FB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YW5nZURldGVjdGlvblN0cmF0ZWd5LCBPbkRlc3Ryb3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE1hdENhbGVuZGFyLCBNYXRDYWxlbmRhclZpZXcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcclxuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIE1BVF9EQVRFX0ZPUk1BVFN9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBDdXN0b21EYXRlRm9ybWF0LCBNQVRfREVGQVVMVF9EQVRFX0ZPUk1BVCwgTU9OVEhfWUVBUl9GT1JNQVQsIFFVQVJURVJfRk9STUFULCBZRUFSX0ZPUk1BVCB9IGZyb20gXCIuLi8uLi8uLi9tb2RlbHMvZGF0ZVBpY2tlclwiO1xyXG5pbXBvcnQgeyBEckRhdGVQaWNrZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL2RyLWRhdGUtcGlja2VyLnNlcnZpY2VcIjtcclxuXHJcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoJ21vbWVudCcpO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVGltZWZyYW1lT3B0aW9uIHtcclxuICAgICAgdGl0bGU6IHN0cmluZyxcclxuICAgICAgdmFsdWU6IE1hdENhbGVuZGFyVmlldyxcclxuICAgICAgZm9ybWF0OiBzdHJpbmcsXHJcbiAgICAgIHBlcmlvZExhYmVsOiAoKSA9PiBzdHJpbmdcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2RyLWRhdGUtcGlja2VyX2N1c3RvbS1oZWFkZXIuY29tcG9uZW50JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnZHItZGF0ZS1waWNrZXJfY3VzdG9tLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9kci1kYXRlLXBpY2tlcl9jdXN0b20taGVhZGVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG4gICAgXHJcbiAgfSlcclxuXHJcbmV4cG9ydCBjbGFzcyBEckRhdGVQaWNrZXJDdXN0b21IZWFkZXJDb21wb25lbnQ8TW9tZW50PiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgICBwcml2YXRlIF9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcXVhcnRlcnMgPSBbMSwgMiwgMywgNF07XHJcbiAgICBzZWxlY3RlZFF1YXJ0ZXIgPSAxO1xyXG4gICAgdGltZWZyYW1lT3B0aW9uczogSVRpbWVmcmFtZU9wdGlvbltdID0gW3tcclxuICAgICAgdGl0bGU6ICdEYXknLFxyXG4gICAgICB2YWx1ZTogJ21vbnRoJyxcclxuICAgICAgZm9ybWF0OiBNQVRfREVGQVVMVF9EQVRFX0ZPUk1BVCxcclxuICAgICAgcGVyaW9kTGFiZWw6ICgpID0+IHRoaXMuX2RhdGVBZGFwdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KHRoaXMuX2NhbGVuZGFyLmFjdGl2ZURhdGUsIHRoaXMuX2RhdGVGb3JtYXRzLmRpc3BsYXkubW9udGhZZWFyTGFiZWwpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVVcHBlckNhc2UoKVxyXG4gICAgfSx7XHJcbiAgICAgIHRpdGxlOiAnTW9udGgnLFxyXG4gICAgICB2YWx1ZTogJ3llYXInLFxyXG4gICAgICBmb3JtYXQ6IE1PTlRIX1lFQVJfRk9STUFULFxyXG4gICAgICBwZXJpb2RMYWJlbDogKCkgPT4gU3RyaW5nKG1vbWVudCh0aGlzLl9jYWxlbmRhci5hY3RpdmVEYXRlKS55ZWFyKCkpXHJcbiAgICB9LHtcclxuICAgICAgdGl0bGU6ICdRdWFydGVyJyxcclxuICAgICAgdmFsdWU6IDxNYXRDYWxlbmRhclZpZXc+ICdub25lJyxcclxuICAgICAgZm9ybWF0OiBRVUFSVEVSX0ZPUk1BVCxcclxuICAgICAgcGVyaW9kTGFiZWw6ICgpID0+IFN0cmluZyhtb21lbnQodGhpcy5fY2FsZW5kYXIuYWN0aXZlRGF0ZSkueWVhcigpKVxyXG4gICAgfSx7XHJcbiAgICAgIHRpdGxlOiAnWWVhcicsXHJcbiAgICAgIHZhbHVlOiAnbXVsdGkteWVhcicsXHJcbiAgICAgIGZvcm1hdDogWUVBUl9GT1JNQVQsXHJcbiAgICAgIHBlcmlvZExhYmVsOiAgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gbW9tZW50KHRoaXMuX2NhbGVuZGFyLmFjdGl2ZURhdGUpLnllYXIoKTtcclxuICAgICAgICBjb25zdCBzdGFydFBlcmlvZCA9IE1hdGguZmxvb3IoY3VycmVudFllYXIvMjQpKjI0O1xyXG4gICAgICAgIHJldHVybiBzdGFydFBlcmlvZCArICctJyArIChzdGFydFBlcmlvZCArIDIzKTtcclxuICAgICAgfVxyXG4gICAgfV1cclxuXHJcbiAgICBwYWdpbmdTZXR1cCA9IHtcclxuICAgICAgJ3llYXInOiAoZm9yd2FyZCkgPT4gIHRoaXMucGFnaW5nRGF0ZUNoYW5nZSgnYWRkQ2FsZW5kYXJZZWFycycsIDEsIGZvcndhcmQpLFxyXG4gICAgICAnbm9uZSc6IChmb3J3YXJkKSA9PiAgdGhpcy5wYWdpbmdEYXRlQ2hhbmdlKCdhZGRDYWxlbmRhclllYXJzJywgMSwgZm9yd2FyZCksXHJcbiAgICAgICdtb250aCc6IChmb3J3YXJkKSA9PiAgdGhpcy5wYWdpbmdEYXRlQ2hhbmdlKCdhZGRDYWxlbmRhck1vbnRocycsIDEsIGZvcndhcmQpLFxyXG4gICAgICAnbXVsdGkteWVhcic6IChmb3J3YXJkKSA9PiAgdGhpcy5wYWdpbmdEYXRlQ2hhbmdlKCdhZGRDYWxlbmRhclllYXJzJywgMjQsIGZvcndhcmQpXHJcbiAgICB9XHJcbiAgICAgXHJcbiAgICBzZWxlY3RlZFRpbWVmcmFtZTogTWF0Q2FsZW5kYXJWaWV3ID0gJ21vbnRoJztcclxuICAgIHRpbWVmcmFtZVNlbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgcGVyaW9kTW9udGhMYWJlbCA9ICcnO1xyXG4gICAgcGVyaW9kWWVhckxhYmVsID0gJyc7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIF9jYWxlbmRhcjogTWF0Q2FsZW5kYXI8TW9tZW50PixcclxuICAgICAgICBwcml2YXRlIF9kYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8TW9tZW50PixcclxuICAgICAgICBASW5qZWN0KE1BVF9EQVRFX0ZPUk1BVFMpIHByaXZhdGUgX2RhdGVGb3JtYXRzOiBDdXN0b21EYXRlRm9ybWF0LFxyXG4gICAgICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBwcml2YXRlIGRhdGVQaWNrZXJTZXJ2aWNlOiBEckRhdGVQaWNrZXJTZXJ2aWNlKSB7XHJcbiAgICAgICAgICBfY2FsZW5kYXIuc3RhdGVDaGFuZ2VzXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IGNkci5tYXJrRm9yQ2hlY2soKSk7XHJcbiAgICAgICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmZvcm1hdFxyXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCB2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRpbWVmcmFtZSA9IHRoaXMudGltZWZyYW1lT3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi5mb3JtYXQgPT0gdmFsdWUpWzBdLnZhbHVlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICB0aGlzLl9kZXN0cm95ZWQubmV4dCgpO1xyXG4gICAgICB0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRQZXJpb2RMYWJlbHMoY3VycmVudFRpbWVmcmFtZU9wdGlvbikge1xyXG4gICAgICBjb25zdCBmdWxsUGVyaW9kTGFiZWwgPSBjdXJyZW50VGltZWZyYW1lT3B0aW9uLnBlcmlvZExhYmVsKCk7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkVGltZWZyYW1lID09PSAnbW9udGgnKSB7XHJcbiAgICAgICAgdGhpcy5wZXJpb2RNb250aExhYmVsID0gZnVsbFBlcmlvZExhYmVsLnNsaWNlKDAsMyk7XHJcbiAgICAgICAgdGhpcy5wZXJpb2RZZWFyTGFiZWwgPSBmdWxsUGVyaW9kTGFiZWwuc2xpY2UoNCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wZXJpb2RNb250aExhYmVsID0gJyc7XHJcbiAgICAgICAgdGhpcy5wZXJpb2RZZWFyTGFiZWwgPSBmdWxsUGVyaW9kTGFiZWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgc2V0VGltZWZyYW1lKCkge1xyXG4gICAgICB0aGlzLnRpbWVmcmFtZVNlbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9jYWxlbmRhci5jdXJyZW50VmlldyA9IHRoaXMuc2VsZWN0ZWRUaW1lZnJhbWU7XHJcbiAgICAgIGNvbnN0IGNob3NlblRpbWVmcmFtZU9wdGlvbiA9IHRoaXMudGltZWZyYW1lT3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi52YWx1ZSA9PT0gdGhpcy5zZWxlY3RlZFRpbWVmcmFtZSlbMF07XHJcbiAgICAgIHRoaXMuc2V0UGVyaW9kTGFiZWxzKGNob3NlblRpbWVmcmFtZU9wdGlvbik7XHJcbiAgICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZm9ybWF0Lm5leHQoY2hvc2VuVGltZWZyYW1lT3B0aW9uLmZvcm1hdCk7ICBcclxuICAgICAgdGhpcy5kYXRlUGlja2VyU2VydmljZS5zZXRUaW1lZnJhbWUoY2hvc2VuVGltZWZyYW1lT3B0aW9uLmZvcm1hdCk7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkVGltZWZyYW1lID09IDxNYXRDYWxlbmRhclZpZXc+J25vbmUnKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFF1YXJ0ZXIgPSBtb21lbnQodGhpcy5fY2FsZW5kYXIuYWN0aXZlRGF0ZSkucXVhcnRlcigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRWaWV3SXNRdWF0ZXIoKSB7XHJcbiAgICAgIHJldHVybiAhWydtb250aCcsICd5ZWFyJywgJ211bHRpLXllYXInXS5pbmNsdWRlcyh0aGlzLl9jYWxlbmRhci5jdXJyZW50Vmlldyk7XHJcbiAgICB9XHJcbiBcclxuICAgIHN3aXRjaFZpZXdPbkNsaWNrT25QZXJpb2RMYWJlbCh2aWV3OiAneWVhcicgfCAnbXVsdGkteWVhcicpIHtcclxuICAgICAgdGhpcy5fY2FsZW5kYXIuY3VycmVudFZpZXcgPSB2aWV3O1xyXG4gICAgfVxyXG5cclxuICAgIG9uU2VsZWN0UXVhdGVyKHF1YXJ0ZXJOdW1iZXI6IG51bWJlcikge1xyXG4gICAgICBjb25zdCBtb250aHNJblF1YXJ0ZXIgPSAzO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUXVhcnRlciA9IG1vbWVudCh0aGlzLl9jYWxlbmRhci5hY3RpdmVEYXRlKS5xdWFydGVyKCk7XHJcblxyXG4gICAgICBjb25zdCB1bmFkYXB0ZWREYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fY2FsZW5kYXIuYWN0aXZlRGF0ZSxcclxuICAgICAgICBtb250aHNJblF1YXJ0ZXIgKiAocXVhcnRlck51bWJlciAtIHRoaXMuc2VsZWN0ZWRRdWFydGVyKSk7XHJcbiAgICAgIHRoaXMuX2NhbGVuZGFyLmFjdGl2ZURhdGUgPSB1bmFkYXB0ZWREYXRlO1xyXG4gICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLnVwZGF0ZWRRdWF0ZXIubmV4dChtb21lbnQodW5hZGFwdGVkRGF0ZSkpO1xyXG4gICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmNhbGVuZGFySW5zdGFuY2UuY2xvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwYWdpbmdDbGlja2VkKGZvcndhcmQpIHtcclxuICAgICAgdGhpcy5wYWdpbmdTZXR1cFt0aGlzLnNlbGVjdGVkVGltZWZyYW1lXSAmJiB0aGlzLnBhZ2luZ1NldHVwW3RoaXMuc2VsZWN0ZWRUaW1lZnJhbWVdKGZvcndhcmQpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhZ2luZ0RhdGVDaGFuZ2UoYWN0aW9uQ2FsbDogc3RyaW5nLCBhbW91bnQ6IG51bWJlciwgZm9yd2FyZDogYm9vbGVhbikge1xyXG4gICAgICB0aGlzLl9jYWxlbmRhci5hY3RpdmVEYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXJbYWN0aW9uQ2FsbF0odGhpcy5fY2FsZW5kYXIuYWN0aXZlRGF0ZSwgZm9yd2FyZD8gYW1vdW50OiAtIGFtb3VudCk7XHJcbiAgICAgIGNvbnN0IGNob3NlblRpbWVmcmFtZU9wdGlvbiA9IHRoaXMudGltZWZyYW1lT3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi52YWx1ZSA9PT0gdGhpcy5zZWxlY3RlZFRpbWVmcmFtZSlbMF07XHJcbiAgICAgIHRoaXMuc2V0UGVyaW9kTGFiZWxzKGNob3NlblRpbWVmcmFtZU9wdGlvbik7XHJcbiAgICB9XHJcbiAgfSJdfQ==
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject } from "@angular/core";
2
+ import { Subject } from "rxjs";
3
+ import { take, takeUntil } from 'rxjs/operators';
4
+ import { MatCalendar } from '@angular/material/datepicker';
5
+ import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
6
+ import { CustomDateFormat, MAT_DEFAULT_DATE_FORMAT, MONTH_YEAR_FORMAT, QUARTER_FORMAT, YEAR_FORMAT } from "../../../models/datePicker";
7
+ import { DrDatePickerService } from "../dr-date-picker.service";
8
+ const moment = require('moment');
9
+ export class DrDatePickerCustomHeaderComponent {
10
+ constructor(_calendar, _dateAdapter, _dateFormats, cdr, datePickerService) {
11
+ this._calendar = _calendar;
12
+ this._dateAdapter = _dateAdapter;
13
+ this._dateFormats = _dateFormats;
14
+ this.cdr = cdr;
15
+ this.datePickerService = datePickerService;
16
+ this._destroyed = new Subject();
17
+ this.quarters = [1, 2, 3, 4];
18
+ this.selectedQuarter = 1;
19
+ this.timeframeOptions = [{
20
+ title: 'Day',
21
+ value: 'month',
22
+ format: MAT_DEFAULT_DATE_FORMAT,
23
+ periodLabel: () => this._dateAdapter
24
+ .format(this._calendar.activeDate, this._dateFormats.display.monthYearLabel)
25
+ .toLocaleUpperCase()
26
+ }, {
27
+ title: 'Month',
28
+ value: 'year',
29
+ format: MONTH_YEAR_FORMAT,
30
+ periodLabel: () => String(moment(this._calendar.activeDate).year())
31
+ }, {
32
+ title: 'Quarter',
33
+ value: 'none',
34
+ format: QUARTER_FORMAT,
35
+ periodLabel: () => String(moment(this._calendar.activeDate).year())
36
+ }, {
37
+ title: 'Year',
38
+ value: 'multi-year',
39
+ format: YEAR_FORMAT,
40
+ periodLabel: () => {
41
+ const currentYear = moment(this._calendar.activeDate).year();
42
+ const startPeriod = Math.floor(currentYear / 24) * 24;
43
+ return startPeriod + '-' + (startPeriod + 23);
44
+ }
45
+ }];
46
+ this.pagingSetup = {
47
+ 'year': (forward) => this.pagingDateChange('addCalendarYears', 1, forward),
48
+ 'none': (forward) => this.pagingDateChange('addCalendarYears', 1, forward),
49
+ 'month': (forward) => this.pagingDateChange('addCalendarMonths', 1, forward),
50
+ 'multi-year': (forward) => this.pagingDateChange('addCalendarYears', 24, forward)
51
+ };
52
+ this.selectedTimeframe = 'month';
53
+ this.timeframeSelection = false;
54
+ this.periodMonthLabel = '';
55
+ this.periodYearLabel = '';
56
+ _calendar.stateChanges.pipe(takeUntil(this._destroyed)).subscribe(() => this.setPeriodLabels());
57
+ this.datePickerService.format
58
+ .pipe(take(1))
59
+ .subscribe(value => {
60
+ this.selectedTimeframe = this.timeframeOptions.filter(option => option.format == value)[0].value;
61
+ this.setPeriodLabels();
62
+ });
63
+ _calendar.viewChanged.pipe(takeUntil(this._destroyed)).subscribe(() => this.setPeriodLabels());
64
+ }
65
+ ngOnDestroy() {
66
+ this._destroyed.next();
67
+ this._destroyed.complete();
68
+ }
69
+ setPeriodLabels() {
70
+ const currentTimeframeOption = this.timeframeOptions.filter(option => option.value === this._calendar.currentView)[0];
71
+ const fullPeriodLabel = currentTimeframeOption.periodLabel();
72
+ if (this._calendar.currentView === 'month') {
73
+ this.periodMonthLabel = fullPeriodLabel.slice(0, 3);
74
+ this.periodYearLabel = fullPeriodLabel.slice(4);
75
+ }
76
+ else {
77
+ this.periodMonthLabel = '';
78
+ this.periodYearLabel = fullPeriodLabel;
79
+ }
80
+ this.cdr.markForCheck();
81
+ }
82
+ setTimeframe() {
83
+ this.timeframeSelection = false;
84
+ this._calendar.currentView = this.selectedTimeframe;
85
+ const chosenTimeframeOption = this.timeframeOptions.filter(option => option.value === this.selectedTimeframe)[0];
86
+ this.datePickerService.format.next(chosenTimeframeOption.format);
87
+ this.datePickerService.setTimeframe(chosenTimeframeOption.format);
88
+ if (this.selectedTimeframe == 'none') {
89
+ this.selectedQuarter = moment(this._calendar.activeDate).quarter();
90
+ }
91
+ }
92
+ get currentViewIsQuater() {
93
+ return !['month', 'year', 'multi-year'].includes(this._calendar.currentView);
94
+ }
95
+ switchViewOnClickOnPeriodLabel(view) {
96
+ this._calendar.currentView = view;
97
+ }
98
+ onSelectQuater(quarterNumber) {
99
+ const monthsInQuarter = 3;
100
+ this.selectedQuarter = moment(this._calendar.activeDate).quarter();
101
+ const unadaptedDate = this._dateAdapter.addCalendarMonths(this._calendar.activeDate, monthsInQuarter * (quarterNumber - this.selectedQuarter));
102
+ this._calendar.activeDate = unadaptedDate;
103
+ this.datePickerService.updatedQuater.next(moment(unadaptedDate));
104
+ this.datePickerService.calendarInstance.close();
105
+ }
106
+ pagingClicked(forward) {
107
+ this.pagingSetup[this._calendar.currentView] && this.pagingSetup[this._calendar.currentView](forward);
108
+ }
109
+ pagingDateChange(actionCall, amount, forward) {
110
+ this._calendar.activeDate = this._dateAdapter[actionCall](this._calendar.activeDate, forward ? amount : -amount);
111
+ this.setPeriodLabels();
112
+ }
113
+ }
114
+ DrDatePickerCustomHeaderComponent.decorators = [
115
+ { type: Component, args: [{
116
+ selector: 'dr-date-picker_custom-header.component',
117
+ template: "<div class=\"dr-datepicker__timeframe-select__wrapper\">\n <dr-select \n class=\"dr-datepicker__timeframe-select\"\n [(ngModel)]=\"selectedTimeframe\"\n [items]=\"timeframeOptions\"\n bindLabel=\"title\"\n bindValue=\"value\"\n (ngModelChange)=\"setTimeframe()\">\n </dr-select>\n</div>\n\n<div class=\"dr-date-paging\">\n <div class=\"dr-date-paging flip-page-button\"\n (click)=\"pagingClicked(false)\">\n <i class=\"dr-icon-arrow-left presentation_buttons-navigate_input\"></i> \n </div>\n <span class=\"example-header-label\">\n <span (click)=\"switchViewOnClickOnPeriodLabel('year')\">{{periodMonthLabel + ' '}}</span> \n <span (click)=\"switchViewOnClickOnPeriodLabel('multi-year')\">{{periodYearLabel}}</span>\n </span>\n <div class=\"dr-date-paging flip-page-button\"\n (click)=\"pagingClicked(true)\">\n <i class=\"dr-icon-arrow-right presentation_buttons-navigate_input\"></i>\n </div>\n</div>\n<div #quarterlyDatePicker class=\"dr-quarterly-datepicker\" *ngIf=\"currentViewIsQuater\">\n <div *ngFor=\"let quarter of quarters\" \n class=\"quarter-selector\" (click)=\"onSelectQuater(quarter)\"\n [class]=\"quarter == selectedQuarter ? 'selected' : ''\"\n >Q{{quarter}}</div>\n</div>\n\n",
118
+ changeDetection: ChangeDetectionStrategy.OnPush,
119
+ styles: [":host{height:54px;align-items:center;font-family:\"Poppins\";font-style:normal;font-weight:600;font-size:14px;line-height:22px}.dr-datepicker__timeframe-select__wrapper{background-color:#f9faff;padding:16px 32px;border-radius:18px 18px 0 0}.dr-date-paging{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:16px 8px;grid-gap:4px;gap:4px}.dr-date-paging.flip-page-button{width:20px;height:20px;padding:0;color:#4e566c}.dr-date-paging.flip-page-button:hover{border-radius:50%;background:#F2F2FB;color:#4646ce}.example-header-label{cursor:pointer}.dr-quarterly-datepicker{display:flex;justify-content:space-between;padding:10px}.dr-quarterly-datepicker .quarter-selector{display:block;width:74px;height:40px;text-align:center;border-radius:40px;font-weight:400;padding-top:9px}.dr-quarterly-datepicker .quarter-selector:hover{background:#F2F2FB;color:#4646ce;font-weight:600;cursor:pointer}.dr-quarterly-datepicker .quarter-selector.selected{background-color:#4646ce;color:#f3f7ff;font-weight:600}\n"]
120
+ },] }
121
+ ];
122
+ DrDatePickerCustomHeaderComponent.ctorParameters = () => [
123
+ { type: MatCalendar },
124
+ { type: DateAdapter },
125
+ { type: CustomDateFormat, decorators: [{ type: Inject, args: [MAT_DATE_FORMATS,] }] },
126
+ { type: ChangeDetectorRef },
127
+ { type: DrDatePickerService }
128
+ ];
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHItZGF0ZS1waWNrZXJfY3VzdG9tLWhlYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhcmFpbHNzaGFyZWQvc3JjL2xpYi9kci1pbnB1dHMvZHItZGF0ZS1waWNrZXIvZHItZGF0ZS1waWNrZXJfY3VzdG9tLWhlYWRlci9kci1kYXRlLXBpY2tlcl9jdXN0b20taGVhZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQWEsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBbUIsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2SSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVoRSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFpQmpDLE1BQU0sT0FBTyxpQ0FBaUM7SUEyQzFDLFlBQ1ksU0FBOEIsRUFDOUIsWUFBaUMsRUFDUCxZQUE4QixFQUN4RCxHQUFzQixFQUN0QixpQkFBc0M7UUFKdEMsY0FBUyxHQUFULFNBQVMsQ0FBcUI7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ1AsaUJBQVksR0FBWixZQUFZLENBQWtCO1FBQ3hELFFBQUcsR0FB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MENBQTBEO2dCQUUxRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFFaEQ7OztZQXBCTSxXQUFXO1lBQ1gsV0FBVztZQUNYLGdCQUFnQix1QkFrRWhCLE1BQU0sU0FBQyxnQkFBZ0I7WUF2RWEsaUJBQWlCO1lBTXJELG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBPbkRlc3Ryb3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1hdENhbGVuZGFyLCBNYXRDYWxlbmRhclZpZXcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IERhdGVBZGFwdGVyLCBNQVRfREFURV9GT1JNQVRTfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IEN1c3RvbURhdGVGb3JtYXQsIE1BVF9ERUZBVUxUX0RBVEVfRk9STUFULCBNT05USF9ZRUFSX0ZPUk1BVCwgUVVBUlRFUl9GT1JNQVQsIFlFQVJfRk9STUFUIH0gZnJvbSBcIi4uLy4uLy4uL21vZGVscy9kYXRlUGlja2VyXCI7XG5pbXBvcnQgeyBEckRhdGVQaWNrZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL2RyLWRhdGUtcGlja2VyLnNlcnZpY2VcIjtcblxuY29uc3QgbW9tZW50ID0gcmVxdWlyZSgnbW9tZW50Jyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRpbWVmcmFtZU9wdGlvbiB7XG4gICAgICB0aXRsZTogc3RyaW5nLFxuICAgICAgdmFsdWU6IE1hdENhbGVuZGFyVmlldyxcbiAgICAgIGZvcm1hdDogc3RyaW5nLFxuICAgICAgcGVyaW9kTGFiZWw6ICgpID0+IHN0cmluZ1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2RyLWRhdGUtcGlja2VyX2N1c3RvbS1oZWFkZXIuY29tcG9uZW50JyxcbiAgICB0ZW1wbGF0ZVVybDogJ2RyLWRhdGUtcGlja2VyX2N1c3RvbS1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RyLWRhdGUtcGlja2VyX2N1c3RvbS1oZWFkZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxuICAgIFxuICB9KVxuXG5leHBvcnQgY2xhc3MgRHJEYXRlUGlja2VyQ3VzdG9tSGVhZGVyQ29tcG9uZW50PE1vbWVudD4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgX2Rlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcXVhcnRlcnMgPSBbMSwgMiwgMywgNF07XG4gICAgc2VsZWN0ZWRRdWFydGVyID0gMTtcbiAgICB0aW1lZnJhbWVPcHRpb25zOiBJVGltZWZyYW1lT3B0aW9uW10gPSBbe1xuICAgICAgdGl0bGU6ICdEYXknLFxuICAgICAgdmFsdWU6ICdtb250aCcsXG4gICAgICBmb3JtYXQ6IE1BVF9ERUZBVUxUX0RBVEVfRk9STUFULFxuICAgICAgcGVyaW9kTGFiZWw6ICgpID0+IHRoaXMuX2RhdGVBZGFwdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdCh0aGlzLl9jYWxlbmRhci5hY3RpdmVEYXRlLCB0aGlzLl9kYXRlRm9ybWF0cy5kaXNwbGF5Lm1vbnRoWWVhckxhYmVsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVVwcGVyQ2FzZSgpXG4gICAgfSx7XG4gICAgICB0aXRsZTogJ01vbnRoJyxcbiAgICAgIHZhbHVlOiAneWVhcicsXG4gICAgICBmb3JtYXQ6IE1PTlRIX1lFQVJfRk9STUFULFxuICAgICAgcGVyaW9kTGFiZWw6ICgpID0+IFN0cmluZyhtb21lbnQodGhpcy5fY2FsZW5kYXIuYWN0aXZlRGF0ZSkueWVhcigpKVxuICAgIH0se1xuICAgICAgdGl0bGU6ICdRdWFydGVyJyxcbiAgICAgIHZhbHVlOiA8TWF0Q2FsZW5kYXJWaWV3PiAnbm9uZScsXG4gICAgICBmb3JtYXQ6IFFVQVJURVJfRk9STUFULFxuICAgICAgcGVyaW9kTGFiZWw6ICgpID0+IFN0cmluZyhtb21lbnQodGhpcy5fY2FsZW5kYXIuYWN0aXZlRGF0ZSkueWVhcigpKVxuICAgIH0se1xuICAgICAgdGl0bGU6ICdZZWFyJyxcbiAgICAgIHZhbHVlOiAnbXVsdGkteWVhcicsXG4gICAgICBmb3JtYXQ6IFlFQVJfRk9STUFULFxuICAgICAgcGVyaW9kTGFiZWw6ICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gbW9tZW50KHRoaXMuX2NhbGVuZGFyLmFjdGl2ZURhdGUpLnllYXIoKTtcbiAgICAgICAgY29uc3Qgc3RhcnRQZXJpb2QgPSBNYXRoLmZsb29yKGN1cnJlbnRZZWFyLzI0KSoyNDtcbiAgICAgICAgcmV0dXJuIHN0YXJ0UGVyaW9kICsgJy0nICsgKHN0YXJ0UGVyaW9kICsgMjMpO1xuICAgICAgfVxuICAgIH1dXG5cbiAgICBwYWdpbmdTZXR1cCA9IHtcbiAgICAgICd5ZWFyJzogKGZvcndhcmQpID0+ICB0aGlzLnBhZ2luZ0RhdGVDaGFuZ2UoJ2FkZENhbGVuZGFyWWVhcnMnLCAxLCBmb3J3YXJkKSxcbiAgICAgICdub25lJzogKGZvcndhcmQpID0+ICB0aGlzLnBhZ2luZ0RhdGVDaGFuZ2UoJ2FkZENhbGVuZGFyWWVhcnMnLCAxLCBmb3J3YXJkKSxcbiAgICAgICdtb250aCc6IChmb3J3YXJkKSA9PiAgdGhpcy5wYWdpbmdEYXRlQ2hhbmdlKCdhZGRDYWxlbmRhck1vbnRocycsIDEsIGZvcndhcmQpLFxuICAgICAgJ211bHRpLXllYXInOiAoZm9yd2FyZCkgPT4gIHRoaXMucGFnaW5nRGF0ZUNoYW5nZSgnYWRkQ2FsZW5kYXJZZWFycycsIDI0LCBmb3J3YXJkKVxuICAgIH1cbiAgICAgXG4gICAgc2VsZWN0ZWRUaW1lZnJhbWU6IE1hdENhbGVuZGFyVmlldyA9ICdtb250aCc7XG4gICAgdGltZWZyYW1lU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgcGVyaW9kTW9udGhMYWJlbCA9ICcnO1xuICAgIHBlcmlvZFllYXJMYWJlbCA9ICcnO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9jYWxlbmRhcjogTWF0Q2FsZW5kYXI8TW9tZW50PixcbiAgICAgICAgcHJpdmF0ZSBfZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPE1vbWVudD4sXG4gICAgICAgIEBJbmplY3QoTUFUX0RBVEVfRk9STUFUUykgcHJpdmF0ZSBfZGF0ZUZvcm1hdHM6IEN1c3RvbURhdGVGb3JtYXQsXG4gICAgICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBkYXRlUGlja2VyU2VydmljZTogRHJEYXRlUGlja2VyU2VydmljZSkge1xuICAgICAgICAgIF9jYWxlbmRhci5zdGF0ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2V0UGVyaW9kTGFiZWxzKCkpO1xuICAgICAgICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZm9ybWF0XG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSggdmFsdWUgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGltZWZyYW1lID0gdGhpcy50aW1lZnJhbWVPcHRpb25zLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uLmZvcm1hdCA9PSB2YWx1ZSlbMF0udmFsdWU7XG4gICAgICAgICAgICAgIHRoaXMuc2V0UGVyaW9kTGFiZWxzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2FsZW5kYXIudmlld0NoYW5nZWQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2V0UGVyaW9kTGFiZWxzKCkpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTtcbiAgICAgIHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHNldFBlcmlvZExhYmVscygpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lZnJhbWVPcHRpb24gPSB0aGlzLnRpbWVmcmFtZU9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiBvcHRpb24udmFsdWUgPT09IHRoaXMuX2NhbGVuZGFyLmN1cnJlbnRWaWV3KVswXTtcbiAgICAgIGNvbnN0IGZ1bGxQZXJpb2RMYWJlbCA9IGN1cnJlbnRUaW1lZnJhbWVPcHRpb24ucGVyaW9kTGFiZWwoKTtcbiAgICAgIGlmICh0aGlzLl9jYWxlbmRhci5jdXJyZW50VmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgICB0aGlzLnBlcmlvZE1vbnRoTGFiZWwgPSBmdWxsUGVyaW9kTGFiZWwuc2xpY2UoMCwzKTtcbiAgICAgICAgdGhpcy5wZXJpb2RZZWFyTGFiZWwgPSBmdWxsUGVyaW9kTGFiZWwuc2xpY2UoNCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBlcmlvZE1vbnRoTGFiZWwgPSAnJztcbiAgICAgICAgdGhpcy5wZXJpb2RZZWFyTGFiZWwgPSBmdWxsUGVyaW9kTGFiZWw7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgXG4gICAgc2V0VGltZWZyYW1lKCkge1xuICAgICAgdGhpcy50aW1lZnJhbWVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuX2NhbGVuZGFyLmN1cnJlbnRWaWV3ID0gdGhpcy5zZWxlY3RlZFRpbWVmcmFtZTtcbiAgICAgIGNvbnN0IGNob3NlblRpbWVmcmFtZU9wdGlvbiA9IHRoaXMudGltZWZyYW1lT3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi52YWx1ZSA9PT0gdGhpcy5zZWxlY3RlZFRpbWVmcmFtZSlbMF07XG4gICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmZvcm1hdC5uZXh0KGNob3NlblRpbWVmcmFtZU9wdGlvbi5mb3JtYXQpOyAgXG4gICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLnNldFRpbWVmcmFtZShjaG9zZW5UaW1lZnJhbWVPcHRpb24uZm9ybWF0KTtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkVGltZWZyYW1lID09IDxNYXRDYWxlbmRhclZpZXc+J25vbmUnKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRRdWFydGVyID0gbW9tZW50KHRoaXMuX2NhbGVuZGFyLmFjdGl2ZURhdGUpLnF1YXJ0ZXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgY3VycmVudFZpZXdJc1F1YXRlcigpIHtcbiAgICAgIHJldHVybiAhWydtb250aCcsICd5ZWFyJywgJ211bHRpLXllYXInXS5pbmNsdWRlcyh0aGlzLl9jYWxlbmRhci5jdXJyZW50Vmlldyk7XG4gICAgfVxuIFxuICAgIHN3aXRjaFZpZXdPbkNsaWNrT25QZXJpb2RMYWJlbCh2aWV3OiAneWVhcicgfCAnbXVsdGkteWVhcicpIHtcbiAgICAgIHRoaXMuX2NhbGVuZGFyLmN1cnJlbnRWaWV3ID0gdmlldztcbiAgICB9XG5cbiAgICBvblNlbGVjdFF1YXRlcihxdWFydGVyTnVtYmVyOiBudW1iZXIpIHtcbiAgICAgIGNvbnN0IG1vbnRoc0luUXVhcnRlciA9IDM7XG4gICAgICB0aGlzLnNlbGVjdGVkUXVhcnRlciA9IG1vbWVudCh0aGlzLl9jYWxlbmRhci5hY3RpdmVEYXRlKS5xdWFydGVyKCk7XG5cbiAgICAgIGNvbnN0IHVuYWRhcHRlZERhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9jYWxlbmRhci5hY3RpdmVEYXRlLFxuICAgICAgICBtb250aHNJblF1YXJ0ZXIgKiAocXVhcnRlck51bWJlciAtIHRoaXMuc2VsZWN0ZWRRdWFydGVyKSk7XG4gICAgICB0aGlzLl9jYWxlbmRhci5hY3RpdmVEYXRlID0gdW5hZGFwdGVkRGF0ZTtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UudXBkYXRlZFF1YXRlci5uZXh0KG1vbWVudCh1bmFkYXB0ZWREYXRlKSk7XG4gICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmNhbGVuZGFySW5zdGFuY2UuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBwYWdpbmdDbGlja2VkKGZvcndhcmQpIHtcbiAgICAgIHRoaXMucGFnaW5nU2V0dXBbdGhpcy5fY2FsZW5kYXIuY3VycmVudFZpZXddICYmIHRoaXMucGFnaW5nU2V0dXBbdGhpcy5fY2FsZW5kYXIuY3VycmVudFZpZXddKGZvcndhcmQpO1xuICAgIH1cblxuICAgIHBhZ2luZ0RhdGVDaGFuZ2UoYWN0aW9uQ2FsbDogc3RyaW5nLCBhbW91bnQ6IG51bWJlciwgZm9yd2FyZDogYm9vbGVhbikge1xuICAgICAgdGhpcy5fY2FsZW5kYXIuYWN0aXZlRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyW2FjdGlvbkNhbGxdKHRoaXMuX2NhbGVuZGFyLmFjdGl2ZURhdGUsIGZvcndhcmQ/IGFtb3VudDogLSBhbW91bnQpO1xuICAgICAgdGhpcy5zZXRQZXJpb2RMYWJlbHMoKTtcbiAgICB9XG4gIH0iXX0=