@huntsman-cancer-institute/input 12.5.0 → 14.1.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.
Files changed (105) hide show
  1. package/date/date-date-range.component.d.ts +1 -1
  2. package/date/date-date.component.d.ts +5 -7
  3. package/date/date-validator.d.ts +0 -3
  4. package/dropdown/dropdown-select-result.component.d.ts +1 -1
  5. package/dropdown/dropdown-select.component.d.ts +3 -3
  6. package/dropdown/dropdown.component.d.ts +4 -4
  7. package/dropdown/template-dropdown.directive.d.ts +1 -1
  8. package/esm2020/date/date-base.mjs +114 -0
  9. package/esm2020/date/date-date-range.component.mjs +133 -0
  10. package/esm2020/date/date-date.component.mjs +310 -0
  11. package/esm2020/date/date-validator.mjs +40 -0
  12. package/esm2020/date/date.module.mjs +60 -0
  13. package/esm2020/dropdown/dropdown-index.mjs +6 -0
  14. package/esm2020/dropdown/dropdown-select-result.component.mjs +110 -0
  15. package/esm2020/dropdown/dropdown-select.component.mjs +459 -0
  16. package/esm2020/dropdown/dropdown.component.mjs +313 -0
  17. package/esm2020/dropdown/dropdown.module.mjs +50 -0
  18. package/esm2020/dropdown/dropdown.service.mjs +133 -0
  19. package/esm2020/dropdown/messages.mjs +10 -0
  20. package/esm2020/dropdown/select-item.mjs +12 -0
  21. package/esm2020/dropdown/template-dropdown.directive.mjs +26 -0
  22. package/esm2020/huntsman-cancer-institute-input.mjs +5 -0
  23. package/esm2020/index.mjs +20 -0
  24. package/esm2020/inline/inline.component.mjs +249 -0
  25. package/esm2020/inline/inline.module.mjs +28 -0
  26. package/esm2020/search/search.component.mjs +182 -0
  27. package/esm2020/search/search.module.mjs +32 -0
  28. package/esm2020/select/custom-combobox.component.mjs +679 -0
  29. package/{esm2015/select/custom-multi-combobox.component.js → esm2020/select/custom-multi-combobox.component.mjs} +17 -22
  30. package/esm2020/select/md-multi-select.component.mjs +157 -0
  31. package/esm2020/select/md-select.component.mjs +123 -0
  32. package/esm2020/select/native-select.component.mjs +226 -0
  33. package/esm2020/select/select.module.mjs +83 -0
  34. package/fesm2015/huntsman-cancer-institute-input.mjs +3697 -0
  35. package/fesm2015/huntsman-cancer-institute-input.mjs.map +1 -0
  36. package/{fesm2015/huntsman-cancer-institute-input.js → fesm2020/huntsman-cancer-institute-input.mjs} +167 -258
  37. package/fesm2020/huntsman-cancer-institute-input.mjs.map +1 -0
  38. package/inline/inline.component.d.ts +1 -1
  39. package/package.json +30 -23
  40. package/search/search.component.d.ts +1 -1
  41. package/select/custom-combobox.component.d.ts +4 -4
  42. package/select/custom-multi-combobox.component.d.ts +3 -3
  43. package/select/md-multi-select.component.d.ts +3 -3
  44. package/select/md-select.component.d.ts +1 -1
  45. package/select/native-select.component.d.ts +1 -1
  46. package/CHANGELOG.md +0 -4
  47. package/bundles/huntsman-cancer-institute-input.umd.js +0 -3183
  48. package/bundles/huntsman-cancer-institute-input.umd.js.map +0 -1
  49. package/bundles/huntsman-cancer-institute-input.umd.min.js +0 -2
  50. package/bundles/huntsman-cancer-institute-input.umd.min.js.map +0 -1
  51. package/esm2015/date/date-base.js +0 -114
  52. package/esm2015/date/date-date-range.component.js +0 -133
  53. package/esm2015/date/date-date.component.js +0 -342
  54. package/esm2015/date/date-validator.js +0 -48
  55. package/esm2015/date/date.module.js +0 -62
  56. package/esm2015/dropdown/dropdown-index.js +0 -6
  57. package/esm2015/dropdown/dropdown-select-result.component.js +0 -110
  58. package/esm2015/dropdown/dropdown-select.component.js +0 -459
  59. package/esm2015/dropdown/dropdown.component.js +0 -313
  60. package/esm2015/dropdown/dropdown.module.js +0 -52
  61. package/esm2015/dropdown/dropdown.service.js +0 -133
  62. package/esm2015/dropdown/messages.js +0 -10
  63. package/esm2015/dropdown/select-item.js +0 -12
  64. package/esm2015/dropdown/template-dropdown.directive.js +0 -26
  65. package/esm2015/huntsman-cancer-institute-input.js +0 -5
  66. package/esm2015/index.js +0 -20
  67. package/esm2015/inline/inline.component.js +0 -249
  68. package/esm2015/inline/inline.module.js +0 -30
  69. package/esm2015/search/search.component.js +0 -182
  70. package/esm2015/search/search.module.js +0 -34
  71. package/esm2015/select/custom-combobox.component.js +0 -728
  72. package/esm2015/select/md-multi-select.component.js +0 -157
  73. package/esm2015/select/md-select.component.js +0 -123
  74. package/esm2015/select/native-select.component.js +0 -226
  75. package/esm2015/select/select.module.js +0 -85
  76. package/esm5/date/date-base.js +0 -116
  77. package/esm5/date/date-date-range.component.js +0 -93
  78. package/esm5/date/date-date.component.js +0 -231
  79. package/esm5/date/date-validator.js +0 -52
  80. package/esm5/date/date.module.js +0 -66
  81. package/esm5/dropdown/dropdown-index.js +0 -6
  82. package/esm5/dropdown/dropdown-select-result.component.js +0 -86
  83. package/esm5/dropdown/dropdown-select.component.js +0 -370
  84. package/esm5/dropdown/dropdown.component.js +0 -172
  85. package/esm5/dropdown/dropdown.module.js +0 -56
  86. package/esm5/dropdown/dropdown.service.js +0 -139
  87. package/esm5/dropdown/messages.js +0 -14
  88. package/esm5/dropdown/select-item.js +0 -12
  89. package/esm5/dropdown/template-dropdown.directive.js +0 -28
  90. package/esm5/huntsman-cancer-institute-input.js +0 -5
  91. package/esm5/index.js +0 -20
  92. package/esm5/inline/inline.component.js +0 -187
  93. package/esm5/inline/inline.module.js +0 -34
  94. package/esm5/search/search.component.js +0 -204
  95. package/esm5/search/search.module.js +0 -38
  96. package/esm5/select/custom-combobox.component.js +0 -580
  97. package/esm5/select/custom-multi-combobox.component.js +0 -297
  98. package/esm5/select/md-multi-select.component.js +0 -167
  99. package/esm5/select/md-select.component.js +0 -114
  100. package/esm5/select/native-select.component.js +0 -197
  101. package/esm5/select/select.module.js +0 -89
  102. package/fesm2015/huntsman-cancer-institute-input.js.map +0 -1
  103. package/fesm5/huntsman-cancer-institute-input.js +0 -3181
  104. package/fesm5/huntsman-cancer-institute-input.js.map +0 -1
  105. package/huntsman-cancer-institute-input.d.ts +0 -5
@@ -28,5 +28,5 @@ export declare class DateRangeComponent implements AfterViewInit {
28
28
  onClickSubmitEndDate(endData: any): void;
29
29
  private setRange;
30
30
  static ɵfac: i0.ɵɵFactoryDeclaration<DateRangeComponent, never>;
31
- static ɵcmp: i0.ɵɵComponentDeclaration<DateRangeComponent, "hci-date-range", never, { "dateFormat": "dateFormat"; "inputStartData": "inputStartData"; "inputEndData": "inputEndData"; "startLabel": "startLabel"; "endLabel": "endLabel"; "minStartDate": "minStartDate"; }, { "inputDataChange": "inputDataChange"; }, never, never>;
31
+ static ɵcmp: i0.ɵɵComponentDeclaration<DateRangeComponent, "hci-date-range", never, { "dateFormat": "dateFormat"; "inputStartData": "inputStartData"; "inputEndData": "inputEndData"; "startLabel": "startLabel"; "endLabel": "endLabel"; "minStartDate": "minStartDate"; }, { "inputDataChange": "inputDataChange"; }, never, never, false>;
32
32
  }
@@ -1,6 +1,6 @@
1
1
  import { ElementRef, EventEmitter, OnInit, DoCheck, AfterViewInit, ChangeDetectorRef } from "@angular/core";
2
2
  import { DatePipe } from "@angular/common";
3
- import { FormBuilder, FormGroup, FormControl } from "@angular/forms";
3
+ import { UntypedFormBuilder, UntypedFormGroup, UntypedFormControl } from "@angular/forms";
4
4
  import { DateBase } from "./date-base";
5
5
  import * as i0 from "@angular/core";
6
6
  /**
@@ -22,12 +22,11 @@ export declare class DateComponent extends DateBase implements OnInit, DoCheck,
22
22
  inputData: Object;
23
23
  modifiedData: Object;
24
24
  inputDataChange: EventEmitter<any>;
25
- dateValid: EventEmitter<boolean>;
26
- dateForm: FormGroup;
27
- dateInput: FormControl;
25
+ dateForm: UntypedFormGroup;
26
+ dateInput: UntypedFormControl;
28
27
  validate: boolean;
29
28
  private focused;
30
- constructor(elementRef: ElementRef, formBuilder: FormBuilder, datePipe: DatePipe, changeDetectorRef: ChangeDetectorRef);
29
+ constructor(elementRef: ElementRef, formBuilder: UntypedFormBuilder, datePipe: DatePipe, changeDetectorRef: ChangeDetectorRef);
31
30
  /**
32
31
  *
33
32
  */
@@ -49,7 +48,6 @@ export declare class DateComponent extends DateBase implements OnInit, DoCheck,
49
48
  * @returns {any}
50
49
  */
51
50
  private ngbDateToString;
52
- getDateValid(): boolean;
53
51
  static ɵfac: i0.ɵɵFactoryDeclaration<DateComponent, never>;
54
- static ɵcmp: i0.ɵɵComponentDeclaration<DateComponent, "hci-date", never, { "dateFormat": "dateFormat"; "minDate": "minDate"; "maxDate": "maxDate"; "label": "label"; "inputData": "inputData"; "modifiedData": "modifiedData"; }, { "inputDataChange": "inputDataChange"; "dateValid": "dateValid"; }, never, never>;
52
+ static ɵcmp: i0.ɵɵComponentDeclaration<DateComponent, "hci-date", never, { "dateFormat": "dateFormat"; "minDate": "minDate"; "maxDate": "maxDate"; "label": "label"; "inputData": "inputData"; "modifiedData": "modifiedData"; }, { "inputDataChange": "inputDataChange"; }, never, never, false>;
55
53
  }
@@ -8,9 +8,6 @@ export declare class DateValidator {
8
8
  static dateRangeValidator(ac: AbstractControl): {
9
9
  dateRangeValidator: boolean;
10
10
  };
11
- static dateInvalidValidator(ac: AbstractControl): {
12
- dateInvalidValidator: boolean;
13
- };
14
11
  static convertNgbStructToDate(struct: any): {
15
12
  year: any;
16
13
  month: number;
@@ -19,5 +19,5 @@ export declare class DropdownSelectResultComponent implements OnInit {
19
19
  scrollToElement(): void;
20
20
  selectCurrentItem(): void;
21
21
  static ɵfac: i0.ɵɵFactoryDeclaration<DropdownSelectResultComponent, never>;
22
- static ɵcmp: i0.ɵɵComponentDeclaration<DropdownSelectResultComponent, "hci-dropdown-select-result", never, { "items": "items"; "searchFocused": "searchFocused"; "selectedItems": "selectedItems"; "templateRef": "templateRef"; }, { "itemSelectedEvent": "itemSelectedEvent"; }, never, never>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<DropdownSelectResultComponent, "hci-dropdown-select-result", never, { "items": "items"; "searchFocused": "searchFocused"; "selectedItems": "selectedItems"; "templateRef": "templateRef"; }, { "itemSelectedEvent": "itemSelectedEvent"; }, never, never, false>;
23
23
  }
@@ -1,5 +1,5 @@
1
1
  import { AfterViewInit, TemplateRef, EventEmitter } from "@angular/core";
2
- import { ControlValueAccessor, FormControl } from "@angular/forms";
2
+ import { ControlValueAccessor, UntypedFormControl } from "@angular/forms";
3
3
  import { Observable } from "rxjs";
4
4
  import { DropdownSelectResultComponent } from "./dropdown-select-result.component";
5
5
  import { SelectItem } from "./select-item";
@@ -27,7 +27,7 @@ export declare class DropdownSelectComponent implements AfterViewInit, ControlVa
27
27
  onTouchedCallback: () => void;
28
28
  onChangeCallback: (_: any) => void;
29
29
  templateRef: TemplateRef<any>;
30
- term: FormControl;
30
+ term: UntypedFormControl;
31
31
  searchFocused: boolean;
32
32
  resultsVisible: boolean;
33
33
  listedData: SelectItem[];
@@ -72,5 +72,5 @@ export declare class DropdownSelectComponent implements AfterViewInit, ControlVa
72
72
  private handleMultipleWithIds;
73
73
  private handleSingleWithId;
74
74
  static ɵfac: i0.ɵɵFactoryDeclaration<DropdownSelectComponent, never>;
75
- static ɵcmp: i0.ɵɵComponentDeclaration<DropdownSelectComponent, "hci-dropdown-select", never, { "messages": "messages"; "dataProvider": "dataProvider"; "selectedProvider": "selectedProvider"; "selectItemAdapter": "selectItemAdapter"; "referenceMode": "referenceMode"; "placeholder": "placeholder"; "disabled": "disabled"; "multiple": "multiple"; "clientMode": "clientMode"; "deleteIcon": "deleteIcon"; "inputState": "inputState"; "resultsCount": "resultsCount"; "searchDelay": "searchDelay"; }, { "select": "select"; "remove": "remove"; }, never, never>;
75
+ static ɵcmp: i0.ɵɵComponentDeclaration<DropdownSelectComponent, "hci-dropdown-select", never, { "messages": "messages"; "dataProvider": "dataProvider"; "selectedProvider": "selectedProvider"; "selectItemAdapter": "selectItemAdapter"; "referenceMode": "referenceMode"; "placeholder": "placeholder"; "disabled": "disabled"; "multiple": "multiple"; "clientMode": "clientMode"; "deleteIcon": "deleteIcon"; "inputState": "inputState"; "resultsCount": "resultsCount"; "searchDelay": "searchDelay"; }, { "select": "select"; "remove": "remove"; }, never, never, false>;
76
76
  }
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter, OnInit } from "@angular/core";
2
- import { FormBuilder, FormGroup } from "@angular/forms";
2
+ import { UntypedFormBuilder, UntypedFormGroup } from "@angular/forms";
3
3
  import { Observable } from "rxjs";
4
4
  import { DropdownService } from "./dropdown.service";
5
5
  import { SelectItem } from "./select-item";
@@ -8,7 +8,7 @@ import * as i0 from "@angular/core";
8
8
  export declare class DropdownComponent implements OnInit {
9
9
  private dropdownService;
10
10
  private formBuilder;
11
- dropdownForm: FormGroup;
11
+ dropdownForm: UntypedFormGroup;
12
12
  getItems: (ids: any[]) => Observable<Object[]>;
13
13
  listItems: (item: string) => Observable<Object[]>;
14
14
  listItemsMax: (item: string, ids: any[]) => Observable<Object[]>;
@@ -27,7 +27,7 @@ export declare class DropdownComponent implements OnInit {
27
27
  inputSingleDataChange: EventEmitter<any>;
28
28
  inputMultiDataChange: EventEmitter<any>;
29
29
  dropdownSingle: DropdownSelectComponent;
30
- constructor(dropdownService: DropdownService, formBuilder: FormBuilder);
30
+ constructor(dropdownService: DropdownService, formBuilder: UntypedFormBuilder);
31
31
  ngOnInit(): void;
32
32
  onSelect(item: SelectItem): void;
33
33
  onRemove(item: SelectItem): void;
@@ -36,5 +36,5 @@ export declare class DropdownComponent implements OnInit {
36
36
  private initDropdownItem;
37
37
  private initDropdownForm;
38
38
  static ɵfac: i0.ɵɵFactoryDeclaration<DropdownComponent, never>;
39
- static ɵcmp: i0.ɵɵComponentDeclaration<DropdownComponent, "hci-dropdown", never, { "inputSingleData": "inputSingleData"; "inputMultiData": "inputMultiData"; "modifiedData": "modifiedData"; "optionData": "optionData"; "displayField": "displayField"; "displayId": "displayId"; "dataUrl": "dataUrl"; "dropdownType": "dropdownType"; "placeholder": "placeholder"; "isDisabled": "isDisabled"; }, { "inputSingleDataChange": "inputSingleDataChange"; "inputMultiDataChange": "inputMultiDataChange"; }, never, never>;
39
+ static ɵcmp: i0.ɵɵComponentDeclaration<DropdownComponent, "hci-dropdown", never, { "inputSingleData": "inputSingleData"; "inputMultiData": "inputMultiData"; "modifiedData": "modifiedData"; "optionData": "optionData"; "displayField": "displayField"; "displayId": "displayId"; "dataUrl": "dataUrl"; "dropdownType": "dropdownType"; "placeholder": "placeholder"; "isDisabled": "isDisabled"; }, { "inputSingleDataChange": "inputSingleDataChange"; "inputMultiDataChange": "inputMultiDataChange"; }, never, never, false>;
40
40
  }
@@ -8,5 +8,5 @@ export declare class TemplateDropdownDirective<T> {
8
8
  private templateRef;
9
9
  constructor(templateRef: TemplateRef<T>, host: DropdownSelectComponent);
10
10
  static ɵfac: i0.ɵɵFactoryDeclaration<TemplateDropdownDirective<any>, [null, { host: true; }]>;
11
- static ɵdir: i0.ɵɵDirectiveDeclaration<TemplateDropdownDirective<any>, "[appTemplateDropdown]", never, {}, {}, never>;
11
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TemplateDropdownDirective<any>, "[appTemplateDropdown]", never, {}, {}, never, never, false>;
12
12
  }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary
3
+ *
4
+ * Extending class works like in Java except that decorators are only scanned in the child class. In this case,
5
+ * we want variables like inputData to be available to all inline components that extend this class; however, we want
6
+ * this variable to be an @Input.
7
+ * What we can do here is define "inputData: Object" here and in the extending class, define "@Input inputData: Object".
8
+ *
9
+ * The two way binding to the component is inputData. To allow non-saving modification to this data, we copy
10
+ * it to modifiedData. The wrapped component such as input/select/... then use modifiedData as their ngModel.
11
+ * When we cancel out of editing, modifiedData is ignored and replaced with inputData. When editing is saved, inputData
12
+ * is replaced with modifiedData.
13
+ *
14
+ * @since 1.0.0
15
+ */
16
+ import { ElementRef, Injectable } from "@angular/core";
17
+ import * as i0 from "@angular/core";
18
+ export class DateBase {
19
+ constructor(elementRef) {
20
+ this.state = 0;
21
+ this._el = elementRef.nativeElement;
22
+ }
23
+ /**
24
+ * Listen to clicks on the document. If the state is in edit mode and there is a click outside the element,
25
+ * then save it.
26
+ *
27
+ * @param event
28
+ */
29
+ handleOutsideEvent(event) {
30
+ if (this.state !== 1) {
31
+ return;
32
+ }
33
+ let targetCmpt = null;
34
+ try {
35
+ // Catch exception if target is not an element
36
+ targetCmpt = event.target;
37
+ }
38
+ catch (e) {
39
+ this.save();
40
+ return;
41
+ }
42
+ let inside = false;
43
+ do {
44
+ if (targetCmpt === this._el) {
45
+ inside = true;
46
+ break;
47
+ }
48
+ targetCmpt = targetCmpt.parentElement;
49
+ } while (targetCmpt);
50
+ if (!inside) {
51
+ this.save();
52
+ }
53
+ }
54
+ /**
55
+ * Updates the modifiedData (working data) to the bound data.
56
+ */
57
+ updateInternalDataFromModel() {
58
+ this.modifiedData = this.inputData;
59
+ }
60
+ /**
61
+ * Updates the bound data with the working data.
62
+ */
63
+ updateModelFromInternalData() {
64
+ this.inputData = this.modifiedData;
65
+ }
66
+ /**
67
+ * When user chooses to edit, change state to show edit dialog.
68
+ */
69
+ startEdit() {
70
+ this.modifiedData = this.inputData;
71
+ this.state = 1;
72
+ }
73
+ /**
74
+ * Generic actions to change state based on key input. Escape will cancel out of the edit
75
+ * without saving, enter will save and exit.
76
+ *
77
+ * @param event
78
+ */
79
+ onKeyDown(event) {
80
+ if (event.key === "escape") {
81
+ this.cancel();
82
+ }
83
+ else if (event.key === "enter") {
84
+ this.save();
85
+ }
86
+ }
87
+ /**
88
+ *
89
+ * @param newValue
90
+ */
91
+ onChange(newValue) {
92
+ this.modifiedData = newValue;
93
+ }
94
+ /**
95
+ * Replace the bound data with the working data and exit editing mode.
96
+ */
97
+ save() {
98
+ this.updateModelFromInternalData();
99
+ this.state = 0;
100
+ }
101
+ /**
102
+ * Don't update the bound data and exit the editing mode.
103
+ */
104
+ cancel() {
105
+ this.updateInternalDataFromModel();
106
+ this.state = 0;
107
+ }
108
+ }
109
+ DateBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DateBase, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Injectable });
110
+ DateBase.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DateBase });
111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DateBase, decorators: [{
112
+ type: Injectable
113
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; } });
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaW5wdXQvc3JjL2RhdGUvZGF0ZS1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7O0FBR3JELE1BQU0sT0FBZ0IsUUFBUTtJQVE1QixZQUFZLFVBQXNCO1FBSmxDLFVBQUssR0FBVyxDQUFDLENBQUM7UUFLaEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGtCQUFrQixDQUFDLEtBQVk7UUFDcEMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRTtZQUNwQixPQUFPO1NBQ1I7UUFDRCxJQUFJLFVBQVUsR0FBZ0IsSUFBSSxDQUFDO1FBRW5DLElBQUk7WUFDRiw4Q0FBOEM7WUFDOUMsVUFBVSxHQUFpQixLQUFLLENBQUMsTUFBTyxDQUFDO1NBQzFDO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDWixPQUFPO1NBQ1I7UUFFRCxJQUFJLE1BQU0sR0FBWSxLQUFLLENBQUM7UUFDNUIsR0FBRztZQUNELElBQUksVUFBVSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQzNCLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ2QsTUFBTTthQUNQO1lBQ0QsVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7U0FDdkMsUUFBUSxVQUFVLEVBQUU7UUFDckIsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksMkJBQTJCO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVM7UUFDZCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksU0FBUyxDQUFDLEtBQW9CO1FBQ25DLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDMUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2Y7YUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssT0FBTyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxRQUFnQjtRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxJQUFJO1FBQ1QsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTTtRQUNYLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7O3FHQXZHbUIsUUFBUTt5R0FBUixRQUFROzJGQUFSLFFBQVE7a0JBRDdCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQ29weXJpZ2h0IChjKSAyMDE2IEh1bnRzbWFuIENhbmNlciBJbnN0aXR1dGUgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCwgQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeVxyXG4gKlxyXG4gKiBFeHRlbmRpbmcgY2xhc3Mgd29ya3MgbGlrZSBpbiBKYXZhIGV4Y2VwdCB0aGF0IGRlY29yYXRvcnMgYXJlIG9ubHkgc2Nhbm5lZCBpbiB0aGUgY2hpbGQgY2xhc3MuICBJbiB0aGlzIGNhc2UsXHJcbiAqIHdlIHdhbnQgdmFyaWFibGVzIGxpa2UgaW5wdXREYXRhIHRvIGJlIGF2YWlsYWJsZSB0byBhbGwgaW5saW5lIGNvbXBvbmVudHMgdGhhdCBleHRlbmQgdGhpcyBjbGFzczsgaG93ZXZlciwgd2Ugd2FudFxyXG4gKiB0aGlzIHZhcmlhYmxlIHRvIGJlIGFuIEBJbnB1dC5cclxuICogV2hhdCB3ZSBjYW4gZG8gaGVyZSBpcyBkZWZpbmUgXCJpbnB1dERhdGE6IE9iamVjdFwiIGhlcmUgYW5kIGluIHRoZSBleHRlbmRpbmcgY2xhc3MsIGRlZmluZSBcIkBJbnB1dCBpbnB1dERhdGE6IE9iamVjdFwiLlxyXG4gKlxyXG4gKiBUaGUgdHdvIHdheSBiaW5kaW5nIHRvIHRoZSBjb21wb25lbnQgaXMgaW5wdXREYXRhLiAgVG8gYWxsb3cgbm9uLXNhdmluZyBtb2RpZmljYXRpb24gdG8gdGhpcyBkYXRhLCB3ZSBjb3B5XHJcbiAqIGl0IHRvIG1vZGlmaWVkRGF0YS4gIFRoZSB3cmFwcGVkIGNvbXBvbmVudCBzdWNoIGFzIGlucHV0L3NlbGVjdC8uLi4gdGhlbiB1c2UgbW9kaWZpZWREYXRhIGFzIHRoZWlyIG5nTW9kZWwuXHJcbiAqIFdoZW4gd2UgY2FuY2VsIG91dCBvZiBlZGl0aW5nLCBtb2RpZmllZERhdGEgaXMgaWdub3JlZCBhbmQgcmVwbGFjZWQgd2l0aCBpbnB1dERhdGEuICBXaGVuIGVkaXRpbmcgaXMgc2F2ZWQsIGlucHV0RGF0YVxyXG4gKiBpcyByZXBsYWNlZCB3aXRoIG1vZGlmaWVkRGF0YS5cclxuICpcclxuICogQHNpbmNlIDEuMC4wXHJcbiAqL1xyXG5pbXBvcnQge0VsZW1lbnRSZWYsIEluamVjdGFibGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYXRlQmFzZSB7XHJcblxyXG4gIGlucHV0RGF0YTogT2JqZWN0O1xyXG4gIG1vZGlmaWVkRGF0YTogT2JqZWN0O1xyXG4gIHN0YXRlOiBudW1iZXIgPSAwO1xyXG5cclxuICBfZWw6IEhUTUxFbGVtZW50O1xyXG5cclxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XHJcbiAgICB0aGlzLl9lbCA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3RlbiB0byBjbGlja3Mgb24gdGhlIGRvY3VtZW50LiAgSWYgdGhlIHN0YXRlIGlzIGluIGVkaXQgbW9kZSBhbmQgdGhlcmUgaXMgYSBjbGljayBvdXRzaWRlIHRoZSBlbGVtZW50LFxyXG4gICAqIHRoZW4gc2F2ZSBpdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYW5kbGVPdXRzaWRlRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgdGFyZ2V0Q21wdDogSFRNTEVsZW1lbnQgPSBudWxsO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIENhdGNoIGV4Y2VwdGlvbiBpZiB0YXJnZXQgaXMgbm90IGFuIGVsZW1lbnRcclxuICAgICAgdGFyZ2V0Q21wdCA9ICg8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhpcy5zYXZlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaW5zaWRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBkbyB7XHJcbiAgICAgIGlmICh0YXJnZXRDbXB0ID09PSB0aGlzLl9lbCkge1xyXG4gICAgICAgIGluc2lkZSA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgdGFyZ2V0Q21wdCA9IHRhcmdldENtcHQucGFyZW50RWxlbWVudDtcclxuICAgIH0gd2hpbGUgKHRhcmdldENtcHQpO1xyXG4gICAgaWYgKCFpbnNpZGUpIHtcclxuICAgICAgdGhpcy5zYXZlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSBtb2RpZmllZERhdGEgKHdvcmtpbmcgZGF0YSkgdG8gdGhlIGJvdW5kIGRhdGEuXHJcbiAgICovXHJcbiAgcHVibGljIHVwZGF0ZUludGVybmFsRGF0YUZyb21Nb2RlbCgpIHtcclxuICAgIHRoaXMubW9kaWZpZWREYXRhID0gdGhpcy5pbnB1dERhdGE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSBib3VuZCBkYXRhIHdpdGggdGhlIHdvcmtpbmcgZGF0YS5cclxuICAgKi9cclxuICBwdWJsaWMgdXBkYXRlTW9kZWxGcm9tSW50ZXJuYWxEYXRhKCkge1xyXG4gICAgdGhpcy5pbnB1dERhdGEgPSB0aGlzLm1vZGlmaWVkRGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gdXNlciBjaG9vc2VzIHRvIGVkaXQsIGNoYW5nZSBzdGF0ZSB0byBzaG93IGVkaXQgZGlhbG9nLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGFydEVkaXQoKSB7XHJcbiAgICB0aGlzLm1vZGlmaWVkRGF0YSA9IHRoaXMuaW5wdXREYXRhO1xyXG4gICAgdGhpcy5zdGF0ZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmljIGFjdGlvbnMgdG8gY2hhbmdlIHN0YXRlIGJhc2VkIG9uIGtleSBpbnB1dC4gIEVzY2FwZSB3aWxsIGNhbmNlbCBvdXQgb2YgdGhlIGVkaXRcclxuICAgKiB3aXRob3V0IHNhdmluZywgZW50ZXIgd2lsbCBzYXZlIGFuZCBleGl0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGV2ZW50XHJcbiAgICovXHJcbiAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJlc2NhcGVcIikge1xyXG4gICAgICB0aGlzLmNhbmNlbCgpO1xyXG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IFwiZW50ZXJcIikge1xyXG4gICAgICB0aGlzLnNhdmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQHBhcmFtIG5ld1ZhbHVlXHJcbiAgICovXHJcbiAgcHVibGljIG9uQ2hhbmdlKG5ld1ZhbHVlOiBPYmplY3QpIHtcclxuICAgIHRoaXMubW9kaWZpZWREYXRhID0gbmV3VmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXBsYWNlIHRoZSBib3VuZCBkYXRhIHdpdGggdGhlIHdvcmtpbmcgZGF0YSBhbmQgZXhpdCBlZGl0aW5nIG1vZGUuXHJcbiAgICovXHJcbiAgcHVibGljIHNhdmUoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZU1vZGVsRnJvbUludGVybmFsRGF0YSgpO1xyXG4gICAgdGhpcy5zdGF0ZSA9IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEb24ndCB1cGRhdGUgdGhlIGJvdW5kIGRhdGEgYW5kIGV4aXQgdGhlIGVkaXRpbmcgbW9kZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2FuY2VsKCkge1xyXG4gICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFGcm9tTW9kZWwoKTtcclxuICAgIHRoaXMuc3RhdGUgPSAwO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
@@ -0,0 +1,133 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from "@angular/core";
2
+ import { DateComponent } from "./date-date.component";
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./date-date.component";
5
+ /**
6
+ * TODO: Confirm timezone behavior.
7
+ *
8
+ * @since 4.0.0
9
+ */
10
+ export class DateRangeComponent {
11
+ constructor() {
12
+ // Binded data from the parent component.
13
+ this.dateFormat = "shortDate";
14
+ this.inputDataChange = new EventEmitter();
15
+ }
16
+ ngOnInit() {
17
+ this.setRange();
18
+ }
19
+ /**
20
+ *
21
+ */
22
+ ngAfterViewInit() {
23
+ // if there is no start date but there is an end date, make the start date go to the end date
24
+ if (!this.inputStartData && this.inputEndData) {
25
+ let dt = new Date(this.inputEndData);
26
+ this.sp.startDate = { year: dt.getFullYear(), month: dt.getMonth() + 1, day: dt.getDate() };
27
+ }
28
+ }
29
+ onClickSubmitStartDate(startData) {
30
+ this.setRange();
31
+ // if there is no start date but there is an end date, make the start date go to the end date
32
+ if (!startData && this.inputEndData) {
33
+ let dt = new Date(this.inputEndData);
34
+ this.sp.startDate = { year: dt.getFullYear(), month: dt.getMonth() + 1, day: dt.getDate() };
35
+ }
36
+ this.inputDataChange.emit([this.inputStartData, this.inputEndData]);
37
+ }
38
+ onClickSubmitEndDate(endData) {
39
+ this.setRange();
40
+ this.inputDataChange.emit([this.inputStartData, this.inputEndData]);
41
+ }
42
+ setRange() {
43
+ // set the minDate to 20 years in the past by default
44
+ let today = new Date();
45
+ if (!this.minStartDate) {
46
+ this.minStartDate = { year: today.getFullYear() - 20, month: today.getMonth() + 1, day: today.getDate() };
47
+ }
48
+ this.minEndDate = this.minStartDate;
49
+ // set the maxDate to today by default
50
+ this.maxStartDate = { year: today.getFullYear(), month: today.getMonth() + 1, day: today.getDate() };
51
+ this.maxEndDate = this.maxStartDate;
52
+ if (this.inputEndData) {
53
+ let endDate = new Date(this.inputEndData);
54
+ this.maxStartDate = { year: endDate.getFullYear(), month: endDate.getMonth() + 1, day: endDate.getDate() };
55
+ }
56
+ if (this.inputStartData) {
57
+ let startDate = new Date(this.inputStartData);
58
+ this.minEndDate = { year: startDate.getFullYear(), month: startDate.getMonth() + 1, day: startDate.getDate() };
59
+ }
60
+ }
61
+ }
62
+ DateRangeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DateRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
63
+ DateRangeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DateRangeComponent, selector: "hci-date-range", inputs: { dateFormat: "dateFormat", inputStartData: "inputStartData", inputEndData: "inputEndData", startLabel: "startLabel", endLabel: "endLabel", minStartDate: "minStartDate" }, outputs: { inputDataChange: "inputDataChange" }, viewQueries: [{ propertyName: "sp", first: true, predicate: ["startdate"], descendants: true, static: true }, { propertyName: "ep", first: true, predicate: ["enddate"], descendants: true, static: true }], ngImport: i0, template: `
64
+ <div class="d-flex flex-wrap date-range">
65
+ <hci-date #startdate
66
+ class="date"
67
+ [label]="startLabel"
68
+ [(inputData)]="inputStartData"
69
+ (inputDataChange)="onClickSubmitStartDate($event)"
70
+ [dateFormat]="dateFormat"
71
+ [minDate]="minStartDate"
72
+ [maxDate]="maxStartDate">
73
+ </hci-date>
74
+ <hci-date #enddate
75
+ class="date"
76
+ [label]="endLabel"
77
+ [(inputData)]="inputEndData"
78
+ (inputDataChange)="onClickSubmitEndDate($event)"
79
+ [dateFormat]="dateFormat"
80
+ [minDate]="minEndDate"
81
+ [maxDate]="maxEndDate">
82
+ </hci-date>
83
+ </div>
84
+ `, isInline: true, dependencies: [{ kind: "component", type: i1.DateComponent, selector: "hci-date", inputs: ["dateFormat", "minDate", "maxDate", "label", "inputData", "modifiedData"], outputs: ["inputDataChange"] }] });
85
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DateRangeComponent, decorators: [{
86
+ type: Component,
87
+ args: [{
88
+ selector: "hci-date-range",
89
+ template: `
90
+ <div class="d-flex flex-wrap date-range">
91
+ <hci-date #startdate
92
+ class="date"
93
+ [label]="startLabel"
94
+ [(inputData)]="inputStartData"
95
+ (inputDataChange)="onClickSubmitStartDate($event)"
96
+ [dateFormat]="dateFormat"
97
+ [minDate]="minStartDate"
98
+ [maxDate]="maxStartDate">
99
+ </hci-date>
100
+ <hci-date #enddate
101
+ class="date"
102
+ [label]="endLabel"
103
+ [(inputData)]="inputEndData"
104
+ (inputDataChange)="onClickSubmitEndDate($event)"
105
+ [dateFormat]="dateFormat"
106
+ [minDate]="minEndDate"
107
+ [maxDate]="maxEndDate">
108
+ </hci-date>
109
+ </div>
110
+ `
111
+ }]
112
+ }], propDecorators: { sp: [{
113
+ type: ViewChild,
114
+ args: ["startdate", { static: true }]
115
+ }], ep: [{
116
+ type: ViewChild,
117
+ args: ["enddate", { static: true }]
118
+ }], dateFormat: [{
119
+ type: Input
120
+ }], inputStartData: [{
121
+ type: Input
122
+ }], inputEndData: [{
123
+ type: Input
124
+ }], startLabel: [{
125
+ type: Input
126
+ }], endLabel: [{
127
+ type: Input
128
+ }], inputDataChange: [{
129
+ type: Output
130
+ }], minStartDate: [{
131
+ type: Input
132
+ }] } });
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1kYXRlLXJhbmdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lucHV0L3NyYy9kYXRlL2RhdGUtZGF0ZS1yYW5nZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFpQixNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9GLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQzs7O0FBRXBEOzs7O0dBSUc7QUEwQkgsTUFBTSxPQUFPLGtCQUFrQjtJQXpCL0I7UUFpQ0cseUNBQXlDO1FBQ2hDLGVBQVUsR0FBVyxXQUFXLENBQUM7UUFLaEMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO0tBd0R4RDtJQWpERSxRQUFRO1FBQ04sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7TUFFRTtJQUNILGVBQWU7UUFDWiw2RkFBNkY7UUFDN0YsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUM3QyxJQUFJLEVBQUUsR0FBUyxJQUFJLElBQUksQ0FBUyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUMsQ0FBQztTQUMzRjtJQUNKLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxTQUFTO1FBQzlCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQiw2RkFBNkY7UUFDN0YsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENB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QUFNLEVBQUUsSUFBSSxFQUFDO2dCQUk1QixVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFFRSxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIEFmdGVyVmlld0luaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuaW1wb3J0IHtEYXRlQ29tcG9uZW50fSBmcm9tIFwiLi9kYXRlLWRhdGUuY29tcG9uZW50XCI7XHJcblxyXG4vKipcclxuICogVE9ETzogQ29uZmlybSB0aW1lem9uZSBiZWhhdmlvci5cclxuICpcclxuICogQHNpbmNlIDQuMC4wXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJoY2ktZGF0ZS1yYW5nZVwiLFxyXG4gIHRlbXBsYXRlOiBgICBcclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC13cmFwIGRhdGUtcmFuZ2VcIj5cclxuICAgICAgPGhjaS1kYXRlICNzdGFydGRhdGVcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwic3RhcnRMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbKGlucHV0RGF0YSldPVwiaW5wdXRTdGFydERhdGFcIlxyXG4gICAgICAgICAgICAgICAgKGlucHV0RGF0YUNoYW5nZSk9XCJvbkNsaWNrU3VibWl0U3RhcnREYXRlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJtaW5TdGFydERhdGVcIlxyXG4gICAgICAgICAgICAgICAgW21heERhdGVdPVwibWF4U3RhcnREYXRlXCI+XHJcbiAgICAgIDwvaGNpLWRhdGU+XHJcbiAgICAgIDxoY2ktZGF0ZSAjZW5kZGF0ZVxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJlbmRMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbKGlucHV0RGF0YSldPVwiaW5wdXRFbmREYXRhXCJcclxuICAgICAgICAgICAgICAgIChpbnB1dERhdGFDaGFuZ2UpPVwib25DbGlja1N1Ym1pdEVuZERhdGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCJkYXRlRm9ybWF0XCJcclxuICAgICAgICAgICAgICAgIFttaW5EYXRlXT1cIm1pbkVuZERhdGVcIlxyXG4gICAgICAgICAgICAgICAgW21heERhdGVdPVwibWF4RW5kRGF0ZVwiPlxyXG4gICAgICA8L2hjaS1kYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZVJhbmdlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gICAgQFZpZXdDaGlsZChcInN0YXJ0ZGF0ZVwiLCB7c3RhdGljOiB0cnVlfSlcclxuICAgIHNwOiBEYXRlQ29tcG9uZW50O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoXCJlbmRkYXRlXCIsIHtzdGF0aWM6IHRydWV9KVxyXG4gICAgZXA6IERhdGVDb21wb25lbnQ7XHJcblxyXG4gICAvLyBCaW5kZWQgZGF0YSBmcm9tIHRoZSBwYXJlbnQgY29tcG9uZW50LlxyXG4gICBASW5wdXQoKSBkYXRlRm9ybWF0OiBzdHJpbmcgPSBcInNob3J0RGF0ZVwiO1xyXG4gICBASW5wdXQoKSBpbnB1dFN0YXJ0RGF0YTogT2JqZWN0O1xyXG4gICBASW5wdXQoKSBpbnB1dEVuZERhdGE6IE9iamVjdDtcclxuICAgQElucHV0KCkgc3RhcnRMYWJlbDogc3RyaW5nO1xyXG4gICBASW5wdXQoKSBlbmRMYWJlbDogc3RyaW5nO1xyXG4gICBAT3V0cHV0KCkgaW5wdXREYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcclxuXHJcbiAgIEBJbnB1dCgpIG1pblN0YXJ0RGF0ZTogYW55O1xyXG4gICBwdWJsaWMgbWF4U3RhcnREYXRlO1xyXG4gICBwdWJsaWMgbWluRW5kRGF0ZTtcclxuICAgcHVibGljIG1heEVuZERhdGU7XHJcblxyXG4gICBuZ09uSW5pdCgpIHtcclxuICAgICB0aGlzLnNldFJhbmdlKCk7XHJcbiAgIH1cclxuXHJcbiAgIC8qKlxyXG4gICAqXHJcbiAgICovXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgIC8vIGlmIHRoZXJlIGlzIG5vIHN0YXJ0IGRhdGUgYnV0IHRoZXJlIGlzIGFuIGVuZCBkYXRlLCBtYWtlIHRoZSBzdGFydCBkYXRlIGdvIHRvIHRoZSBlbmQgZGF0ZVxyXG4gICAgIGlmICghdGhpcy5pbnB1dFN0YXJ0RGF0YSAmJiB0aGlzLmlucHV0RW5kRGF0YSkge1xyXG4gICAgICAgbGV0IGR0OiBEYXRlID0gbmV3IERhdGUoPHN0cmluZz50aGlzLmlucHV0RW5kRGF0YSk7XHJcbiAgICAgICB0aGlzLnNwLnN0YXJ0RGF0ZSA9IHt5ZWFyOiBkdC5nZXRGdWxsWWVhcigpLCBtb250aDogZHQuZ2V0TW9udGgoKSArIDEsIGRheTogZHQuZ2V0RGF0ZSgpfTtcclxuICAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrU3VibWl0U3RhcnREYXRlKHN0YXJ0RGF0YSkge1xyXG4gICAgdGhpcy5zZXRSYW5nZSgpO1xyXG4gICAgLy8gaWYgdGhlcmUgaXMgbm8gc3RhcnQgZGF0ZSBidXQgdGhlcmUgaXMgYW4gZW5kIGRhdGUsIG1ha2UgdGhlIHN0YXJ0IGRhdGUgZ28gdG8gdGhlIGVuZCBkYXRlXHJcbiAgICBpZiAoIXN0YXJ0RGF0YSAmJiB0aGlzLmlucHV0RW5kRGF0YSkge1xyXG4gICAgICBsZXQgZHQ6IERhdGUgPSBuZXcgRGF0ZSg8c3RyaW5nPnRoaXMuaW5wdXRFbmREYXRhKTtcclxuICAgICAgdGhpcy5zcC5zdGFydERhdGUgPSB7eWVhcjogZHQuZ2V0RnVsbFllYXIoKSwgbW9udGg6IGR0LmdldE1vbnRoKCkgKyAxLCBkYXk6IGR0LmdldERhdGUoKX07XHJcbiAgICB9XHJcbiAgICB0aGlzLmlucHV0RGF0YUNoYW5nZS5lbWl0KFt0aGlzLmlucHV0U3RhcnREYXRhLCB0aGlzLmlucHV0RW5kRGF0YV0pO1xyXG4gIH1cclxuXHJcbiAgb25DbGlja1N1Ym1pdEVuZERhdGUoZW5kRGF0YSkge1xyXG4gICAgdGhpcy5zZXRSYW5nZSgpO1xyXG4gICAgdGhpcy5pbnB1dERhdGFDaGFuZ2UuZW1pdChbdGhpcy5pbnB1dFN0YXJ0RGF0YSwgdGhpcy5pbnB1dEVuZERhdGFdKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0UmFuZ2UoKSB7XHJcbiAgICAvLyBzZXQgdGhlIG1pbkRhdGUgdG8gMjAgeWVhcnMgaW4gdGhlIHBhc3QgYnkgZGVmYXVsdFxyXG4gICAgbGV0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIGlmICghdGhpcy5taW5TdGFydERhdGUpIHtcclxuICAgICAgICB0aGlzLm1pblN0YXJ0RGF0ZSA9IHt5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpIC0gMjAsIG1vbnRoOiB0b2RheS5nZXRNb250aCgpICsgMSwgZGF5OiB0b2RheS5nZXREYXRlKCl9O1xyXG4gICAgfVxyXG4gICAgdGhpcy5taW5FbmREYXRlID0gdGhpcy5taW5TdGFydERhdGU7XHJcbiAgICAvLyBzZXQgdGhlIG1heERhdGUgdG8gdG9kYXkgYnkgZGVmYXVsdFxyXG4gICAgdGhpcy5tYXhTdGFydERhdGUgPSB7eWVhcjogdG9kYXkuZ2V0RnVsbFllYXIoKSwgbW9udGg6IHRvZGF5LmdldE1vbnRoKCkgKyAxLCBkYXk6IHRvZGF5LmdldERhdGUoKX07XHJcbiAgICB0aGlzLm1heEVuZERhdGUgPSB0aGlzLm1heFN0YXJ0RGF0ZTtcclxuICAgIGlmICh0aGlzLmlucHV0RW5kRGF0YSkge1xyXG4gICAgICAgIGxldCBlbmREYXRlID0gbmV3IERhdGUoPHN0cmluZz50aGlzLmlucHV0RW5kRGF0YSk7XHJcbiAgICAgICAgdGhpcy5tYXhTdGFydERhdGUgPSB7eWVhcjogZW5kRGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aDogZW5kRGF0ZS5nZXRNb250aCgpICsgMSwgZGF5OiBlbmREYXRlLmdldERhdGUoKX07XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pbnB1dFN0YXJ0RGF0YSkge1xyXG4gICAgICAgIGxldCBzdGFydERhdGUgPSBuZXcgRGF0ZSg8c3RyaW5nPnRoaXMuaW5wdXRTdGFydERhdGEpO1xyXG4gICAgICAgIHRoaXMubWluRW5kRGF0ZSA9IHt5ZWFyOiBzdGFydERhdGUuZ2V0RnVsbFllYXIoKSwgbW9udGg6IHN0YXJ0RGF0ZS5nZXRNb250aCgpICsgMSwgZGF5OiBzdGFydERhdGUuZ2V0RGF0ZSgpfTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19