ngx-bootstrap 8.0.0-RC.2 → 8.0.0-RC.3

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 (73) hide show
  1. package/accordion/package.json +5 -3
  2. package/alert/package.json +4 -2
  3. package/buttons/package.json +3 -1
  4. package/carousel/package.json +4 -2
  5. package/chronos/esm2020/i18n/es-pr.mjs +74 -0
  6. package/chronos/esm2020/public_api.mjs +2 -1
  7. package/chronos/fesm2015/ngx-bootstrap-chronos.mjs +90 -17
  8. package/chronos/fesm2015/ngx-bootstrap-chronos.mjs.map +1 -1
  9. package/chronos/fesm2020/ngx-bootstrap-chronos.mjs +90 -17
  10. package/chronos/fesm2020/ngx-bootstrap-chronos.mjs.map +1 -1
  11. package/chronos/i18n/es-pr.d.ts +2 -0
  12. package/chronos/package.json +3 -1
  13. package/chronos/public_api.d.ts +1 -0
  14. package/collapse/package.json +3 -1
  15. package/component-loader/package.json +5 -3
  16. package/datepicker/esm2020/public_api.mjs +1 -9
  17. package/datepicker/esm2020/reducer/bs-datepicker.reducer.mjs +2 -2
  18. package/datepicker/fesm2015/ngx-bootstrap-datepicker.mjs +3 -1108
  19. package/datepicker/fesm2015/ngx-bootstrap-datepicker.mjs.map +1 -1
  20. package/datepicker/fesm2020/ngx-bootstrap-datepicker.mjs +3 -1107
  21. package/datepicker/fesm2020/ngx-bootstrap-datepicker.mjs.map +1 -1
  22. package/datepicker/package.json +10 -8
  23. package/datepicker/public_api.d.ts +0 -8
  24. package/dropdown/package.json +6 -4
  25. package/focus-trap/package.json +3 -1
  26. package/locale/esm2020/public_api.mjs +2 -1
  27. package/locale/fesm2015/ngx-bootstrap-locale.mjs +1 -1
  28. package/locale/fesm2020/ngx-bootstrap-locale.mjs +1 -1
  29. package/locale/package.json +4 -2
  30. package/locale/public_api.d.ts +1 -0
  31. package/mini-ngrx/package.json +3 -1
  32. package/modal/package.json +7 -5
  33. package/package.json +5 -5
  34. package/pagination/package.json +3 -1
  35. package/popover/esm2020/popover-container.component.mjs +3 -3
  36. package/popover/fesm2015/ngx-bootstrap-popover.mjs +2 -2
  37. package/popover/fesm2015/ngx-bootstrap-popover.mjs.map +1 -1
  38. package/popover/fesm2020/ngx-bootstrap-popover.mjs +2 -2
  39. package/popover/fesm2020/ngx-bootstrap-popover.mjs.map +1 -1
  40. package/popover/package.json +6 -4
  41. package/positioning/esm2020/modifiers/preventOverflow.mjs +6 -7
  42. package/positioning/esm2020/utils/computeAutoPlacement.mjs +15 -19
  43. package/positioning/fesm2015/ngx-bootstrap-positioning.mjs +21 -26
  44. package/positioning/fesm2015/ngx-bootstrap-positioning.mjs.map +1 -1
  45. package/positioning/fesm2020/ngx-bootstrap-positioning.mjs +19 -24
  46. package/positioning/fesm2020/ngx-bootstrap-positioning.mjs.map +1 -1
  47. package/positioning/package.json +4 -2
  48. package/progressbar/package.json +4 -2
  49. package/rating/package.json +3 -1
  50. package/schematics/package.json +3 -1
  51. package/schematics/utils/current_dependency_versions.json +1 -1
  52. package/sortable/package.json +3 -1
  53. package/tabs/package.json +3 -1
  54. package/timepicker/package.json +4 -2
  55. package/tooltip/package.json +6 -4
  56. package/typeahead/package.json +6 -4
  57. package/utils/package.json +3 -1
  58. package/datepicker/date-formatter.d.ts +0 -3
  59. package/datepicker/datepicker-inner.component.d.ts +0 -80
  60. package/datepicker/datepicker.component.d.ts +0 -81
  61. package/datepicker/datepicker.config.d.ts +0 -22
  62. package/datepicker/datepicker.module.d.ts +0 -15
  63. package/datepicker/daypicker.component.d.ts +0 -20
  64. package/datepicker/esm2020/date-formatter.mjs +0 -7
  65. package/datepicker/esm2020/datepicker-inner.component.mjs +0 -325
  66. package/datepicker/esm2020/datepicker.component.mjs +0 -204
  67. package/datepicker/esm2020/datepicker.config.mjs +0 -32
  68. package/datepicker/esm2020/datepicker.module.mjs +0 -48
  69. package/datepicker/esm2020/daypicker.component.mjs +0 -255
  70. package/datepicker/esm2020/monthpicker.component.mjs +0 -131
  71. package/datepicker/esm2020/yearpicker.component.mjs +0 -146
  72. package/datepicker/monthpicker.component.d.ts +0 -14
  73. package/datepicker/yearpicker.component.d.ts +0 -14
@@ -1,3 +0,0 @@
1
- export declare class DateFormatter {
2
- format(date: Date, format: string, locale?: string): string;
3
- }
@@ -1,80 +0,0 @@
1
- import { EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
- import { DateFormatter } from './date-formatter';
3
- import * as i0 from "@angular/core";
4
- declare type CompareDatesFn = (date1: Date, date2: Date) => number;
5
- export declare class DatePickerInnerComponent implements OnInit, OnChanges {
6
- locale?: string;
7
- datepickerMode?: string;
8
- startingDay?: number;
9
- yearRange?: number;
10
- minDate?: Date;
11
- maxDate?: Date;
12
- minMode?: string;
13
- maxMode?: string;
14
- showWeeks?: boolean;
15
- formatDay?: string;
16
- formatMonth?: string;
17
- formatYear?: string;
18
- formatDayHeader?: string;
19
- formatDayTitle?: string;
20
- formatMonthTitle?: string;
21
- onlyCurrentMonth?: boolean;
22
- shortcutPropagation?: boolean;
23
- customClass?: {
24
- date: Date;
25
- mode: string;
26
- clazz: string;
27
- }[];
28
- monthColLimit: number;
29
- yearColLimit: number;
30
- dateDisabled?: {
31
- date: Date;
32
- mode: string;
33
- }[];
34
- dayDisabled?: number[];
35
- initDate?: Date;
36
- selectionDone: EventEmitter<Date>;
37
- update: EventEmitter<Date>;
38
- activeDateChange: EventEmitter<Date>;
39
- stepDay: {};
40
- stepMonth: {};
41
- stepYear: {};
42
- uniqueId?: string;
43
- protected modes: string[];
44
- protected dateFormatter: DateFormatter;
45
- protected selectedDate?: Date;
46
- protected activeDateId?: string;
47
- protected refreshViewHandlerDay?: () => void;
48
- protected compareHandlerDay?: CompareDatesFn;
49
- protected refreshViewHandlerMonth?: () => void;
50
- protected compareHandlerMonth?: CompareDatesFn;
51
- protected refreshViewHandlerYear?: () => void;
52
- protected compareHandlerYear?: CompareDatesFn;
53
- protected _activeDate?: Date;
54
- get activeDate(): Date | undefined;
55
- set activeDate(value: Date | undefined);
56
- ngOnInit(): void;
57
- ngOnChanges(changes: SimpleChanges): void;
58
- checkIfActiveDateGotUpdated(activeDate: any): void;
59
- setCompareHandler(handler: CompareDatesFn, type: string): void;
60
- compare(date1?: Date, date2?: Date): number | undefined;
61
- setRefreshViewHandler(handler: () => void, type: string): void;
62
- refreshView(): void;
63
- dateFilter(date: Date, format: string): string;
64
- isActive(dateObject: any): boolean;
65
- createDateObject(date: Date, format: string): any;
66
- split(arr: any[], size: number): any[];
67
- fixTimeZone(date: Date): Date;
68
- select(date: Date, isManual?: boolean): void;
69
- move(direction: number): void;
70
- toggleMode(_direction: number): void;
71
- protected getCustomClassForDate(date: Date): string;
72
- protected compareDateDisabled(date1Disabled: {
73
- date: Date;
74
- mode: string;
75
- }, date2: Date): number | undefined;
76
- protected isDisabled(date: Date): boolean;
77
- static ɵfac: i0.ɵɵFactoryDeclaration<DatePickerInnerComponent, never>;
78
- static ɵcmp: i0.ɵɵComponentDeclaration<DatePickerInnerComponent, "datepicker-inner", never, { "locale": "locale"; "datepickerMode": "datepickerMode"; "startingDay": "startingDay"; "yearRange": "yearRange"; "minDate": "minDate"; "maxDate": "maxDate"; "minMode": "minMode"; "maxMode": "maxMode"; "showWeeks": "showWeeks"; "formatDay": "formatDay"; "formatMonth": "formatMonth"; "formatYear": "formatYear"; "formatDayHeader": "formatDayHeader"; "formatDayTitle": "formatDayTitle"; "formatMonthTitle": "formatMonthTitle"; "onlyCurrentMonth": "onlyCurrentMonth"; "shortcutPropagation": "shortcutPropagation"; "customClass": "customClass"; "monthColLimit": "monthColLimit"; "yearColLimit": "yearColLimit"; "dateDisabled": "dateDisabled"; "dayDisabled": "dayDisabled"; "initDate": "initDate"; "activeDate": "activeDate"; }, { "selectionDone": "selectionDone"; "update": "update"; "activeDateChange": "activeDateChange"; }, never, ["*"]>;
79
- }
80
- export {};
@@ -1,81 +0,0 @@
1
- import { EventEmitter, Provider } from '@angular/core';
2
- import { ControlValueAccessor } from '@angular/forms';
3
- import { DatePickerInnerComponent } from './datepicker-inner.component';
4
- import { DatepickerConfig } from './datepicker.config';
5
- import * as i0 from "@angular/core";
6
- export declare const DATEPICKER_CONTROL_VALUE_ACCESSOR: Provider;
7
- export declare class DatePickerComponent implements ControlValueAccessor {
8
- /** sets datepicker mode, supports: `day`, `month`, `year` */
9
- datepickerMode: string;
10
- /** default date to show if `ng-model` value is not specified */
11
- initDate?: Date;
12
- /** oldest selectable date */
13
- minDate?: Date;
14
- /** latest selectable date */
15
- maxDate?: Date;
16
- /** set lower datepicker mode, supports: `day`, `month`, `year` */
17
- minMode?: string;
18
- /** sets upper datepicker mode, supports: `day`, `month`, `year` */
19
- maxMode?: string;
20
- /** if false week numbers will be hidden */
21
- showWeeks: boolean;
22
- /** format of day in month */
23
- formatDay?: string;
24
- /** format of month in year */
25
- formatMonth?: string;
26
- /** format of year in year range */
27
- formatYear?: string;
28
- /** format of day in week header */
29
- formatDayHeader?: string;
30
- /** format of title when selecting day */
31
- formatDayTitle?: string;
32
- /** format of title when selecting month */
33
- formatMonthTitle?: string;
34
- /** starting day of the week from 0-6 (0=Sunday, ..., 6=Saturday) */
35
- startingDay?: number;
36
- /** number of years displayed in year selection */
37
- yearRange?: number;
38
- /** if true only dates from the currently displayed month will be shown */
39
- onlyCurrentMonth?: boolean;
40
- /** if true shortcut`s event propagation will be disabled */
41
- shortcutPropagation?: boolean;
42
- /** number of months displayed in a single row of month picker */
43
- monthColLimit: number;
44
- /** number of years displayed in a single row of year picker */
45
- yearColLimit: number;
46
- /** array of custom css classes to be applied to targeted dates */
47
- customClass?: {
48
- date: Date;
49
- mode: string;
50
- clazz: string;
51
- }[];
52
- /** array of disabled dates */
53
- dateDisabled?: {
54
- date: Date;
55
- mode: string;
56
- }[];
57
- /** disabled days of the week from 0-6 (0=Sunday, ..., 6=Saturday) */
58
- dayDisabled?: number[];
59
- /** currently active date */
60
- get activeDate(): Date | undefined;
61
- set activeDate(value: Date | undefined);
62
- selectionDone: EventEmitter<Date>;
63
- /** callback to invoke when the activeDate is changed. */
64
- activeDateChange: EventEmitter<Date>;
65
- _datePicker?: DatePickerInnerComponent;
66
- onChange: any;
67
- onTouched: any;
68
- config: DatepickerConfig;
69
- protected _now: Date;
70
- protected _activeDate?: Date;
71
- constructor(config: DatepickerConfig);
72
- configureOptions(): void;
73
- onUpdate(event: Date): void;
74
- onSelectionDone(event: Date): void;
75
- onActiveDateChange(event: Date): void;
76
- writeValue(value: any): void;
77
- registerOnChange(fn: () => void): void;
78
- registerOnTouched(fn: () => void): void;
79
- static ɵfac: i0.ɵɵFactoryDeclaration<DatePickerComponent, never>;
80
- static ɵcmp: i0.ɵɵComponentDeclaration<DatePickerComponent, "datepicker", never, { "datepickerMode": "datepickerMode"; "initDate": "initDate"; "minDate": "minDate"; "maxDate": "maxDate"; "minMode": "minMode"; "maxMode": "maxMode"; "showWeeks": "showWeeks"; "formatDay": "formatDay"; "formatMonth": "formatMonth"; "formatYear": "formatYear"; "formatDayHeader": "formatDayHeader"; "formatDayTitle": "formatDayTitle"; "formatMonthTitle": "formatMonthTitle"; "startingDay": "startingDay"; "yearRange": "yearRange"; "onlyCurrentMonth": "onlyCurrentMonth"; "shortcutPropagation": "shortcutPropagation"; "monthColLimit": "monthColLimit"; "yearColLimit": "yearColLimit"; "customClass": "customClass"; "dateDisabled": "dateDisabled"; "dayDisabled": "dayDisabled"; "activeDate": "activeDate"; }, { "selectionDone": "selectionDone"; "activeDateChange": "activeDateChange"; }, never, never>;
81
- }
@@ -1,22 +0,0 @@
1
- import * as i0 from "@angular/core";
2
- export declare class DatepickerConfig {
3
- locale: string;
4
- datepickerMode: string;
5
- startingDay: number;
6
- yearRange: number;
7
- minMode: string;
8
- maxMode: string;
9
- showWeeks: boolean;
10
- formatDay: string;
11
- formatMonth: string;
12
- formatYear: string;
13
- formatDayHeader: string;
14
- formatDayTitle: string;
15
- formatMonthTitle: string;
16
- onlyCurrentMonth: boolean;
17
- monthColLimit: number;
18
- yearColLimit: number;
19
- shortcutPropagation: boolean;
20
- static ɵfac: i0.ɵɵFactoryDeclaration<DatepickerConfig, never>;
21
- static ɵprov: i0.ɵɵInjectableDeclaration<DatepickerConfig>;
22
- }
@@ -1,15 +0,0 @@
1
- import { ModuleWithProviders } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "./datepicker.component";
4
- import * as i2 from "./datepicker-inner.component";
5
- import * as i3 from "./daypicker.component";
6
- import * as i4 from "./monthpicker.component";
7
- import * as i5 from "./yearpicker.component";
8
- import * as i6 from "@angular/common";
9
- import * as i7 from "@angular/forms";
10
- export declare class DatepickerModule {
11
- static forRoot(): ModuleWithProviders<DatepickerModule>;
12
- static ɵfac: i0.ɵɵFactoryDeclaration<DatepickerModule, never>;
13
- static ɵmod: i0.ɵɵNgModuleDeclaration<DatepickerModule, [typeof i1.DatePickerComponent, typeof i2.DatePickerInnerComponent, typeof i3.DayPickerComponent, typeof i4.MonthPickerComponent, typeof i5.YearPickerComponent], [typeof i6.CommonModule, typeof i7.FormsModule], [typeof i1.DatePickerComponent, typeof i2.DatePickerInnerComponent, typeof i3.DayPickerComponent, typeof i4.MonthPickerComponent, typeof i5.YearPickerComponent]>;
14
- static ɵinj: i0.ɵɵInjectorDeclaration<DatepickerModule>;
15
- }
@@ -1,20 +0,0 @@
1
- import { OnInit } from '@angular/core';
2
- import { DatePickerInnerComponent } from './datepicker-inner.component';
3
- import * as i0 from "@angular/core";
4
- export declare class DayPickerComponent implements OnInit {
5
- labels: {
6
- abbr?: unknown;
7
- full?: unknown;
8
- }[];
9
- title?: string;
10
- rows: any;
11
- weekNumbers: number[];
12
- datePicker: DatePickerInnerComponent;
13
- constructor(datePicker: DatePickerInnerComponent);
14
- get isBs4(): boolean;
15
- ngOnInit(): void;
16
- protected getDates(startDate: Date, n: number): Date[];
17
- protected getISO8601WeekNumber(date: Date): number;
18
- static ɵfac: i0.ɵɵFactoryDeclaration<DayPickerComponent, never>;
19
- static ɵcmp: i0.ɵɵComponentDeclaration<DayPickerComponent, "daypicker", never, {}, {}, never, never>;
20
- }
@@ -1,7 +0,0 @@
1
- import { formatDate } from 'ngx-bootstrap/chronos';
2
- export class DateFormatter {
3
- format(date, format, locale) {
4
- return formatDate(date, format, locale);
5
- }
6
- }
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0ZXBpY2tlci9kYXRlLWZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsTUFBTSxPQUFPLGFBQWE7SUFDeEIsTUFBTSxDQUFDLElBQVUsRUFBRSxNQUFjLEVBQUUsTUFBZTtRQUNoRCxPQUFPLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuXG5leHBvcnQgY2xhc3MgRGF0ZUZvcm1hdHRlciB7XG4gIGZvcm1hdChkYXRlOiBEYXRlLCBmb3JtYXQ6IHN0cmluZywgbG9jYWxlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0RGF0ZShkYXRlLCBmb3JtYXQsIGxvY2FsZSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,325 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { DateFormatter } from './date-formatter';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- export class DatePickerInnerComponent {
6
- constructor() {
7
- this.monthColLimit = 0;
8
- this.yearColLimit = 0;
9
- this.selectionDone = new EventEmitter(undefined);
10
- this.update = new EventEmitter(false);
11
- this.activeDateChange = new EventEmitter(undefined);
12
- this.stepDay = {};
13
- this.stepMonth = {};
14
- this.stepYear = {};
15
- this.modes = ['day', 'month', 'year'];
16
- this.dateFormatter = new DateFormatter();
17
- }
18
- get activeDate() {
19
- return this._activeDate;
20
- }
21
- set activeDate(value) {
22
- this._activeDate = value;
23
- }
24
- // todo: add formatter value to Date object
25
- ngOnInit() {
26
- // todo: use date for unique value
27
- this.uniqueId = `datepicker--${Math.floor(Math.random() * 10000)}`;
28
- if (this.initDate) {
29
- this.activeDate = this.initDate;
30
- this.selectedDate = new Date(this.activeDate.valueOf());
31
- this.update.emit(this.activeDate);
32
- }
33
- else if (this.activeDate === undefined) {
34
- this.activeDate = new Date();
35
- }
36
- }
37
- // this.refreshView should be called here to reflect the changes on the fly
38
- ngOnChanges(changes) {
39
- this.refreshView();
40
- this.checkIfActiveDateGotUpdated(changes["activeDate"]);
41
- }
42
- // Check if activeDate has been update and then emit the activeDateChange with the new date
43
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
- checkIfActiveDateGotUpdated(activeDate) {
45
- if (activeDate && !activeDate.firstChange) {
46
- const previousValue = activeDate.previousValue;
47
- if (previousValue &&
48
- previousValue instanceof Date &&
49
- previousValue.getTime() !== activeDate.currentValue.getTime()) {
50
- this.activeDateChange.emit(this.activeDate);
51
- }
52
- }
53
- }
54
- setCompareHandler(handler, type) {
55
- if (type === 'day') {
56
- this.compareHandlerDay = handler;
57
- }
58
- if (type === 'month') {
59
- this.compareHandlerMonth = handler;
60
- }
61
- if (type === 'year') {
62
- this.compareHandlerYear = handler;
63
- }
64
- }
65
- compare(date1, date2) {
66
- if (date1 === undefined || date2 === undefined) {
67
- return undefined;
68
- }
69
- if (this.datepickerMode === 'day' && this.compareHandlerDay) {
70
- return this.compareHandlerDay(date1, date2);
71
- }
72
- if (this.datepickerMode === 'month' && this.compareHandlerMonth) {
73
- return this.compareHandlerMonth(date1, date2);
74
- }
75
- if (this.datepickerMode === 'year' && this.compareHandlerYear) {
76
- return this.compareHandlerYear(date1, date2);
77
- }
78
- return void 0;
79
- }
80
- setRefreshViewHandler(handler, type) {
81
- if (type === 'day') {
82
- this.refreshViewHandlerDay = handler;
83
- }
84
- if (type === 'month') {
85
- this.refreshViewHandlerMonth = handler;
86
- }
87
- if (type === 'year') {
88
- this.refreshViewHandlerYear = handler;
89
- }
90
- }
91
- refreshView() {
92
- if (this.datepickerMode === 'day' && this.refreshViewHandlerDay) {
93
- this.refreshViewHandlerDay();
94
- }
95
- if (this.datepickerMode === 'month' && this.refreshViewHandlerMonth) {
96
- this.refreshViewHandlerMonth();
97
- }
98
- if (this.datepickerMode === 'year' && this.refreshViewHandlerYear) {
99
- this.refreshViewHandlerYear();
100
- }
101
- }
102
- dateFilter(date, format) {
103
- return this.dateFormatter.format(date, format, this.locale);
104
- }
105
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
106
- isActive(dateObject) {
107
- if (this.compare(dateObject.date, this.activeDate) === 0) {
108
- this.activeDateId = dateObject.uid;
109
- return true;
110
- }
111
- return false;
112
- }
113
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
114
- createDateObject(date, format) {
115
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
116
- const dateObject = {};
117
- dateObject.date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
118
- dateObject.date = this.fixTimeZone(dateObject.date);
119
- dateObject.label = this.dateFilter(date, format);
120
- dateObject.selected = this.compare(date, this.selectedDate) === 0;
121
- dateObject.disabled = this.isDisabled(date);
122
- dateObject.current = this.compare(date, new Date()) === 0;
123
- dateObject.customClass = this.getCustomClassForDate(dateObject.date);
124
- return dateObject;
125
- }
126
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
127
- split(arr, size) {
128
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
129
- const arrays = [];
130
- while (arr.length > 0) {
131
- arrays.push(arr.splice(0, size));
132
- }
133
- return arrays;
134
- }
135
- // Fix a hard-reproducible bug with timezones
136
- // The bug depends on OS, browser, current timezone and current date
137
- // i.e.
138
- // var date = new Date(2014, 0, 1);
139
- // console.log(date.getFullYear(), date.getMonth(), date.getDate(),
140
- // date.getHours()); can result in "2013 11 31 23" because of the bug.
141
- fixTimeZone(date) {
142
- const hours = date.getHours();
143
- return new Date(date.getFullYear(), date.getMonth(), date.getDate(), hours === 23 ? hours + 2 : 0);
144
- }
145
- select(date, isManual = true) {
146
- if (this.datepickerMode === this.minMode) {
147
- if (!this.activeDate) {
148
- this.activeDate = new Date(0, 0, 0, 0, 0, 0, 0);
149
- }
150
- this.activeDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
151
- this.activeDate = this.fixTimeZone(this.activeDate);
152
- if (isManual) {
153
- this.selectionDone.emit(this.activeDate);
154
- }
155
- }
156
- else {
157
- this.activeDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
158
- this.activeDate = this.fixTimeZone(this.activeDate);
159
- if (isManual && this.datepickerMode) {
160
- this.datepickerMode = this.modes[this.modes.indexOf(this.datepickerMode) - 1];
161
- }
162
- }
163
- this.selectedDate = new Date(this.activeDate.valueOf());
164
- this.update.emit(this.activeDate);
165
- this.refreshView();
166
- }
167
- move(direction) {
168
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
169
- let expectedStep;
170
- if (this.datepickerMode === 'day') {
171
- expectedStep = this.stepDay;
172
- }
173
- if (this.datepickerMode === 'month') {
174
- expectedStep = this.stepMonth;
175
- }
176
- if (this.datepickerMode === 'year') {
177
- expectedStep = this.stepYear;
178
- }
179
- if (expectedStep && this.activeDate) {
180
- const year = this.activeDate.getFullYear() + direction * (expectedStep.years || 0);
181
- const month = this.activeDate.getMonth() + direction * (expectedStep.months || 0);
182
- this.activeDate = new Date(year, month, 1);
183
- this.refreshView();
184
- this.activeDateChange.emit(this.activeDate);
185
- }
186
- }
187
- toggleMode(_direction) {
188
- const direction = _direction || 1;
189
- if ((this.datepickerMode === this.maxMode && direction === 1) ||
190
- (this.datepickerMode === this.minMode && direction === -1)) {
191
- return;
192
- }
193
- if (this.datepickerMode) {
194
- this.datepickerMode = this.modes[this.modes.indexOf(this.datepickerMode) + direction];
195
- }
196
- this.refreshView();
197
- }
198
- getCustomClassForDate(date) {
199
- if (!this.customClass) {
200
- return '';
201
- }
202
- // todo: build a hash of custom classes, it will work faster
203
- const customClassObject = this.customClass.find((customClass) => {
204
- return (customClass.date.valueOf() === date.valueOf() &&
205
- customClass.mode === this.datepickerMode);
206
- }, this);
207
- return customClassObject === undefined ? '' : customClassObject.clazz;
208
- }
209
- compareDateDisabled(date1Disabled, date2) {
210
- if (date1Disabled === undefined || date2 === undefined) {
211
- return undefined;
212
- }
213
- if (date1Disabled.mode === 'day' && this.compareHandlerDay) {
214
- return this.compareHandlerDay(date1Disabled.date, date2);
215
- }
216
- if (date1Disabled.mode === 'month' && this.compareHandlerMonth) {
217
- return this.compareHandlerMonth(date1Disabled.date, date2);
218
- }
219
- if (date1Disabled.mode === 'year' && this.compareHandlerYear) {
220
- return this.compareHandlerYear(date1Disabled.date, date2);
221
- }
222
- return undefined;
223
- }
224
- isDisabled(date) {
225
- let isDateDisabled = false;
226
- if (this.dateDisabled) {
227
- this.dateDisabled.forEach((disabledDate) => {
228
- if (this.compareDateDisabled(disabledDate, date) === 0) {
229
- isDateDisabled = true;
230
- }
231
- });
232
- }
233
- if (this.dayDisabled) {
234
- isDateDisabled =
235
- isDateDisabled ||
236
- this.dayDisabled.indexOf(date.getDay()) > -1;
237
- }
238
- if (isDateDisabled) {
239
- return isDateDisabled;
240
- }
241
- const minDate = Number(this.minDate && this.compare(date, this.minDate));
242
- if (!isNaN(minDate)) {
243
- return minDate < 0;
244
- }
245
- const maxDate = Number(this.maxDate && this.compare(date, this.maxDate));
246
- if (!isNaN(maxDate)) {
247
- return maxDate > 0;
248
- }
249
- return false;
250
- }
251
- }
252
- DatePickerInnerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DatePickerInnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
253
- DatePickerInnerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: DatePickerInnerComponent, selector: "datepicker-inner", inputs: { locale: "locale", datepickerMode: "datepickerMode", startingDay: "startingDay", yearRange: "yearRange", minDate: "minDate", maxDate: "maxDate", minMode: "minMode", maxMode: "maxMode", showWeeks: "showWeeks", formatDay: "formatDay", formatMonth: "formatMonth", formatYear: "formatYear", formatDayHeader: "formatDayHeader", formatDayTitle: "formatDayTitle", formatMonthTitle: "formatMonthTitle", onlyCurrentMonth: "onlyCurrentMonth", shortcutPropagation: "shortcutPropagation", customClass: "customClass", monthColLimit: "monthColLimit", yearColLimit: "yearColLimit", dateDisabled: "dateDisabled", dayDisabled: "dayDisabled", initDate: "initDate", activeDate: "activeDate" }, outputs: { selectionDone: "selectionDone", update: "update", activeDateChange: "activeDateChange" }, usesOnChanges: true, ngImport: i0, template: `
254
- <!--&lt;!&ndash;ng-keydown="keydown($event)"&ndash;&gt;-->
255
- <div *ngIf='datepickerMode' class='well well-sm bg-faded p-a card' role='application'>
256
- <ng-content></ng-content>
257
- </div>
258
- `, isInline: true, directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
259
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DatePickerInnerComponent, decorators: [{
260
- type: Component,
261
- args: [{
262
- selector: 'datepicker-inner',
263
- template: `
264
- <!--&lt;!&ndash;ng-keydown="keydown($event)"&ndash;&gt;-->
265
- <div *ngIf='datepickerMode' class='well well-sm bg-faded p-a card' role='application'>
266
- <ng-content></ng-content>
267
- </div>
268
- `
269
- }]
270
- }], propDecorators: { locale: [{
271
- type: Input
272
- }], datepickerMode: [{
273
- type: Input
274
- }], startingDay: [{
275
- type: Input
276
- }], yearRange: [{
277
- type: Input
278
- }], minDate: [{
279
- type: Input
280
- }], maxDate: [{
281
- type: Input
282
- }], minMode: [{
283
- type: Input
284
- }], maxMode: [{
285
- type: Input
286
- }], showWeeks: [{
287
- type: Input
288
- }], formatDay: [{
289
- type: Input
290
- }], formatMonth: [{
291
- type: Input
292
- }], formatYear: [{
293
- type: Input
294
- }], formatDayHeader: [{
295
- type: Input
296
- }], formatDayTitle: [{
297
- type: Input
298
- }], formatMonthTitle: [{
299
- type: Input
300
- }], onlyCurrentMonth: [{
301
- type: Input
302
- }], shortcutPropagation: [{
303
- type: Input
304
- }], customClass: [{
305
- type: Input
306
- }], monthColLimit: [{
307
- type: Input
308
- }], yearColLimit: [{
309
- type: Input
310
- }], dateDisabled: [{
311
- type: Input
312
- }], dayDisabled: [{
313
- type: Input
314
- }], initDate: [{
315
- type: Input
316
- }], selectionDone: [{
317
- type: Output
318
- }], update: [{
319
- type: Output
320
- }], activeDateChange: [{
321
- type: Output
322
- }], activeDate: [{
323
- type: Input
324
- }] } });
325
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbm5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0ZXBpY2tlci9kYXRlcGlja2VyLWlubmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFFekcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7QUFhakQsTUFBTSxPQUFPLHdCQUF3QjtJQVRyQztRQTZCVyxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUNsQixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUtoQixrQkFBYSxHQUF1QixJQUFJLFlBQVksQ0FBTyxTQUFTLENBQUMsQ0FBQztRQUN0RSxXQUFNLEdBQXVCLElBQUksWUFBWSxDQUFPLEtBQUssQ0FBQyxDQUFDO1FBQzNELHFCQUFnQixHQUF1QixJQUFJLFlBQVksQ0FBTyxTQUFTLENBQUMsQ0FBQztRQUVuRixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFJSixVQUFLLEdBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLGtCQUFhLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7S0E2VTlEO0lBalVDLElBQ0ksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBcUI7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELDJDQUEyQztJQUMzQyxRQUFRO1FBQ04sa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsZUFBZSxJQUFJLENBQUMsS0FBSyxDQUFDLElB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QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFzQkgsVUFBVTtzQkFEYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERhdGVGb3JtYXR0ZXIgfSBmcm9tICcuL2RhdGUtZm9ybWF0dGVyJztcblxudHlwZSBDb21wYXJlRGF0ZXNGbiA9IChkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpID0+IG51bWJlcjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF0ZXBpY2tlci1pbm5lcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPCEtLSZsdDshJm5kYXNoO25nLWtleWRvd249XCJrZXlkb3duKCRldmVudClcIiZuZGFzaDsmZ3Q7LS0+XG4gICAgPGRpdiAqbmdJZj0nZGF0ZXBpY2tlck1vZGUnIGNsYXNzPSd3ZWxsIHdlbGwtc20gYmctZmFkZWQgcC1hIGNhcmQnIHJvbGU9J2FwcGxpY2F0aW9uJz5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VySW5uZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGxvY2FsZT86IHN0cmluZztcbiAgQElucHV0KCkgZGF0ZXBpY2tlck1vZGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0YXJ0aW5nRGF5PzogbnVtYmVyO1xuICBASW5wdXQoKSB5ZWFyUmFuZ2U/OiBudW1iZXI7XG5cbiAgQElucHV0KCkgbWluRGF0ZT86IERhdGU7XG4gIEBJbnB1dCgpIG1heERhdGU/OiBEYXRlO1xuICBASW5wdXQoKSBtaW5Nb2RlPzogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhNb2RlPzogc3RyaW5nO1xuICBASW5wdXQoKSBzaG93V2Vla3M/OiBib29sZWFuO1xuICBASW5wdXQoKSBmb3JtYXREYXk/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdE1vbnRoPzogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtYXRZZWFyPzogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtYXREYXlIZWFkZXI/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdERheVRpdGxlPzogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtYXRNb250aFRpdGxlPzogc3RyaW5nO1xuICBASW5wdXQoKSBvbmx5Q3VycmVudE1vbnRoPzogYm9vbGVhbjtcbiAgQElucHV0KCkgc2hvcnRjdXRQcm9wYWdhdGlvbj86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzPzogeyBkYXRlOiBEYXRlOyBtb2RlOiBzdHJpbmc7IGNsYXp6OiBzdHJpbmcgfVtdO1xuICBASW5wdXQoKSBtb250aENvbExpbWl0ID0gMDtcbiAgQElucHV0KCkgeWVhckNvbExpbWl0ID0gMDtcbiAgQElucHV0KCkgZGF0ZURpc2FibGVkPzogeyBkYXRlOiBEYXRlOyBtb2RlOiBzdHJpbmcgfVtdO1xuICBASW5wdXQoKSBkYXlEaXNhYmxlZD86IG51bWJlcltdO1xuICBASW5wdXQoKSBpbml0RGF0ZT86IERhdGU7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkRvbmU6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4odW5kZWZpbmVkKTtcbiAgQE91dHB1dCgpIHVwZGF0ZTogRXZlbnRFbWl0dGVyPERhdGU+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPihmYWxzZSk7XG4gIEBPdXRwdXQoKSBhY3RpdmVEYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KHVuZGVmaW5lZCk7XG5cbiAgc3RlcERheSA9IHt9O1xuICBzdGVwTW9udGggPSB7fTtcbiAgc3RlcFllYXIgPSB7fTtcblxuICB1bmlxdWVJZD86IHN0cmluZztcblxuICBwcm90ZWN0ZWQgbW9kZXM6IHN0cmluZ1tdID0gWydkYXknLCAnbW9udGgnLCAneWVhciddO1xuICBwcm90ZWN0ZWQgZGF0ZUZvcm1hdHRlcjogRGF0ZUZvcm1hdHRlciA9IG5ldyBEYXRlRm9ybWF0dGVyKCk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZERhdGU/OiBEYXRlO1xuICBwcm90ZWN0ZWQgYWN0aXZlRGF0ZUlkPzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVmcmVzaFZpZXdIYW5kbGVyRGF5PzogKCkgPT4gdm9pZDtcbiAgcHJvdGVjdGVkIGNvbXBhcmVIYW5kbGVyRGF5PzogQ29tcGFyZURhdGVzRm47XG4gIHByb3RlY3RlZCByZWZyZXNoVmlld0hhbmRsZXJNb250aD86ICgpID0+IHZvaWQ7XG4gIHByb3RlY3RlZCBjb21wYXJlSGFuZGxlck1vbnRoPzogQ29tcGFyZURhdGVzRm47XG4gIHByb3RlY3RlZCByZWZyZXNoVmlld0hhbmRsZXJZZWFyPzogKCkgPT4gdm9pZDtcbiAgcHJvdGVjdGVkIGNvbXBhcmVIYW5kbGVyWWVhcj86IENvbXBhcmVEYXRlc0ZuO1xuXG4gIHByb3RlY3RlZCBfYWN0aXZlRGF0ZT86IERhdGU7XG5cbiAgQElucHV0KClcbiAgZ2V0IGFjdGl2ZURhdGUoKTogRGF0ZXx1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXRlO1xuICB9XG5cbiAgc2V0IGFjdGl2ZURhdGUodmFsdWU6IERhdGV8dW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHZhbHVlO1xuICB9XG5cbiAgLy8gdG9kbzogYWRkIGZvcm1hdHRlciB2YWx1ZSB0byBEYXRlIG9iamVjdFxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyB0b2RvOiB1c2UgZGF0ZSBmb3IgdW5pcXVlIHZhbHVlXG4gICAgdGhpcy51bmlxdWVJZCA9IGBkYXRlcGlja2VyLS0ke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwKX1gO1xuXG4gICAgaWYgKHRoaXMuaW5pdERhdGUpIHtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuaW5pdERhdGU7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlRGF0ZS52YWx1ZU9mKCkpO1xuICAgICAgdGhpcy51cGRhdGUuZW1pdCh0aGlzLmFjdGl2ZURhdGUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVEYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gdGhpcy5yZWZyZXNoVmlldyBzaG91bGQgYmUgY2FsbGVkIGhlcmUgdG8gcmVmbGVjdCB0aGUgY2hhbmdlcyBvbiB0aGUgZmx5XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgdGhpcy5jaGVja0lmQWN0aXZlRGF0ZUdvdFVwZGF0ZWQoY2hhbmdlc1tcImFjdGl2ZURhdGVcIl0pO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYWN0aXZlRGF0ZSBoYXMgYmVlbiB1cGRhdGUgYW5kIHRoZW4gZW1pdCB0aGUgYWN0aXZlRGF0ZUNoYW5nZSB3aXRoIHRoZSBuZXcgZGF0ZVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjaGVja0lmQWN0aXZlRGF0ZUdvdFVwZGF0ZWQoYWN0aXZlRGF0ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKGFjdGl2ZURhdGUgJiYgIWFjdGl2ZURhdGUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBhY3RpdmVEYXRlLnByZXZpb3VzVmFsdWU7XG4gICAgICBpZiAoXG4gICAgICAgIHByZXZpb3VzVmFsdWUgJiZcbiAgICAgICAgcHJldmlvdXNWYWx1ZSBpbnN0YW5jZW9mIERhdGUgJiZcbiAgICAgICAgcHJldmlvdXNWYWx1ZS5nZXRUaW1lKCkgIT09IGFjdGl2ZURhdGUuY3VycmVudFZhbHVlLmdldFRpbWUoKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0Q29tcGFyZUhhbmRsZXIoaGFuZGxlcjogQ29tcGFyZURhdGVzRm4sIHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAnZGF5Jykge1xuICAgICAgdGhpcy5jb21wYXJlSGFuZGxlckRheSA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMuY29tcGFyZUhhbmRsZXJNb250aCA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICd5ZWFyJykge1xuICAgICAgdGhpcy5jb21wYXJlSGFuZGxlclllYXIgPSBoYW5kbGVyO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBhcmUoZGF0ZTE/OiBEYXRlLCBkYXRlMj86IERhdGUpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmIChkYXRlMSA9PT0gdW5kZWZpbmVkIHx8IGRhdGUyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICdkYXknICYmIHRoaXMuY29tcGFyZUhhbmRsZXJEYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVIYW5kbGVyRGF5KGRhdGUxLCBkYXRlMik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICdtb250aCcgJiYgdGhpcy5jb21wYXJlSGFuZGxlck1vbnRoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wYXJlSGFuZGxlck1vbnRoKGRhdGUxLCBkYXRlMik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICd5ZWFyJyAmJiB0aGlzLmNvbXBhcmVIYW5kbGVyWWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZUhhbmRsZXJZZWFyKGRhdGUxLCBkYXRlMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIHNldFJlZnJlc2hWaWV3SGFuZGxlcihoYW5kbGVyOiAoKSA9PiB2b2lkLCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZSA9PT0gJ2RheScpIHtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXdIYW5kbGVyRGF5ID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJNb250aCA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICd5ZWFyJykge1xuICAgICAgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJZZWFyID0gaGFuZGxlcjtcbiAgICB9XG4gIH1cblxuICByZWZyZXNoVmlldygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ2RheScgJiYgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJEYXkpIHtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXdIYW5kbGVyRGF5KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICdtb250aCcgJiYgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJNb250aCkge1xuICAgICAgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJNb250aCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJNb2RlID09PSAneWVhcicgJiYgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJZZWFyKSB7XG4gICAgICB0aGlzLnJlZnJlc2hWaWV3SGFuZGxlclllYXIoKTtcbiAgICB9XG4gIH1cblxuICBkYXRlRmlsdGVyKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlRm9ybWF0dGVyLmZvcm1hdChkYXRlLCBmb3JtYXQsIHRoaXMubG9jYWxlKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGlzQWN0aXZlKGRhdGVPYmplY3Q6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNvbXBhcmUoZGF0ZU9iamVjdC5kYXRlLCB0aGlzLmFjdGl2ZURhdGUpID09PSAwKSB7XG4gICAgICB0aGlzLmFjdGl2ZURhdGVJZCA9IGRhdGVPYmplY3QudWlkO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjcmVhdGVEYXRlT2JqZWN0KGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogYW55IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IGRhdGVPYmplY3Q6IGFueSA9IHt9O1xuICAgIGRhdGVPYmplY3QuZGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgZGF0ZS5nZXREYXRlKClcbiAgICApO1xuICAgIGRhdGVPYmplY3QuZGF0ZSA9IHRoaXMuZml4VGltZVpvbmUoZGF0ZU9iamVjdC5kYXRlKTtcbiAgICBkYXRlT2JqZWN0LmxhYmVsID0gdGhpcy5kYXRlRmlsdGVyKGRhdGUsIGZvcm1hdCk7XG4gICAgZGF0ZU9iamVjdC5zZWxlY3RlZCA9IHRoaXMuY29tcGFyZShkYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSkgPT09IDA7XG4gICAgZGF0ZU9iamVjdC5kaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZChkYXRlKTtcbiAgICBkYXRlT2JqZWN0LmN1cnJlbnQgPSB0aGlzLmNvbXBhcmUoZGF0ZSwgbmV3IERhdGUoKSkgPT09IDA7XG4gICAgZGF0ZU9iamVjdC5jdXN0b21DbGFzcyA9IHRoaXMuZ2V0Q3VzdG9tQ2xhc3NGb3JEYXRlKGRhdGVPYmplY3QuZGF0ZSk7XG5cbiAgICByZXR1cm4gZGF0ZU9iamVjdDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHNwbGl0KGFycjogYW55W10sIHNpemU6IG51bWJlcik6IGFueVtdIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IGFycmF5czogYW55W10gPSBbXTtcbiAgICB3aGlsZSAoYXJyLmxlbmd0aCA+IDApIHtcbiAgICAgIGFycmF5cy5wdXNoKGFyci5zcGxpY2UoMCwgc2l6ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheXM7XG4gIH1cblxuICAvLyBGaXggYSBoYXJkLXJlcHJvZHVjaWJsZSBidWcgd2l0aCB0aW1lem9uZXNcbiAgLy8gVGhlIGJ1ZyBkZXBlbmRzIG9uIE9TLCBicm93c2VyLCBjdXJyZW50IHRpbWV6b25lIGFuZCBjdXJyZW50IGRhdGVcbiAgLy8gaS5lLlxuICAvLyB2YXIgZGF0ZSA9IG5ldyBEYXRlKDIwMTQsIDAsIDEpO1xuICAvLyBjb25zb2xlLmxvZyhkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCksXG4gIC8vIGRhdGUuZ2V0SG91cnMoKSk7IGNhbiByZXN1bHQgaW4gXCIyMDEzIDExIDMxIDIzXCIgYmVjYXVzZSBvZiB0aGUgYnVnLlxuICBmaXhUaW1lWm9uZShkYXRlOiBEYXRlKTogRGF0ZSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG5cbiAgICByZXR1cm4gbmV3IERhdGUoXG4gICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBkYXRlLmdldE1vbnRoKCksXG4gICAgICBkYXRlLmdldERhdGUoKSxcbiAgICAgIGhvdXJzID09PSAyMyA/IGhvdXJzICsgMiA6IDBcbiAgICApO1xuICB9XG5cbiAgc2VsZWN0KGRhdGU6IERhdGUsIGlzTWFudWFsID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJNb2RlID09PSB0aGlzLm1pbk1vZGUpIHtcbiAgICAgIGlmICghdGhpcy5hY3RpdmVEYXRlKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IG5ldyBEYXRlKDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBkYXRlLmdldE1vbnRoKCksXG4gICAgICAgIGRhdGUuZ2V0RGF0ZSgpXG4gICAgICApO1xuICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5maXhUaW1lWm9uZSh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgaWYgKGlzTWFudWFsKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uRG9uZS5lbWl0KHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIGRhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgZGF0ZS5nZXREYXRlKClcbiAgICAgICk7XG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLmZpeFRpbWVab25lKHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgICBpZiAoaXNNYW51YWwgJiYgdGhpcy5kYXRlcGlja2VyTW9kZSkge1xuICAgICAgICB0aGlzLmRhdGVwaWNrZXJNb2RlID0gdGhpcy5tb2Rlc1t0aGlzLm1vZGVzLmluZGV4T2YodGhpcy5kYXRlcGlja2VyTW9kZSkgLSAxXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlRGF0ZS52YWx1ZU9mKCkpO1xuICAgIHRoaXMudXBkYXRlLmVtaXQodGhpcy5hY3RpdmVEYXRlKTtcbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gIH1cblxuICBtb3ZlKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBsZXQgZXhwZWN0ZWRTdGVwOiBhbnk7XG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICdkYXknKSB7XG4gICAgICBleHBlY3RlZFN0ZXAgPSB0aGlzLnN0ZXBEYXk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICdtb250aCcpIHtcbiAgICAgIGV4cGVjdGVkU3RlcCA9IHRoaXMuc3RlcE1vbnRoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJNb2RlID09PSAneWVhcicpIHtcbiAgICAgIGV4cGVjdGVkU3RlcCA9IHRoaXMuc3RlcFllYXI7XG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdGVkU3RlcCAmJiB0aGlzLmFjdGl2ZURhdGUpIHtcbiAgICAgIGNvbnN0IHllYXIgPVxuICAgICAgICB0aGlzLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSArIGRpcmVjdGlvbiAqIChleHBlY3RlZFN0ZXAueWVhcnMgfHwgMCk7XG4gICAgICBjb25zdCBtb250aCA9XG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpICsgZGlyZWN0aW9uICogKGV4cGVjdGVkU3RlcC5tb250aHMgfHwgMCk7XG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG5cbiAgICAgIHRoaXMucmVmcmVzaFZpZXcoKTtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlTW9kZShfZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBfZGlyZWN0aW9uIHx8IDE7XG5cbiAgICBpZiAoXG4gICAgICAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gdGhpcy5tYXhNb2RlICYmIGRpcmVjdGlvbiA9PT0gMSkgfHxcbiAgICAgICh0aGlzLmRhdGVwaWNrZXJNb2RlID09PSB0aGlzLm1pbk1vZGUgJiYgZGlyZWN0aW9uID09PSAtMSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSkge1xuICAgICAgdGhpcy5kYXRlcGlja2VyTW9kZSA9IHRoaXMubW9kZXNbdGhpcy5tb2Rlcy5pbmRleE9mKHRoaXMuZGF0ZXBpY2tlck1vZGUpICsgZGlyZWN0aW9uXTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q3VzdG9tQ2xhc3NGb3JEYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jdXN0b21DbGFzcykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICAvLyB0b2RvOiBidWlsZCBhIGhhc2ggb2YgY3VzdG9tIGNsYXNzZXMsIGl0IHdpbGwgd29yayBmYXN0ZXJcbiAgICBjb25zdCBjdXN0b21DbGFzc09iamVjdDogKHtcbiAgICAgIGRhdGU6IERhdGU7XG4gICAgICBtb2RlOiBzdHJpbmc7XG4gICAgICBjbGF6ejogc3RyaW5nO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9IHwgdW5kZWZpbmVkKSA9IHRoaXMuY3VzdG9tQ2xhc3MuZmluZCgoY3VzdG9tQ2xhc3M6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY3VzdG9tQ2xhc3MuZGF0ZS52YWx1ZU9mKCkgPT09IGRhdGUudmFsdWVPZigpICYmXG4gICAgICAgIGN1c3RvbUNsYXNzLm1vZGUgPT09IHRoaXMuZGF0ZXBpY2tlck1vZGVcbiAgICAgICk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gY3VzdG9tQ2xhc3NPYmplY3QgPT09IHVuZGVmaW5lZCA/ICcnIDogY3VzdG9tQ2xhc3NPYmplY3QuY2xheno7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tcGFyZURhdGVEaXNhYmxlZChcbiAgICBkYXRlMURpc2FibGVkOiB7IGRhdGU6IERhdGU7IG1vZGU6IHN0cmluZyB9LFxuICAgIGRhdGUyOiBEYXRlXG4gICk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGRhdGUxRGlzYWJsZWQgPT09IHVuZGVmaW5lZCB8fCBkYXRlMiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChkYXRlMURpc2FibGVkLm1vZGUgPT09ICdkYXknICYmIHRoaXMuY29tcGFyZUhhbmRsZXJEYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVIYW5kbGVyRGF5KGRhdGUxRGlzYWJsZWQuZGF0ZSwgZGF0ZTIpO1xuICAgIH1cblxuICAgIGlmIChkYXRlMURpc2FibGVkLm1vZGUgPT09ICdtb250aCcgJiYgdGhpcy5jb21wYXJlSGFuZGxlck1vbnRoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wYXJlSGFuZGxlck1vbnRoKGRhdGUxRGlzYWJsZWQuZGF0ZSwgZGF0ZTIpO1xuICAgIH1cblxuICAgIGlmIChkYXRlMURpc2FibGVkLm1vZGUgPT09ICd5ZWFyJyAmJiB0aGlzLmNvbXBhcmVIYW5kbGVyWWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZUhhbmRsZXJZZWFyKGRhdGUxRGlzYWJsZWQuZGF0ZSwgZGF0ZTIpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgbGV0IGlzRGF0ZURpc2FibGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuZGF0ZURpc2FibGVkKSB7XG4gICAgICB0aGlzLmRhdGVEaXNhYmxlZC5mb3JFYWNoKFxuICAgICAgICAoZGlzYWJsZWREYXRlOiB7IGRhdGU6IERhdGU7IG1vZGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29tcGFyZURhdGVEaXNhYmxlZChkaXNhYmxlZERhdGUsIGRhdGUpID09PSAwKSB7XG4gICAgICAgICAgICBpc0RhdGVEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRheURpc2FibGVkKSB7XG4gICAgICBpc0RhdGVEaXNhYmxlZCA9XG4gICAgICAgIGlzRGF0ZURpc2FibGVkIHx8XG4gICAgICAgIHRoaXMuZGF5RGlzYWJsZWQuaW5kZXhPZihkYXRlLmdldERheSgpKSA+IC0xO1xuICAgIH1cblxuICAgIGlmIChpc0RhdGVEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIGlzRGF0ZURpc2FibGVkO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbkRhdGUgPSBOdW1iZXIodGhpcy5taW5EYXRlICYmIHRoaXMuY29tcGFyZShkYXRlLCB0aGlzLm1pbkRhdGUpKTtcbiAgICBpZiAoIWlzTmFOKG1pbkRhdGUpKSB7XG4gICAgICByZXR1cm4gbWluRGF0ZSA8IDA7XG4gICAgfVxuXG4gICAgY29uc3QgbWF4RGF0ZSA9IE51bWJlcih0aGlzLm1heERhdGUgJiYgdGhpcy5jb21wYXJlKGRhdGUsIHRoaXMubWF4RGF0ZSkpO1xuICAgIGlmICghaXNOYU4obWF4RGF0ZSkpIHtcbiAgICAgIHJldHVybiBtYXhEYXRlID4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==