@progressio_resources/gravity-design-system 2.3.3 → 2.4.0

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.
@@ -1,10 +1,8 @@
1
- import { AfterViewInit, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
- import { NgbDate, NgbDateStruct } from "@ng-bootstrap/ng-bootstrap";
3
- import { GravityMonthPickerDate } from "./gravity-month-picker/gravity-month-picker.component";
1
+ import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
4
2
  import * as i0 from "@angular/core";
5
- export declare class GravityCalendarComponent implements OnChanges, AfterViewInit {
3
+ export declare class GravityCalendarComponent implements OnChanges {
6
4
  calendarResponse: EventEmitter<Date>;
7
- calendarType: 'date' | 'month';
5
+ calendarType: 'day' | 'month' | 'year';
8
6
  currentLang: string;
9
7
  cypressTag: string;
10
8
  datesConfig: {
@@ -14,38 +12,26 @@ export declare class GravityCalendarComponent implements OnChanges, AfterViewIni
14
12
  minDate?: Date;
15
13
  };
16
14
  label: string;
17
- monthConfig: {
18
- customMonthDate?: GravityMonthPickerDate;
19
- maxMonthDate?: GravityMonthPickerDate;
20
- minMonthDate?: GravityMonthPickerDate;
21
- };
22
15
  required: boolean;
23
16
  state: 'readonly' | 'disabled' | 'enabled';
24
17
  supportTextContent: string;
25
18
  supportTextType: 'neutro' | 'negative' | 'positive';
26
- private datePicker;
27
- private datepickerInput;
28
- private monthPickerInput;
29
- calendarOpened: boolean;
19
+ bsDatepickerConfig: {
20
+ containerClass: string;
21
+ isAnimated: boolean;
22
+ selectFromOtherMonth: boolean;
23
+ showWeekNumbers: boolean;
24
+ };
25
+ readonly elementId: string;
30
26
  focusInput: boolean;
31
- maxDate: NgbDateStruct;
32
- minDate: NgbDateStruct;
27
+ maxDate: Date;
28
+ minDate: Date;
33
29
  selectedDate: Date;
34
- selectedDateInput: string;
35
- private customDateFlag;
30
+ constructor();
36
31
  ngOnChanges(changes: SimpleChanges): void;
37
- ngAfterViewInit(): void;
38
- updateSelectedDate($event: NgbDate): void;
39
- focusCustomDate(customDate: Date): void;
32
+ updateSelectedDate($event: Date): void;
40
33
  resetCalendar(newDate: Date): void;
41
- private changeDateManually;
42
- private static formatNgbDate;
43
- private static formatMonthDate;
44
- private static formatTSDate;
45
- private static formatDateToNgbDateStruct;
46
- private static convertNgbDateToDate;
47
- private static convertMonthDateToDate;
48
- handleMonthPickerResponse(response: GravityMonthPickerDate): void;
34
+ getBsDatepickerContainer(): string;
49
35
  static ɵfac: i0.ɵɵFactoryDeclaration<GravityCalendarComponent, never>;
50
- static ɵcmp: i0.ɵɵComponentDeclaration<GravityCalendarComponent, "gravity-calendar", never, { "calendarType": { "alias": "calendarType"; "required": false; }; "currentLang": { "alias": "currentLang"; "required": false; }; "cypressTag": { "alias": "cypressTag"; "required": false; }; "datesConfig": { "alias": "datesConfig"; "required": false; }; "label": { "alias": "label"; "required": false; }; "monthConfig": { "alias": "monthConfig"; "required": false; }; "required": { "alias": "required"; "required": false; }; "state": { "alias": "state"; "required": false; }; "supportTextContent": { "alias": "supportTextContent"; "required": false; }; "supportTextType": { "alias": "supportTextType"; "required": false; }; }, { "calendarResponse": "response"; }, never, never, false, never>;
36
+ static ɵcmp: i0.ɵɵComponentDeclaration<GravityCalendarComponent, "gravity-calendar", never, { "calendarType": { "alias": "calendarType"; "required": false; }; "currentLang": { "alias": "currentLang"; "required": false; }; "cypressTag": { "alias": "cypressTag"; "required": false; }; "datesConfig": { "alias": "datesConfig"; "required": false; }; "label": { "alias": "label"; "required": false; }; "required": { "alias": "required"; "required": false; }; "state": { "alias": "state"; "required": false; }; "supportTextContent": { "alias": "supportTextContent"; "required": false; }; "supportTextType": { "alias": "supportTextType"; "required": false; }; }, { "calendarResponse": "response"; }, never, never, false, never>;
51
37
  }
@@ -1,12 +1,17 @@
1
- import { EventEmitter } from '@angular/core';
2
- import { PrettyRadioChange } from "ngx-pretty-checkbox";
1
+ import { AfterViewInit, EventEmitter } from '@angular/core';
3
2
  import * as i0 from "@angular/core";
4
- export declare class GravityCheckboxComponent {
5
- value: any;
6
- disabled: boolean;
3
+ export declare class GravityCheckboxComponent implements AfterViewInit {
7
4
  checked: boolean;
8
- change: EventEmitter<PrettyRadioChange>;
9
- onChange(event: PrettyRadioChange): void;
5
+ disabled: boolean;
6
+ name: string;
7
+ value: string;
8
+ change: EventEmitter<{
9
+ value: string;
10
+ checked: boolean;
11
+ }>;
12
+ isCheckboxActive: boolean;
13
+ ngAfterViewInit(): void;
14
+ toggleCheckbox(): void;
10
15
  static ɵfac: i0.ɵɵFactoryDeclaration<GravityCheckboxComponent, never>;
11
- static ɵcmp: i0.ɵɵComponentDeclaration<GravityCheckboxComponent, "gravity-checkbox", never, { "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "checked": { "alias": "checked"; "required": false; }; }, { "change": "change"; }, never, ["*"], false, never>;
16
+ static ɵcmp: i0.ɵɵComponentDeclaration<GravityCheckboxComponent, "gravity-checkbox", never, { "checked": { "alias": "checked"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "name": { "alias": "name"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, { "change": "change"; }, never, ["*"], false, never>;
12
17
  }
@@ -1,7 +1,6 @@
1
- import { EventEmitter } from '@angular/core';
2
- import { PrettyCheckBoxChange } from "ngx-pretty-checkbox/lib/model";
1
+ import { AfterViewInit, EventEmitter } from '@angular/core';
3
2
  import * as i0 from "@angular/core";
4
- export declare class GravitySwitchComponent {
3
+ export declare class GravitySwitchComponent implements AfterViewInit {
5
4
  currentLang: string;
6
5
  customCheck: boolean;
7
6
  cypressTag: string;
@@ -10,7 +9,9 @@ export declare class GravitySwitchComponent {
10
9
  state: 'readonly' | 'disabled' | 'enabled';
11
10
  toggleOptions: string[];
12
11
  switchResponse: EventEmitter<boolean>;
13
- toggleSwitchHandler($event: PrettyCheckBoxChange): void;
12
+ isSwitchActive: boolean;
13
+ ngAfterViewInit(): void;
14
+ toggleSwitch(): void;
14
15
  static ɵfac: i0.ɵɵFactoryDeclaration<GravitySwitchComponent, never>;
15
16
  static ɵcmp: i0.ɵɵComponentDeclaration<GravitySwitchComponent, "gravity-switch", never, { "currentLang": { "alias": "currentLang"; "required": false; }; "customCheck": { "alias": "customCheck"; "required": false; }; "cypressTag": { "alias": "cypressTag"; "required": false; }; "label": { "alias": "label"; "required": false; }; "required": { "alias": "required"; "required": false; }; "state": { "alias": "state"; "required": false; }; "toggleOptions": { "alias": "toggleOptions"; "required": false; }; }, { "switchResponse": "response"; }, never, never, false, never>;
16
17
  }
@@ -6,21 +6,21 @@ import * as i4 from "./components/gravity-checkbox/gravity-checkbox.component";
6
6
  import * as i5 from "./components/gravity-dialog/gravity-dialog.component";
7
7
  import * as i6 from "./components/gravity-dropdown-list/gravity-dropdown-list.component";
8
8
  import * as i7 from "./components/gravity-icon/gravity-icon.component";
9
- import * as i8 from "./components/gravity-calendar/gravity-month-picker/gravity-month-picker.component";
10
- import * as i9 from "./components/gravity-notification/gravity-notification.component";
11
- import * as i10 from "./components/gravity-notification-instant/gravity-notification-instant-container.component";
12
- import * as i11 from "./components/gravity-radio-button/gravity-radio-button.component";
13
- import * as i12 from "./components/gravity-stepper/gravity-stepper.component";
14
- import * as i13 from "./components/gravity-switch/gravity-switch.component";
15
- import * as i14 from "./components/gravity-table/gravity-table.component";
16
- import * as i15 from "./components/gravity-text-field/gravity-text-field.component";
17
- import * as i16 from "./components/gravity-tree-view/gravity-tree-view.component";
18
- import * as i17 from "./components/gravity-tree-view/node/node.component";
19
- import * as i18 from "./components/gravity-tree-view/node/node-toggle/node-toggle.component";
20
- import * as i19 from "./components/gravity-tree-view/node/node-checkbox/node-checkbox.component";
21
- import * as i20 from "./components/gravity-tree-view/node/node-name/node-name.component";
22
- import * as i21 from "angular-svg-icon";
23
- import * as i22 from "angular-svg-icon-preloader";
9
+ import * as i8 from "./components/gravity-notification/gravity-notification.component";
10
+ import * as i9 from "./components/gravity-notification-instant/gravity-notification-instant-container.component";
11
+ import * as i10 from "./components/gravity-radio-button/gravity-radio-button.component";
12
+ import * as i11 from "./components/gravity-stepper/gravity-stepper.component";
13
+ import * as i12 from "./components/gravity-switch/gravity-switch.component";
14
+ import * as i13 from "./components/gravity-table/gravity-table.component";
15
+ import * as i14 from "./components/gravity-text-field/gravity-text-field.component";
16
+ import * as i15 from "./components/gravity-tree-view/gravity-tree-view.component";
17
+ import * as i16 from "./components/gravity-tree-view/node/node.component";
18
+ import * as i17 from "./components/gravity-tree-view/node/node-toggle/node-toggle.component";
19
+ import * as i18 from "./components/gravity-tree-view/node/node-checkbox/node-checkbox.component";
20
+ import * as i19 from "./components/gravity-tree-view/node/node-name/node-name.component";
21
+ import * as i20 from "angular-svg-icon";
22
+ import * as i21 from "angular-svg-icon-preloader";
23
+ import * as i22 from "ngx-bootstrap/datepicker";
24
24
  import * as i23 from "@angular/common";
25
25
  import * as i24 from "@angular/forms";
26
26
  import * as i25 from "./vendor/gravity-tooltip/gravity-tooltip.module";
@@ -29,6 +29,6 @@ import * as i27 from "@ng-select/ng-select";
29
29
  import * as i28 from "ngx-pretty-checkbox";
30
30
  export declare class GravityDesignSystemModule {
31
31
  static ɵfac: i0.ɵɵFactoryDeclaration<GravityDesignSystemModule, never>;
32
- static ɵmod: i0.ɵɵNgModuleDeclaration<GravityDesignSystemModule, [typeof i1.GravityAttachFileComponent, typeof i2.GravityButtonComponent, typeof i3.GravityCalendarComponent, typeof i4.GravityCheckboxComponent, typeof i5.GravityDialogComponent, typeof i6.GravityDropdownListComponent, typeof i7.GravityIconComponent, typeof i8.GravityMonthPickerComponent, typeof i9.GravityNotificationComponent, typeof i10.GravityNotificationInstantContainerComponent, typeof i11.GravityRadioButtonComponent, typeof i12.GravityStepperComponent, typeof i13.GravitySwitchComponent, typeof i14.GravityTableComponent, typeof i15.GravityTextFieldComponent, typeof i16.GravityTreeViewComponent, typeof i17.NodeComponent, typeof i18.NodeToggleComponent, typeof i19.NodeCheckboxComponent, typeof i20.NodeNameComponent], [typeof i21.AngularSvgIconModule, typeof i22.AngularSvgIconPreloaderModule, typeof i23.CommonModule, typeof i24.FormsModule, typeof i25.GravityTooltipModule, typeof i26.NgbDatepickerModule, typeof i26.NgbProgressbarModule, typeof i26.NgbToastModule, typeof i27.NgSelectModule, typeof i28.NgxPrettyCheckboxModule, typeof i24.ReactiveFormsModule], [typeof i1.GravityAttachFileComponent, typeof i2.GravityButtonComponent, typeof i3.GravityCalendarComponent, typeof i4.GravityCheckboxComponent, typeof i5.GravityDialogComponent, typeof i6.GravityDropdownListComponent, typeof i7.GravityIconComponent, typeof i10.GravityNotificationInstantContainerComponent, typeof i11.GravityRadioButtonComponent, typeof i12.GravityStepperComponent, typeof i13.GravitySwitchComponent, typeof i14.GravityTableComponent, typeof i15.GravityTextFieldComponent, typeof i25.GravityTooltipModule, typeof i16.GravityTreeViewComponent]>;
32
+ static ɵmod: i0.ɵɵNgModuleDeclaration<GravityDesignSystemModule, [typeof i1.GravityAttachFileComponent, typeof i2.GravityButtonComponent, typeof i3.GravityCalendarComponent, typeof i4.GravityCheckboxComponent, typeof i5.GravityDialogComponent, typeof i6.GravityDropdownListComponent, typeof i7.GravityIconComponent, typeof i8.GravityNotificationComponent, typeof i9.GravityNotificationInstantContainerComponent, typeof i10.GravityRadioButtonComponent, typeof i11.GravityStepperComponent, typeof i12.GravitySwitchComponent, typeof i13.GravityTableComponent, typeof i14.GravityTextFieldComponent, typeof i15.GravityTreeViewComponent, typeof i16.NodeComponent, typeof i17.NodeToggleComponent, typeof i18.NodeCheckboxComponent, typeof i19.NodeNameComponent], [typeof i20.AngularSvgIconModule, typeof i21.AngularSvgIconPreloaderModule, typeof i22.BsDatepickerModule, typeof i23.CommonModule, typeof i24.FormsModule, typeof i25.GravityTooltipModule, typeof i26.NgbDatepickerModule, typeof i26.NgbProgressbarModule, typeof i26.NgbToastModule, typeof i27.NgSelectModule, typeof i28.NgxPrettyCheckboxModule, typeof i24.ReactiveFormsModule], [typeof i1.GravityAttachFileComponent, typeof i2.GravityButtonComponent, typeof i3.GravityCalendarComponent, typeof i4.GravityCheckboxComponent, typeof i5.GravityDialogComponent, typeof i6.GravityDropdownListComponent, typeof i7.GravityIconComponent, typeof i9.GravityNotificationInstantContainerComponent, typeof i10.GravityRadioButtonComponent, typeof i11.GravityStepperComponent, typeof i12.GravitySwitchComponent, typeof i13.GravityTableComponent, typeof i14.GravityTextFieldComponent, typeof i25.GravityTooltipModule, typeof i15.GravityTreeViewComponent]>;
33
33
  static ɵinj: i0.ɵɵInjectorDeclaration<GravityDesignSystemModule>;
34
34
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@progressio_resources/gravity-design-system",
3
3
  "description": "Gravity Design System",
4
- "version": "2.3.3",
4
+ "version": "2.4.0",
5
5
  "license": "SEE LICENSE IN LIBRARY-LICENSE",
6
6
  "peerDependencies": {
7
7
  "@angular/common": "^16.2.12",
@@ -12,6 +12,7 @@
12
12
  "@popperjs/core": "^2.11.8",
13
13
  "angular-svg-icon": "^16.1.0",
14
14
  "angular-svg-icon-preloader": "^6.0.0",
15
+ "ngx-bootstrap": "^12.0.0",
15
16
  "ngx-pretty-checkbox": "^16.0.0",
16
17
  "pretty-checkbox": "^3.0.3"
17
18
  },
@@ -1,117 +1,169 @@
1
1
  @import "../foundations/typography/hero.typography";
2
+ @import "../foundations/spacing/spacing";
2
3
  @import "../foundations/border-radius/hero.border-radius";
3
4
  @import "../shared";
4
5
 
5
- ngb-datepicker.gravity-datepicker-dialog {
6
+ $datepicker-min-width: 15rem;
7
+
8
+ bs-datepicker-container {
9
+ z-index: 1;
10
+ }
11
+
12
+ .gravity-datepicker-dialog {
6
13
  background-color: var(--bg-calender-primary);
7
14
  border-radius: $border-radius-md;
8
15
  box-shadow: 0 0 10px #AAA;
9
16
  color: var(--on-bg-calender-primary);
10
17
 
11
- .ngb-dp-header {
18
+ .bs-datepicker-head {
12
19
  background-color: var(--bg-calendar-nav-primary);
13
20
  border-top-left-radius: $border-radius-md;
14
21
  border-top-right-radius: $border-radius-md;
15
22
  color: var(--on-bg-calendar-nav-primary);
16
23
  height: 3.125rem;
17
- min-width: 17.75rem;
24
+ min-width: $datepicker-min-width;
18
25
  padding: 0.625rem;
19
26
 
20
- ngb-datepicker-navigation {
21
- .ngb-dp-arrow {
22
- button {
23
- @extend .hr-label, .sm-regular;
27
+ bs-datepicker-navigation-view {
28
+ align-items: center;
29
+ display: flex;
30
+ justify-content: space-between;
24
31
 
25
- border-radius: 50%;
26
- color: var(--arrow-calendar-active-primary);
27
- cursor: pointer;
28
- height: 2rem;
29
- margin: 0;
30
- outline: none;
31
- padding: 0;
32
- width: 2rem;
33
-
34
- span {
35
- border: none;
36
- display: inline-block;
37
- font-size: 1.75rem;
38
- height: 100%;
39
- line-height: 1;
40
- margin: 0;
41
- position: relative;
42
- transform: none;
43
- width: 100%;
44
- }
45
-
46
- &:not([disabled]):hover {
47
- background-color: var(--bg-arrow-calendar-hover-primary);
48
- color: var(--arrow-calendar-hover-primary);
49
- }
50
-
51
- &[disabled] {
52
- color: var(--arrow-calendar-disabled-primary);
53
- cursor: not-allowed;
54
- }
32
+ .previous,
33
+ .next {
34
+ @extend .hr-label, .sm-regular;
35
+
36
+ background-color: var(--bg-calendar-nav-primary);
37
+ border: none;
38
+ border-radius: $border-radius-rounded;
39
+ color: var(--arrow-calendar-active-primary);
40
+ cursor: pointer;
41
+ height: 2rem;
42
+ outline: none;
43
+ width: 2rem;
44
+
45
+ span {
46
+ border: none;
47
+ display: inline-block;
48
+ font-size: 1.75rem;
49
+ height: 100%;
50
+ line-height: 1;
51
+ width: 100%;
55
52
  }
56
53
 
57
- &.ngb-dp-arrow-prev button span:before {
58
- content: "‹";
54
+ &:not([disabled]):hover {
55
+ background-color: var(--bg-arrow-calendar-hover-primary);
56
+ color: var(--arrow-calendar-hover-primary);
59
57
  }
60
58
 
61
- &.ngb-dp-arrow-next button span:after {
62
- content: "›";
59
+ &[disabled] {
60
+ color: var(--arrow-calendar-disabled-primary);
61
+ cursor: not-allowed;
63
62
  }
64
63
  }
65
64
 
66
- .ngb-dp-month-name {
65
+ .current {
67
66
  @extend .hr-label, .md-regular;
67
+
68
68
  background-color: var(--bg-calendar-nav-primary);
69
+ border: none;
70
+ border-radius: $border-radius-rounded;
71
+ color: var(--on-bg-calendar-nav-primary);
72
+ cursor: pointer;
73
+ height: 2rem;
74
+ outline: none;
75
+ padding-inline: map-get($spacing-values, sm);
76
+
77
+ &:not([disabled]):hover {
78
+ background-color: var(--bg-arrow-calendar-hover-primary);
79
+ color: var(--arrow-calendar-hover-primary);
80
+ }
81
+
82
+ &[disabled] {
83
+ color: var(--arrow-calendar-disabled-primary);
84
+ cursor: not-allowed;
85
+ }
69
86
  }
70
87
  }
71
88
  }
72
89
 
73
- .ngb-dp-content {
90
+ .bs-datepicker-body {
74
91
  @extend .hr-label, .sm-regular;
75
92
 
76
- min-width: 16.5rem;
93
+ min-width: $datepicker-min-width;
77
94
  padding: 0.625rem;
78
95
 
79
- .ngb-dp-weekdays {
80
- background-color: var(--bg-calender-primary);
81
- border: none;
96
+ table {
97
+ width: 100%;
82
98
 
83
- .ngb-dp-weekday {
84
- @extend .hr-label, .sm-regular;
85
- color: var(--on-bg-calender-primary);
99
+ td {
100
+ border-radius: $border-radius-rounded;
101
+ color: var(--number-calender-active-primary);
102
+ cursor: pointer;
103
+ height: 2rem;
104
+ outline: none;
105
+ text-align: center;
106
+
107
+ span {
108
+ display: block;
109
+ height: 2rem;
110
+ line-height: 2rem;
111
+ }
86
112
  }
87
113
  }
114
+ }
88
115
 
89
- .ngb-dp-week-number {
90
- @extend .hr-label, .sm-regular;
116
+ bs-days-calendar-view .bs-datepicker-body table {
117
+ th {
118
+ font-style: italic;
119
+ height: 2rem;
120
+ width: 2rem;
91
121
  }
92
122
 
93
- .ngb-dp-day {
94
- border-radius: 50%;
95
- color: var(--number-calender-active-primary);
96
- outline: none;
123
+ td {
124
+ width: 2rem;
97
125
 
98
- .btn-light {
99
- border-radius: 50%;
100
- outline: none;
126
+ &:not(:has(span.is-other-month)):not(:has(span.selected)):not(:has(span.disabled)):hover {
127
+ background-color: var(--bg-number-calendar-hover-primary);
128
+ color: var(--number-calendar-hover-primary);
129
+ }
101
130
 
102
- &:not(.text-muted):hover {
103
- background-color: var(--bg-number-calendar-hover-primary);
104
- color: var(--number-calendar-hover-primary);
105
- }
131
+ &:has(span.selected) {
132
+ background-color: var(--bg-number-calendar-pressed-primary);
133
+ color: var(--number-calendar-pressed-primary);
134
+ }
106
135
 
107
- &.text-muted {
108
- color: var(--number-calendar-disabled-primary);
109
- }
136
+ &:has(span.is-other-month) {
137
+ color: var(--number-calendar-disabled-primary);
138
+ }
110
139
 
111
- &.bg-primary.text-white {
112
- background-color: var(--bg-number-calendar-pressed-primary) !important;
113
- color: var(--number-calendar-pressed-primary) !important;
114
- }
140
+ &:has(span.disabled) {
141
+ color: var(--number-calendar-disabled-primary);
142
+ cursor: not-allowed;
143
+ }
144
+
145
+ span {
146
+ width: 2rem;
147
+ }
148
+ }
149
+ }
150
+
151
+ bs-month-calendar-view,
152
+ bs-years-calendar-view {
153
+ .bs-datepicker-body table td {
154
+ &:not(.disabled):hover {
155
+ background-color: var(--bg-number-calendar-hover-primary);
156
+ color: var(--number-calendar-hover-primary);
157
+ }
158
+
159
+ &.disabled {
160
+ color: var(--number-calendar-disabled-primary);
161
+ cursor: not-allowed;
162
+ }
163
+
164
+ &.selected {
165
+ background-color: var(--bg-number-calendar-pressed-primary);
166
+ color: var(--number-calendar-pressed-primary);
115
167
  }
116
168
  }
117
169
  }
@@ -1,136 +0,0 @@
1
- import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- export class GravityMonthPickerComponent {
5
- constructor() {
6
- this.closeCalendar = new EventEmitter();
7
- this.monthSelected = new EventEmitter();
8
- this.currentLang = 'en';
9
- this.monthsEn = ["Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"];
10
- this.monthsEs = ["En", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ag", "Set", "Oct", "Nov", "Dic"];
11
- this.isShowingCalendar = false;
12
- this.isShowingMonths = true;
13
- this.monthPickerData = {};
14
- this.monthIndex = new Date().getUTCMonth();
15
- this.yearDisplayed = new Date().getUTCFullYear();
16
- this.yearBase = GravityMonthPickerComponent.getYearsRangeBase(this.yearDisplayed);
17
- }
18
- ngOnInit() {
19
- if (this.monthConfig?.customMonthDate) {
20
- this.monthPickerData.month = this.monthConfig.customMonthDate.month;
21
- this.monthPickerData.year = this.monthConfig.customMonthDate.year;
22
- }
23
- }
24
- showCalendar() {
25
- this.isShowingCalendar = true;
26
- }
27
- hideCalendar() {
28
- this.isShowingCalendar = false;
29
- }
30
- updateYear(changeRange, newYear) {
31
- if (changeRange) {
32
- this.yearDisplayed += changeRange;
33
- }
34
- else if (newYear) {
35
- this.yearDisplayed = newYear;
36
- }
37
- this.yearBase = GravityMonthPickerComponent.getYearsRangeBase(this.yearDisplayed);
38
- }
39
- addYear() {
40
- this.updateYear(this.isShowingMonths ? 1 : 10);
41
- }
42
- subtractYear() {
43
- this.updateYear(this.isShowingMonths ? -1 : -10);
44
- }
45
- changeYear(newYear, disabled) {
46
- if (!disabled) {
47
- this.updateYear(null, newYear);
48
- this.isShowingMonths = true;
49
- }
50
- }
51
- static getYearsRangeBase(year) {
52
- return (year - year % 10) - 1;
53
- }
54
- changeMonth(monthIndex, disabled) {
55
- if (!disabled) {
56
- this.monthPickerData.month = monthIndex + 1;
57
- this.monthPickerData.year = this.yearDisplayed;
58
- this.isShowingCalendar = false;
59
- this.closeCalendar.emit(false);
60
- this.monthSelected.emit(this.monthPickerData);
61
- }
62
- }
63
- getMonths() {
64
- switch (this.currentLang) {
65
- case 'es':
66
- return this.monthsEs;
67
- default:
68
- return this.monthsEn;
69
- }
70
- }
71
- getDisabled(currentIndex) {
72
- let minMonthDisabled = false;
73
- if (this.monthConfig?.minMonthDate) {
74
- if (this.isShowingMonths) {
75
- minMonthDisabled = this.yearDisplayed < this.monthConfig.minMonthDate.year || (this.yearDisplayed == this.monthConfig.minMonthDate.year && currentIndex + 1 < this.monthConfig.minMonthDate.month);
76
- }
77
- else {
78
- minMonthDisabled = this.yearBase + currentIndex < this.monthConfig.minMonthDate.year;
79
- }
80
- }
81
- let maxMonthDisabled = false;
82
- if (this.monthConfig?.maxMonthDate) {
83
- if (this.isShowingMonths) {
84
- maxMonthDisabled = this.yearDisplayed > this.monthConfig.maxMonthDate.year || (this.yearDisplayed == this.monthConfig.maxMonthDate.year && currentIndex + 1 > this.monthConfig.maxMonthDate.month);
85
- }
86
- else {
87
- maxMonthDisabled = this.yearBase + currentIndex > this.monthConfig.maxMonthDate.year;
88
- }
89
- }
90
- return minMonthDisabled || maxMonthDisabled;
91
- }
92
- getArrowDisabled(arrow) {
93
- if (arrow == 'left' && this.monthConfig?.minMonthDate) {
94
- if (this.isShowingMonths) {
95
- return this.yearDisplayed <= this.monthConfig.minMonthDate.year;
96
- }
97
- else {
98
- return this.yearBase < this.monthConfig.minMonthDate.year;
99
- }
100
- }
101
- if (arrow == 'right' && this.monthConfig?.maxMonthDate) {
102
- if (this.isShowingMonths) {
103
- return this.yearDisplayed >= this.monthConfig.maxMonthDate.year;
104
- }
105
- else {
106
- return this.yearBase + 12 > this.monthConfig.maxMonthDate.year;
107
- }
108
- }
109
- }
110
- onDocumentClick() {
111
- if (this.isShowingCalendar) {
112
- this.isShowingCalendar = false;
113
- this.closeCalendar.emit(false);
114
- }
115
- }
116
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GravityMonthPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
117
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GravityMonthPickerComponent, selector: "gravity-month-picker", inputs: { currentLang: "currentLang", monthConfig: "monthConfig" }, outputs: { closeCalendar: "closeCalendar", monthSelected: "monthSelected" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: "<ng-container *ngIf=\"isShowingCalendar\">\n <div class=\"calendar-header\">\n <div class=\"month-picker-arrow month-picker-arrow-previous\">\n <button class=\"hr-label sm-regular\" [disabled]=\"getArrowDisabled('left')\" (click)=\"subtractYear()\">\n <span></span>\n </button>\n </div>\n <div class=\"hr-label md-regular month-picker-year\">\n <span (click)=\"$event.stopPropagation(); isShowingMonths = false\" *ngIf=\"isShowingMonths\">\n {{yearDisplayed}}\n </span>\n <span (click)=\"$event.stopPropagation(); isShowingMonths = true\" *ngIf=\"!isShowingMonths\">\n {{yearBase + 1}} - {{yearBase + 10}}\n </span>\n </div>\n <div class=\"month-picker-arrow month-picker-arrow-next\">\n <button class=\"hr-label sm-regular\" [disabled]=\"getArrowDisabled('right')\" (click)=\"addYear()\">\n <span></span>\n </button>\n </div>\n </div>\n <div class=\"calendar-body hr-label sm-regular\">\n <article [class.active]=\"(isShowingMonths && monthPickerData.month == i + 1 && monthPickerData.year == yearDisplayed) || (!isShowingMonths && monthPickerData.year == i + yearBase)\"\n [class.disabled]=\"getDisabled(i)\"\n (click)=\"isShowingMonths ? changeMonth(i, getDisabled(i)) : changeYear(i + yearBase, getDisabled(i))\"\n *ngFor=\"let month of getMonths(); let i = index\">\n <span *ngIf=\"isShowingMonths\">{{month}}</span>\n <span *ngIf=\"!isShowingMonths\">{{i + yearBase}}</span>\n </article>\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";.border-radius-none{border-radius:0}.border-radius-xs{border-radius:.0625rem}.border-radius-sm{border-radius:.3125rem}.border-radius-md{border-radius:.625rem}.border-radius-lg{border-radius:.9375rem}.border-radius-xl{border-radius:1.25rem}.border-radius-xxl{border-radius:2rem}.border-radius-rounded{border-radius:6.25rem}:host{background-color:var(--bg-calender-primary);border-radius:.625rem;box-shadow:0 0 10px #aaa;color:var(--on-bg-calender-primary);left:2.6rem;position:absolute;top:77%;width:15rem;z-index:1055}.calendar-header{align-items:center;background-color:var(--bg-calendar-nav-primary);border-top-left-radius:.625rem;border-top-right-radius:.625rem;color:var(--on-bg-calendar-nav-primary);display:flex;height:3.125rem;min-width:15rem;padding:.625rem}.month-picker-arrow{display:flex;flex:1 1 auto;height:2rem;margin:0;padding-left:0;padding-right:0;width:2rem}.month-picker-arrow button{background-color:var(--bg-calendar-nav-primary);border:none;border-radius:50%;color:var(--arrow-calendar-active-primary);cursor:pointer;height:2rem;margin:0;outline:none;padding:0;width:2rem}.month-picker-arrow button span{border:none;display:inline-block;font-size:1.75rem;height:100%;line-height:1;margin:0;position:relative;transform:none;width:100%}.month-picker-arrow button:not([disabled]):hover{background-color:var(--bg-arrow-calendar-hover-primary);color:var(--arrow-calendar-hover-primary)}.month-picker-arrow button[disabled]{color:var(--arrow-calendar-disabled-primary);cursor:not-allowed}.month-picker-arrow.month-picker-arrow-previous button span:before{content:\"\\2039\"}.month-picker-arrow.month-picker-arrow-next button span:after{content:\"\\203a\"}.month-picker-year{cursor:pointer}.month-picker-arrow-next{justify-content:flex-end}.calendar-body{display:flex;flex-wrap:wrap;justify-content:space-between;min-width:15rem;padding:.625rem;text-align:center}.calendar-body article{align-items:center;border-radius:50%;cursor:pointer;display:flex;height:2.5rem;justify-content:center;margin-inline:.25rem;width:2.5rem}.calendar-body article:not(.disabled):hover{background-color:var(--bg-number-calendar-hover-primary);color:var(--number-calendar-hover-primary)}.calendar-body article.active{background-color:var(--bg-number-calendar-pressed-primary)!important;color:var(--number-calendar-pressed-primary)!important}.calendar-body article.disabled{color:var(--number-calendar-disabled-primary);cursor:default}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
118
- }
119
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GravityMonthPickerComponent, decorators: [{
120
- type: Component,
121
- args: [{ selector: 'gravity-month-picker', template: "<ng-container *ngIf=\"isShowingCalendar\">\n <div class=\"calendar-header\">\n <div class=\"month-picker-arrow month-picker-arrow-previous\">\n <button class=\"hr-label sm-regular\" [disabled]=\"getArrowDisabled('left')\" (click)=\"subtractYear()\">\n <span></span>\n </button>\n </div>\n <div class=\"hr-label md-regular month-picker-year\">\n <span (click)=\"$event.stopPropagation(); isShowingMonths = false\" *ngIf=\"isShowingMonths\">\n {{yearDisplayed}}\n </span>\n <span (click)=\"$event.stopPropagation(); isShowingMonths = true\" *ngIf=\"!isShowingMonths\">\n {{yearBase + 1}} - {{yearBase + 10}}\n </span>\n </div>\n <div class=\"month-picker-arrow month-picker-arrow-next\">\n <button class=\"hr-label sm-regular\" [disabled]=\"getArrowDisabled('right')\" (click)=\"addYear()\">\n <span></span>\n </button>\n </div>\n </div>\n <div class=\"calendar-body hr-label sm-regular\">\n <article [class.active]=\"(isShowingMonths && monthPickerData.month == i + 1 && monthPickerData.year == yearDisplayed) || (!isShowingMonths && monthPickerData.year == i + yearBase)\"\n [class.disabled]=\"getDisabled(i)\"\n (click)=\"isShowingMonths ? changeMonth(i, getDisabled(i)) : changeYear(i + yearBase, getDisabled(i))\"\n *ngFor=\"let month of getMonths(); let i = index\">\n <span *ngIf=\"isShowingMonths\">{{month}}</span>\n <span *ngIf=\"!isShowingMonths\">{{i + yearBase}}</span>\n </article>\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";.border-radius-none{border-radius:0}.border-radius-xs{border-radius:.0625rem}.border-radius-sm{border-radius:.3125rem}.border-radius-md{border-radius:.625rem}.border-radius-lg{border-radius:.9375rem}.border-radius-xl{border-radius:1.25rem}.border-radius-xxl{border-radius:2rem}.border-radius-rounded{border-radius:6.25rem}:host{background-color:var(--bg-calender-primary);border-radius:.625rem;box-shadow:0 0 10px #aaa;color:var(--on-bg-calender-primary);left:2.6rem;position:absolute;top:77%;width:15rem;z-index:1055}.calendar-header{align-items:center;background-color:var(--bg-calendar-nav-primary);border-top-left-radius:.625rem;border-top-right-radius:.625rem;color:var(--on-bg-calendar-nav-primary);display:flex;height:3.125rem;min-width:15rem;padding:.625rem}.month-picker-arrow{display:flex;flex:1 1 auto;height:2rem;margin:0;padding-left:0;padding-right:0;width:2rem}.month-picker-arrow button{background-color:var(--bg-calendar-nav-primary);border:none;border-radius:50%;color:var(--arrow-calendar-active-primary);cursor:pointer;height:2rem;margin:0;outline:none;padding:0;width:2rem}.month-picker-arrow button span{border:none;display:inline-block;font-size:1.75rem;height:100%;line-height:1;margin:0;position:relative;transform:none;width:100%}.month-picker-arrow button:not([disabled]):hover{background-color:var(--bg-arrow-calendar-hover-primary);color:var(--arrow-calendar-hover-primary)}.month-picker-arrow button[disabled]{color:var(--arrow-calendar-disabled-primary);cursor:not-allowed}.month-picker-arrow.month-picker-arrow-previous button span:before{content:\"\\2039\"}.month-picker-arrow.month-picker-arrow-next button span:after{content:\"\\203a\"}.month-picker-year{cursor:pointer}.month-picker-arrow-next{justify-content:flex-end}.calendar-body{display:flex;flex-wrap:wrap;justify-content:space-between;min-width:15rem;padding:.625rem;text-align:center}.calendar-body article{align-items:center;border-radius:50%;cursor:pointer;display:flex;height:2.5rem;justify-content:center;margin-inline:.25rem;width:2.5rem}.calendar-body article:not(.disabled):hover{background-color:var(--bg-number-calendar-hover-primary);color:var(--number-calendar-hover-primary)}.calendar-body article.active{background-color:var(--bg-number-calendar-pressed-primary)!important;color:var(--number-calendar-pressed-primary)!important}.calendar-body article.disabled{color:var(--number-calendar-disabled-primary);cursor:default}\n"] }]
122
- }], ctorParameters: function () { return []; }, propDecorators: { closeCalendar: [{
123
- type: Output,
124
- args: ['closeCalendar']
125
- }], monthSelected: [{
126
- type: Output,
127
- args: ['monthSelected']
128
- }], currentLang: [{
129
- type: Input
130
- }], monthConfig: [{
131
- type: Input
132
- }], onDocumentClick: [{
133
- type: HostListener,
134
- args: ['document:click', ['$event']]
135
- }] } });
136
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3Jhdml0eS1tb250aC1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3Jhdml0eS1kZXNpZ24tc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9ncmF2aXR5LWNhbGVuZGFyL2dyYXZpdHktbW9udGgtcGlja2VyL2dyYXZpdHktbW9udGgtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dyYXZpdHktZGVzaWduLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZ3Jhdml0eS1jYWxlbmRhci9ncmF2aXR5LW1vbnRoLXBpY2tlci9ncmF2aXR5LW1vbnRoLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQzs7O0FBTzNGLE1BQU0sT0FBTywyQkFBMkI7SUFxQnRDO1FBcEJnQyxrQkFBYSxHQUEwQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFELGtCQUFhLEdBQXlDLElBQUksWUFBWSxFQUFFLENBQUM7UUFFekYsZ0JBQVcsR0FBVyxJQUFJLENBQUM7UUFPM0IsYUFBUSxHQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RyxhQUFRLEdBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FB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QyxNQUFNO3VCQUFDLGVBQWU7Z0JBRVAsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxXQUFXO3NCQUExQixLQUFLO2dCQStITixlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dyYXZpdHktbW9udGgtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dyYXZpdHktbW9udGgtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ3Jhdml0eS1tb250aC1waWNrZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBHcmF2aXR5TW9udGhQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAT3V0cHV0KCdjbG9zZUNhbGVuZGFyJykgcHVibGljIGNsb3NlQ2FsZW5kYXI6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgnbW9udGhTZWxlY3RlZCcpIHB1YmxpYyBtb250aFNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8R3Jhdml0eU1vbnRoUGlja2VyRGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQElucHV0KCkgcHVibGljIGN1cnJlbnRMYW5nOiBzdHJpbmcgPSAnZW4nO1xuICBASW5wdXQoKSBwdWJsaWMgbW9udGhDb25maWc6IHtcbiAgICBjdXN0b21Nb250aERhdGU/OiBHcmF2aXR5TW9udGhQaWNrZXJEYXRlO1xuICAgIG1heE1vbnRoRGF0ZT86IEdyYXZpdHlNb250aFBpY2tlckRhdGU7XG4gICAgbWluTW9udGhEYXRlPzogR3Jhdml0eU1vbnRoUGlja2VyRGF0ZTtcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbW9udGhzRW46IHN0cmluZ1tdID0gW1wiSmFuXCIsIFwiRmViXCIsIFwiTWFyXCIsIFwiQXByXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWdcIiwgXCJTZXB0XCIsIFwiT2N0XCIsIFwiTm92XCIsIFwiRGVjXCJdO1xuICBwdWJsaWMgcmVhZG9ubHkgbW9udGhzRXM6IHN0cmluZ1tdID0gW1wiRW5cIiwgXCJGZWJcIiwgXCJNYXJcIiwgXCJBYnJcIiwgXCJNYXlcIiwgXCJKdW5cIiwgXCJKdWxcIiwgXCJBZ1wiLCBcIlNldFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRpY1wiXTtcblxuICBwdWJsaWMgaXNTaG93aW5nQ2FsZW5kYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGlzU2hvd2luZ01vbnRoczogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBtb250aFBpY2tlckRhdGE6IEdyYXZpdHlNb250aFBpY2tlckRhdGUgPSB7fSBhcyBHcmF2aXR5TW9udGhQaWNrZXJEYXRlO1xuICBwdWJsaWMgbW9udGhJbmRleDogbnVtYmVyO1xuICBwdWJsaWMgeWVhckJhc2U6IG51bWJlcjtcbiAgcHVibGljIHllYXJEaXNwbGF5ZWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1vbnRoSW5kZXggPSBuZXcgRGF0ZSgpLmdldFVUQ01vbnRoKCk7XG4gICAgdGhpcy55ZWFyRGlzcGxheWVkID0gbmV3IERhdGUoKS5nZXRVVENGdWxsWWVhcigpO1xuICAgIHRoaXMueWVhckJhc2UgPSBHcmF2aXR5TW9udGhQaWNrZXJDb21wb25lbnQuZ2V0WWVhcnNSYW5nZUJhc2UodGhpcy55ZWFyRGlzcGxheWVkKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLm1vbnRoQ29uZmlnPy5jdXN0b21Nb250aERhdGUpIHtcbiAgICAgIHRoaXMubW9udGhQaWNrZXJEYXRhLm1vbnRoID0gdGhpcy5tb250aENvbmZpZy5jdXN0b21Nb250aERhdGUubW9udGg7XG4gICAgICB0aGlzLm1vbnRoUGlja2VyRGF0YS55ZWFyID0gdGhpcy5tb250aENvbmZpZy5jdXN0b21Nb250aERhdGUueWVhcjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2hvd0NhbGVuZGFyKCk6IHZvaWQge1xuICAgIHRoaXMuaXNTaG93aW5nQ2FsZW5kYXIgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGhpZGVDYWxlbmRhcigpOiB2b2lkIHtcbiAgICB0aGlzLmlzU2hvd2luZ0NhbGVuZGFyID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVllYXIoY2hhbmdlUmFuZ2U/OiBudW1iZXIsIG5ld1llYXI/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlUmFuZ2UpIHtcbiAgICAgIHRoaXMueWVhckRpc3BsYXllZCArPSBjaGFuZ2VSYW5nZTtcbiAgICB9IGVsc2UgaWYgKG5ld1llYXIpIHtcbiAgICAgIHRoaXMueWVhckRpc3BsYXllZCA9IG5ld1llYXI7XG4gICAgfVxuXG4gICAgdGhpcy55ZWFyQmFzZSA9IEdyYXZpdHlNb250aFBpY2tlckNvbXBvbmVudC5nZXRZZWFyc1JhbmdlQmFzZSh0aGlzLnllYXJEaXNwbGF5ZWQpO1xuICB9XG5cbiAgcHVibGljIGFkZFllYXIoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVZZWFyKHRoaXMuaXNTaG93aW5nTW9udGhzID8gMSA6IDEwKTtcbiAgfVxuXG4gIHB1YmxpYyBzdWJ0cmFjdFllYXIoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVZZWFyKHRoaXMuaXNTaG93aW5nTW9udGhzID8gLTEgOiAtMTApO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVllYXIobmV3WWVhcjogbnVtYmVyLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlWWVhcihudWxsLCBuZXdZZWFyKTtcbiAgICAgIHRoaXMuaXNTaG93aW5nTW9udGhzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRZZWFyc1JhbmdlQmFzZSh5ZWFyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiAoeWVhciAtIHllYXIgJSAxMCkgLSAxO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZU1vbnRoKG1vbnRoSW5kZXg6IG51bWJlciwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICB0aGlzLm1vbnRoUGlja2VyRGF0YS5tb250aCA9IG1vbnRoSW5kZXggKyAxO1xuICAgICAgdGhpcy5tb250aFBpY2tlckRhdGEueWVhciA9IHRoaXMueWVhckRpc3BsYXllZDtcbiAgICAgIHRoaXMuaXNTaG93aW5nQ2FsZW5kYXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2xvc2VDYWxlbmRhci5lbWl0KGZhbHNlKTtcbiAgICAgIHRoaXMubW9udGhTZWxlY3RlZC5lbWl0KHRoaXMubW9udGhQaWNrZXJEYXRhKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0TW9udGhzKCk6IHN0cmluZ1tdIHtcbiAgICBzd2l0Y2ggKHRoaXMuY3VycmVudExhbmcpIHtcbiAgICAgIGNhc2UgJ2VzJzpcbiAgICAgICAgcmV0dXJuIHRoaXMubW9udGhzRXM7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRoc0VuO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXREaXNhYmxlZChjdXJyZW50SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGxldCBtaW5Nb250aERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMubW9udGhDb25maWc/Lm1pbk1vbnRoRGF0ZSkge1xuICAgICAgaWYgKHRoaXMuaXNTaG93aW5nTW9udGhzKSB7XG4gICAgICAgIG1pbk1vbnRoRGlzYWJsZWQgPSB0aGlzLnllYXJEaXNwbGF5ZWQgPCB0aGlzLm1vbnRoQ29uZmlnLm1pbk1vbnRoRGF0ZS55ZWFyIHx8ICh0aGlzLnllYXJEaXNwbGF5ZWQgPT0gdGhpcy5tb250aENvbmZpZy5taW5Nb250aERhdGUueWVhciAmJiBjdXJyZW50SW5kZXggKyAxIDwgdGhpcy5tb250aENvbmZpZy5taW5Nb250aERhdGUubW9udGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluTW9udGhEaXNhYmxlZCA9IHRoaXMueWVhckJhc2UgKyBjdXJyZW50SW5kZXggPCB0aGlzLm1vbnRoQ29uZmlnLm1pbk1vbnRoRGF0ZS55ZWFyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBtYXhNb250aERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMubW9udGhDb25maWc/Lm1heE1vbnRoRGF0ZSkge1xuICAgICAgaWYgKHRoaXMuaXNTaG93aW5nTW9udGhzKSB7XG4gICAgICAgIG1heE1vbnRoRGlzYWJsZWQgPSB0aGlzLnllYXJEaXNwbGF5ZWQgPiB0aGlzLm1vbnRoQ29uZmlnLm1heE1vbnRoRGF0ZS55ZWFyIHx8ICh0aGlzLnllYXJEaXNwbGF5ZWQgPT0gdGhpcy5tb250aENvbmZpZy5tYXhNb250aERhdGUueWVhciAmJiBjdXJyZW50SW5kZXggKyAxID4gdGhpcy5tb250aENvbmZpZy5tYXhNb250aERhdGUubW9udGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF4TW9udGhEaXNhYmxlZCA9IHRoaXMueWVhckJhc2UgKyBjdXJyZW50SW5kZXggPiB0aGlzLm1vbnRoQ29uZmlnLm1heE1vbnRoRGF0ZS55ZWFyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtaW5Nb250aERpc2FibGVkIHx8IG1heE1vbnRoRGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXJyb3dEaXNhYmxlZChhcnJvdzogJ2xlZnQnIHwgJ3JpZ2h0Jyk6IGJvb2xlYW4ge1xuICAgIGlmIChhcnJvdyA9PSAnbGVmdCcgJiYgdGhpcy5tb250aENvbmZpZz8ubWluTW9udGhEYXRlKSB7XG4gICAgICBpZiAodGhpcy5pc1Nob3dpbmdNb250aHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueWVhckRpc3BsYXllZCA8PSB0aGlzLm1vbnRoQ29uZmlnLm1pbk1vbnRoRGF0ZS55ZWFyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueWVhckJhc2UgPCB0aGlzLm1vbnRoQ29uZmlnLm1pbk1vbnRoRGF0ZS55ZWFyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhcnJvdyA9PSAncmlnaHQnICYmIHRoaXMubW9udGhDb25maWc/Lm1heE1vbnRoRGF0ZSkge1xuICAgICAgaWYgKHRoaXMuaXNTaG93aW5nTW9udGhzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnllYXJEaXNwbGF5ZWQgPj0gdGhpcy5tb250aENvbmZpZy5tYXhNb250aERhdGUueWVhcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnllYXJCYXNlICsgMTIgPiB0aGlzLm1vbnRoQ29uZmlnLm1heE1vbnRoRGF0ZS55ZWFyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzU2hvd2luZ0NhbGVuZGFyKSB7XG4gICAgICB0aGlzLmlzU2hvd2luZ0NhbGVuZGFyID0gZmFsc2U7XG4gICAgICB0aGlzLmNsb3NlQ2FsZW5kYXIuZW1pdChmYWxzZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3Jhdml0eU1vbnRoUGlja2VyRGF0ZSB7XG4gIG1vbnRoOiBudW1iZXI7XG4gIHllYXI6IG51bWJlcjtcbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJpc1Nob3dpbmdDYWxlbmRhclwiPlxuICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItaGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1vbnRoLXBpY2tlci1hcnJvdyBtb250aC1waWNrZXItYXJyb3ctcHJldmlvdXNcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJoci1sYWJlbCBzbS1yZWd1bGFyXCIgW2Rpc2FibGVkXT1cImdldEFycm93RGlzYWJsZWQoJ2xlZnQnKVwiIChjbGljayk9XCJzdWJ0cmFjdFllYXIoKVwiPlxuICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaHItbGFiZWwgbWQtcmVndWxhciBtb250aC1waWNrZXIteWVhclwiPlxuICAgICAgPHNwYW4gKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgaXNTaG93aW5nTW9udGhzID0gZmFsc2VcIiAqbmdJZj1cImlzU2hvd2luZ01vbnRoc1wiPlxuICAgICAgICB7e3llYXJEaXNwbGF5ZWR9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgaXNTaG93aW5nTW9udGhzID0gdHJ1ZVwiICpuZ0lmPVwiIWlzU2hvd2luZ01vbnRoc1wiPlxuICAgICAgICB7e3llYXJCYXNlICsgMX19IC0ge3t5ZWFyQmFzZSArIDEwfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibW9udGgtcGlja2VyLWFycm93IG1vbnRoLXBpY2tlci1hcnJvdy1uZXh0XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiaHItbGFiZWwgc20tcmVndWxhclwiIFtkaXNhYmxlZF09XCJnZXRBcnJvd0Rpc2FibGVkKCdyaWdodCcpXCIgKGNsaWNrKT1cImFkZFllYXIoKVwiPlxuICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1ib2R5IGhyLWxhYmVsIHNtLXJlZ3VsYXJcIj5cbiAgICA8YXJ0aWNsZSBbY2xhc3MuYWN0aXZlXT1cIihpc1Nob3dpbmdNb250aHMgJiYgbW9udGhQaWNrZXJEYXRhLm1vbnRoID09IGkgKyAxICYmIG1vbnRoUGlja2VyRGF0YS55ZWFyID09IHllYXJEaXNwbGF5ZWQpIHx8ICghaXNTaG93aW5nTW9udGhzICYmIG1vbnRoUGlja2VyRGF0YS55ZWFyID09IGkgKyB5ZWFyQmFzZSlcIlxuICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJnZXREaXNhYmxlZChpKVwiXG4gICAgICAgICAgICAgKGNsaWNrKT1cImlzU2hvd2luZ01vbnRocyA/IGNoYW5nZU1vbnRoKGksIGdldERpc2FibGVkKGkpKSA6IGNoYW5nZVllYXIoaSArIHllYXJCYXNlLCBnZXREaXNhYmxlZChpKSlcIlxuICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtb250aCBvZiBnZXRNb250aHMoKTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgPHNwYW4gKm5nSWY9XCJpc1Nob3dpbmdNb250aHNcIj57e21vbnRofX08L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFpc1Nob3dpbmdNb250aHNcIj57e2kgKyB5ZWFyQmFzZX19PC9zcGFuPlxuICAgIDwvYXJ0aWNsZT5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==