@progressio_resources/gravity-design-system 3.6.7 → 3.6.9

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 (30) hide show
  1. package/esm2022/lib/components/{gravity-calendar-next → gravity-date-picker}/components/day-calendar/day-calendar.component.mjs +3 -3
  2. package/esm2022/lib/components/gravity-date-picker/components/day-calendar/range-days-calendar.utils.mjs +224 -0
  3. package/esm2022/lib/components/gravity-date-picker/components/month-calendar/month-calendar.component.mjs +110 -0
  4. package/esm2022/lib/components/gravity-date-picker/components/year-calendar/year-calendar.component.mjs +111 -0
  5. package/esm2022/lib/components/gravity-date-picker/gravity-date-picker.component.mjs +85 -0
  6. package/esm2022/lib/components/gravity-date-picker/shared/date-picker.constants.mjs +61 -0
  7. package/esm2022/lib/components/gravity-date-picker/shared/date-picker.modal.mjs +2 -0
  8. package/esm2022/lib/components/gravity-date-picker/shared/date-picker.utils.mjs +111 -0
  9. package/esm2022/lib/gravity-design-system.module.mjs +9 -9
  10. package/esm2022/public-api.mjs +2 -2
  11. package/fesm2022/progressio_resources-gravity-design-system.mjs +27 -29
  12. package/fesm2022/progressio_resources-gravity-design-system.mjs.map +1 -1
  13. package/lib/components/{gravity-calendar-next → gravity-date-picker}/components/day-calendar/day-calendar.component.d.ts +4 -4
  14. package/lib/components/{gravity-calendar-next → gravity-date-picker}/components/day-calendar/range-days-calendar.utils.d.ts +1 -1
  15. package/lib/components/{gravity-calendar-next → gravity-date-picker}/components/month-calendar/month-calendar.component.d.ts +6 -6
  16. package/lib/components/{gravity-calendar-next → gravity-date-picker}/components/year-calendar/year-calendar.component.d.ts +7 -7
  17. package/lib/components/{gravity-calendar-next/gravity-calendar-next.component.d.ts → gravity-date-picker/gravity-date-picker.component.d.ts} +10 -10
  18. package/lib/components/{gravity-calendar-next/shared/calendar.modal.d.ts → gravity-date-picker/shared/date-picker.modal.d.ts} +6 -6
  19. package/lib/components/{gravity-calendar-next/shared/calendar.utils.d.ts → gravity-date-picker/shared/date-picker.utils.d.ts} +1 -1
  20. package/lib/gravity-design-system.module.d.ts +5 -5
  21. package/package.json +1 -1
  22. package/public-api.d.ts +1 -1
  23. package/esm2022/lib/components/gravity-calendar-next/components/day-calendar/range-days-calendar.utils.mjs +0 -224
  24. package/esm2022/lib/components/gravity-calendar-next/components/month-calendar/month-calendar.component.mjs +0 -111
  25. package/esm2022/lib/components/gravity-calendar-next/components/year-calendar/year-calendar.component.mjs +0 -112
  26. package/esm2022/lib/components/gravity-calendar-next/gravity-calendar-next.component.mjs +0 -85
  27. package/esm2022/lib/components/gravity-calendar-next/shared/calendar.constants.mjs +0 -61
  28. package/esm2022/lib/components/gravity-calendar-next/shared/calendar.modal.mjs +0 -2
  29. package/esm2022/lib/components/gravity-calendar-next/shared/calendar.utils.mjs +0 -111
  30. /package/lib/components/{gravity-calendar-next/shared/calendar.constants.d.ts → gravity-date-picker/shared/date-picker.constants.d.ts} +0 -0
@@ -1,18 +1,18 @@
1
- import { CalendarAppearance, CalendarConfig, CalendarDate } from "../../shared/calendar.modal";
1
+ import { DatePickerAppearance, DatePickerConfig, CalendarDate } from "../../shared/date-picker.modal";
2
2
  import { GravityTextFieldComponent } from "../../../gravity-text-field/gravity-text-field.component";
3
3
  import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
4
- import { changeDate, calendarDateToDate, isPeriodAvailable } from '../../shared/calendar.utils';
4
+ import { changeDate, calendarDateToDate, isPeriodAvailable } from '../../shared/date-picker.utils';
5
5
  import { isPreview, onClearHover, onDateKeyup, onHoverDay, searchDate } from "./range-days-calendar.utils";
6
6
  import * as i0 from "@angular/core";
7
7
  export declare class DayCalendarComponent implements OnChanges {
8
8
  initYear: Date;
9
9
  initMonth: Date;
10
- config: CalendarConfig;
10
+ config: DatePickerConfig;
11
11
  range: boolean;
12
12
  restart: boolean;
13
13
  appyOnClose: boolean;
14
14
  currentDate: Date;
15
- appearance: CalendarAppearance;
15
+ appearance: DatePickerAppearance;
16
16
  navType: 'prev' | 'next' | 'both' | 'none';
17
17
  clearHover: EventEmitter<void>;
18
18
  clearSelection: EventEmitter<void>;
@@ -1,4 +1,4 @@
1
- import { CalendarDate } from "../../shared/calendar.modal";
1
+ import { CalendarDate } from "../../shared/date-picker.modal";
2
2
  import { DayCalendarComponent } from "./day-calendar.component";
3
3
  export declare function isPreview(component: DayCalendarComponent, day: CalendarDate): boolean;
4
4
  export declare function processPreselectedRangeDate(component: DayCalendarComponent): void;
@@ -1,15 +1,15 @@
1
- import { CalendarAppearance, CalendarConfig, CalendarPeriod } from "../../shared/calendar.modal";
2
- import { changeDate, isPeriodAvailable } from "../../shared/calendar.utils";
1
+ import { DatePickerAppearance, DatePickerConfig, CalendarPeriod } from "../../shared/date-picker.modal";
2
+ import { changeDate, isPeriodAvailable } from "../../shared/date-picker.utils";
3
3
  import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class MonthCalendarComponent implements OnChanges {
6
- config: CalendarConfig;
6
+ config: DatePickerConfig;
7
7
  initDate: Date | Date[];
8
8
  restart: boolean;
9
- appearance: CalendarAppearance;
9
+ appearance: DatePickerAppearance;
10
10
  integratedMode: boolean;
11
11
  clearSelection: EventEmitter<void>;
12
- calendarResponse: EventEmitter<Date[] | Date>;
12
+ response: EventEmitter<Date[] | Date>;
13
13
  currentDate: Date;
14
14
  selectedMonth: CalendarPeriod;
15
15
  get i18n(): {
@@ -67,5 +67,5 @@ export declare class MonthCalendarComponent implements OnChanges {
67
67
  protected readonly changeDate: typeof changeDate;
68
68
  protected readonly isPeriodAvailable: typeof isPeriodAvailable;
69
69
  static ɵfac: i0.ɵɵFactoryDeclaration<MonthCalendarComponent, never>;
70
- static ɵcmp: i0.ɵɵComponentDeclaration<MonthCalendarComponent, "month-calendar", never, { "config": { "alias": "config"; "required": false; }; "initDate": { "alias": "initDate"; "required": false; }; "restart": { "alias": "restart"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "integratedMode": { "alias": "integratedMode"; "required": false; }; }, { "clearSelection": "clearSelection"; "calendarResponse": "response"; }, never, never, false, never>;
70
+ static ɵcmp: i0.ɵɵComponentDeclaration<MonthCalendarComponent, "month-calendar", never, { "config": { "alias": "config"; "required": false; }; "initDate": { "alias": "initDate"; "required": false; }; "restart": { "alias": "restart"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "integratedMode": { "alias": "integratedMode"; "required": false; }; }, { "clearSelection": "clearSelection"; "response": "response"; }, never, never, false, never>;
71
71
  }
@@ -1,18 +1,18 @@
1
- import { changeDate, isPeriodAvailable } from "../../shared/calendar.utils";
2
- import { CalendarAppearance, CalendarConfig } from "../../shared/calendar.modal";
1
+ import { changeDate, isPeriodAvailable } from "../../shared/date-picker.utils";
2
+ import { DatePickerAppearance, DatePickerConfig } from "../../shared/date-picker.modal";
3
3
  import { EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class YearCalendarComponent implements OnChanges, OnInit {
6
- config: CalendarConfig;
6
+ config: DatePickerConfig;
7
7
  initDate: Date | Date[];
8
8
  restart: boolean;
9
- appearance: CalendarAppearance;
9
+ appearance: DatePickerAppearance;
10
10
  integratedMode: boolean;
11
11
  clearSelection: EventEmitter<void>;
12
- calendarResponse: EventEmitter<Date[] | Date>;
13
- startYear: number;
12
+ response: EventEmitter<Date[] | Date>;
14
13
  selectedYear: number;
15
14
  currentDate: Date;
15
+ startYear: number;
16
16
  get i18n(): {
17
17
  readonly apply: "Apply";
18
18
  readonly date_placeholder: "mm/dd/yyyy";
@@ -68,5 +68,5 @@ export declare class YearCalendarComponent implements OnChanges, OnInit {
68
68
  protected readonly changeDate: typeof changeDate;
69
69
  protected readonly isPeriodAvailable: typeof isPeriodAvailable;
70
70
  static ɵfac: i0.ɵɵFactoryDeclaration<YearCalendarComponent, never>;
71
- static ɵcmp: i0.ɵɵComponentDeclaration<YearCalendarComponent, "year-calendar", never, { "config": { "alias": "config"; "required": false; }; "initDate": { "alias": "initDate"; "required": false; }; "restart": { "alias": "restart"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "integratedMode": { "alias": "integratedMode"; "required": false; }; }, { "clearSelection": "clearSelection"; "calendarResponse": "response"; }, never, never, false, never>;
71
+ static ɵcmp: i0.ɵɵComponentDeclaration<YearCalendarComponent, "year-calendar", never, { "config": { "alias": "config"; "required": false; }; "initDate": { "alias": "initDate"; "required": false; }; "restart": { "alias": "restart"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "integratedMode": { "alias": "integratedMode"; "required": false; }; }, { "clearSelection": "clearSelection"; "response": "response"; }, never, never, false, never>;
72
72
  }
@@ -1,9 +1,9 @@
1
1
  import { EventEmitter } from '@angular/core';
2
- import { CalendarAppearance, CalendarConfig, CalendarResponse } from "./shared/calendar.modal";
2
+ import { DatePickerAppearance, DatePickerConfig, DatePickerResponse } from "./shared/date-picker.modal";
3
3
  import * as i0 from "@angular/core";
4
- export declare class GravityCalendarNextComponent {
4
+ export declare class GravityDatePickerComponent {
5
5
  cypressTag: string;
6
- calendarType: 'day' | 'range' | 'month' | 'year';
6
+ datePickerType: 'day' | 'range' | 'month' | 'year';
7
7
  private _config;
8
8
  private _appearance;
9
9
  get i18n(): {
@@ -47,17 +47,17 @@ export declare class GravityCalendarNextComponent {
47
47
  readonly start_date: "Fecha inicial";
48
48
  readonly no_date_applied: "Fechas seleccionadas pendientes de aplicar.";
49
49
  };
50
- set config(value: CalendarConfig);
51
- get config(): CalendarConfig;
52
- set appearance(value: CalendarAppearance);
53
- get appearance(): CalendarAppearance;
50
+ set config(value: DatePickerConfig);
51
+ get config(): DatePickerConfig;
52
+ set appearance(value: DatePickerAppearance);
53
+ get appearance(): DatePickerAppearance;
54
54
  clear: EventEmitter<void>;
55
55
  close: EventEmitter<void>;
56
- response: EventEmitter<CalendarResponse>;
56
+ response: EventEmitter<DatePickerResponse>;
57
57
  handleClear(): void;
58
58
  handleResponse(value: Date[] | Date): void;
59
59
  handleCloseButton(): void;
60
60
  applyOnClose(): boolean;
61
- static ɵfac: i0.ɵɵFactoryDeclaration<GravityCalendarNextComponent, never>;
62
- static ɵcmp: i0.ɵɵComponentDeclaration<GravityCalendarNextComponent, "gravity-calendar-next", never, { "cypressTag": { "alias": "cypressTag"; "required": false; }; "calendarType": { "alias": "calendarType"; "required": false; }; "config": { "alias": "config"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; }, { "clear": "clear"; "close": "close"; "response": "response"; }, never, never, false, never>;
61
+ static ɵfac: i0.ɵɵFactoryDeclaration<GravityDatePickerComponent, never>;
62
+ static ɵcmp: i0.ɵɵComponentDeclaration<GravityDatePickerComponent, "gravity-date-picker", never, { "cypressTag": { "alias": "cypressTag"; "required": false; }; "datePickerType": { "alias": "datePickerType"; "required": false; }; "config": { "alias": "config"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; }, { "clear": "clear"; "close": "close"; "response": "response"; }, never, never, false, never>;
63
63
  }
@@ -1,14 +1,18 @@
1
- export interface CalendarConfig {
1
+ export interface DatePickerConfig {
2
2
  maxDate?: Date | null;
3
3
  minDate?: Date | null;
4
4
  initDate?: Date | Date[] | null;
5
5
  }
6
- export interface CalendarAppearance {
6
+ export interface DatePickerAppearance {
7
7
  actions?: boolean;
8
8
  isMobile?: boolean;
9
9
  language?: 'es' | 'en';
10
10
  state?: 'active' | 'hidden' | 'disabled' | 'destroy';
11
11
  }
12
+ export interface DatePickerResponse {
13
+ dates: Date | Date[];
14
+ formatedDate?: string;
15
+ }
12
16
  export interface CalendarDate {
13
17
  day: number;
14
18
  weekDay: number;
@@ -20,7 +24,3 @@ export interface CalendarPeriod {
20
24
  year: number;
21
25
  month: number;
22
26
  }
23
- export interface CalendarResponse {
24
- dates: Date | Date[];
25
- formatedDate?: string;
26
- }
@@ -1,4 +1,4 @@
1
- import { CalendarDate } from "./calendar.modal";
1
+ import { CalendarDate } from "./date-picker.modal";
2
2
  export declare function getStartDate(date: Date): Date;
3
3
  export declare function changeDate(offset: number, currentDate: Date, isMonth: boolean): Date;
4
4
  export declare function isPeriodAvailable(currentDate: Date, limitDate: Date, period: 'month' | 'year', direction: 'prev' | 'next', startYearBlock?: number): boolean;
@@ -61,10 +61,10 @@ import * as i59 from "./components/gravity-dropdown-label/gravity-dropdown-label
61
61
  import * as i60 from "./components/gravity-navigation-card/gravity-navigation-card.component";
62
62
  import * as i61 from "./components/gravity-generic-avatar-secondary/gravity-generic-avatar-secondary.component";
63
63
  import * as i62 from "./components/gravity-backdrop/gravity-backdrop.component";
64
- import * as i63 from "./components/gravity-calendar-next/gravity-calendar-next.component";
65
- import * as i64 from "./components/gravity-calendar-next/components/day-calendar/day-calendar.component";
66
- import * as i65 from "./components/gravity-calendar-next/components/month-calendar/month-calendar.component";
67
- import * as i66 from "./components/gravity-calendar-next/components/year-calendar/year-calendar.component";
64
+ import * as i63 from "./components/gravity-date-picker/gravity-date-picker.component";
65
+ import * as i64 from "./components/gravity-date-picker/components/day-calendar/day-calendar.component";
66
+ import * as i65 from "./components/gravity-date-picker/components/month-calendar/month-calendar.component";
67
+ import * as i66 from "./components/gravity-date-picker/components/year-calendar/year-calendar.component";
68
68
  import * as i67 from "./components/gravity-segmented-button/gravity-segmented-button.component";
69
69
  import * as i68 from "./components/gravity-currency-display-v2/gravity-currency-display-v2.component";
70
70
  import * as i69 from "./layout/gravity-header/gravity-header.component";
@@ -80,6 +80,6 @@ import * as i78 from "@ng-bootstrap/ng-bootstrap";
80
80
  import * as i79 from "@angular/router";
81
81
  export declare class GravityDesignSystemModule {
82
82
  static ɵfac: i0.ɵɵFactoryDeclaration<GravityDesignSystemModule, never>;
83
- static ɵmod: i0.ɵɵNgModuleDeclaration<GravityDesignSystemModule, [typeof i1.GravityAttachFileComponent, typeof i2.GravityAvatarStackComponent, typeof i3.GravityGenericAvatarComponent, typeof i4.GravityButtonComponent, typeof i5.GravityCalendarComponent, typeof i6.GravityCalendarV2Component, typeof i7.GravityCardListComponent, typeof i8.GravityCheckboxComponent, typeof i9.GravityCurrencyComponent, typeof i10.GravityCurrencyDisplayComponent, typeof i11.GravityDataViewComponent, typeof i12.GravityDataViewsV2Component, typeof i13.GravityDialogComponent, typeof i14.GravityDetailContainerComponent, typeof i15.GravityDropdownListComponent, typeof i16.GravityDropdownListDisplayComponent, typeof i17.GravityIconButtonComponent, typeof i18.GravityIconComponent, typeof i19.GravityMultiLanguageComponent, typeof i20.GravityNetworkPillComponent, typeof i21.GravityNotificationComponent, typeof i22.GravityNotificationInstantContainerComponent, typeof i23.GravityRadioButtonComponent, typeof i24.GravityStatusIndicatorComponent, typeof i25.GravityStepperComponent, typeof i26.GravitySwitchComponent, typeof i27.GravityTableComponent, typeof i28.GravityTablesV2Component, typeof i29.GravityTextFieldComponent, typeof i30.GravityTextFieldNumberOnlyComponent, typeof i31.GravityTreeViewComponent, typeof i32.NodeComponent, typeof i33.NodeToggleComponent, typeof i34.NodeCheckboxComponent, typeof i35.NodeNameComponent, typeof i36.FilterByPipe, typeof i37.DateAbbreviationPipe, typeof i38.BsDatepickerDayDecoratorComponent, typeof i39.BsDatepickerNavigationViewComponent, typeof i40.BsDaysCalendarViewComponent, typeof i41.BsMonthCalendarViewComponent, typeof i42.BsYearsCalendarViewComponent, typeof i43.BsDatepickerContainerComponent, typeof i44.BsDatepickerDirective, typeof i45.BsDatepickerInlineContainerComponent, typeof i46.BsDatepickerInlineDirective, typeof i47.BsDaterangepickerContainerComponent, typeof i48.BsDaterangepickerDirective, typeof i49.BsDaterangepickerInlineContainerComponent, typeof i50.BsDaterangepickerInlineDirective, typeof i51.GravityModalComponent, typeof i52.GravityLinkComponent, typeof i53.GravityTabPrimaryComponent, typeof i54.GravityTabSecondaryComponent, typeof i55.GravityChipComponent, typeof i56.GravityChipGroupComponent, typeof i57.GravityEditableInputComponent, typeof i58.GravityCardButtonComponent, typeof i59.GravityDropdownLabelComponent, typeof i60.GravityNavigationCardComponent, typeof i61.GravityGenericAvatarSecondaryComponent, typeof i62.GravityBackdropComponent, typeof i63.GravityCalendarNextComponent, typeof i64.DayCalendarComponent, typeof i65.MonthCalendarComponent, typeof i66.YearCalendarComponent, typeof i67.GravitySegmentedButtonComponent, typeof i68.GravityCurrencyDisplayV2Component, typeof i69.GravityHeaderComponent, typeof i70.GravityPushNotificationsComponent, typeof i71.GravityMenuComponent], [typeof i72.AngularSvgIconModule, typeof i73.AngularSvgIconPreloaderModule, typeof i74.BsDatepickerModule, typeof i75.CommonModule, typeof i76.FormsModule, typeof i77.GravityTooltipModule, typeof i78.NgbDatepickerModule, typeof i78.NgbOffcanvasModule, typeof i78.NgbProgressbarModule, typeof i78.NgbToastModule, typeof i76.ReactiveFormsModule, typeof i79.RouterLink], [typeof i1.GravityAttachFileComponent, typeof i2.GravityAvatarStackComponent, typeof i3.GravityGenericAvatarComponent, typeof i4.GravityButtonComponent, typeof i5.GravityCalendarComponent, typeof i6.GravityCalendarV2Component, typeof i7.GravityCardListComponent, typeof i8.GravityCheckboxComponent, typeof i9.GravityCurrencyComponent, typeof i10.GravityCurrencyDisplayComponent, typeof i68.GravityCurrencyDisplayV2Component, typeof i11.GravityDataViewComponent, typeof i12.GravityDataViewsV2Component, typeof i13.GravityDialogComponent, typeof i14.GravityDetailContainerComponent, typeof i15.GravityDropdownListComponent, typeof i16.GravityDropdownListDisplayComponent, typeof i17.GravityIconButtonComponent, typeof i18.GravityIconComponent, typeof i19.GravityMultiLanguageComponent, typeof i20.GravityNetworkPillComponent, typeof i22.GravityNotificationInstantContainerComponent, typeof i23.GravityRadioButtonComponent, typeof i24.GravityStatusIndicatorComponent, typeof i25.GravityStepperComponent, typeof i26.GravitySwitchComponent, typeof i27.GravityTableComponent, typeof i28.GravityTablesV2Component, typeof i29.GravityTextFieldComponent, typeof i30.GravityTextFieldNumberOnlyComponent, typeof i77.GravityTooltipModule, typeof i31.GravityTreeViewComponent, typeof i51.GravityModalComponent, typeof i52.GravityLinkComponent, typeof i53.GravityTabPrimaryComponent, typeof i54.GravityTabSecondaryComponent, typeof i55.GravityChipComponent, typeof i56.GravityChipGroupComponent, typeof i57.GravityEditableInputComponent, typeof i58.GravityCardButtonComponent, typeof i60.GravityNavigationCardComponent, typeof i61.GravityGenericAvatarSecondaryComponent, typeof i62.GravityBackdropComponent, typeof i63.GravityCalendarNextComponent, typeof i67.GravitySegmentedButtonComponent, typeof i69.GravityHeaderComponent, typeof i70.GravityPushNotificationsComponent, typeof i71.GravityMenuComponent]>;
83
+ static ɵmod: i0.ɵɵNgModuleDeclaration<GravityDesignSystemModule, [typeof i1.GravityAttachFileComponent, typeof i2.GravityAvatarStackComponent, typeof i3.GravityGenericAvatarComponent, typeof i4.GravityButtonComponent, typeof i5.GravityCalendarComponent, typeof i6.GravityCalendarV2Component, typeof i7.GravityCardListComponent, typeof i8.GravityCheckboxComponent, typeof i9.GravityCurrencyComponent, typeof i10.GravityCurrencyDisplayComponent, typeof i11.GravityDataViewComponent, typeof i12.GravityDataViewsV2Component, typeof i13.GravityDialogComponent, typeof i14.GravityDetailContainerComponent, typeof i15.GravityDropdownListComponent, typeof i16.GravityDropdownListDisplayComponent, typeof i17.GravityIconButtonComponent, typeof i18.GravityIconComponent, typeof i19.GravityMultiLanguageComponent, typeof i20.GravityNetworkPillComponent, typeof i21.GravityNotificationComponent, typeof i22.GravityNotificationInstantContainerComponent, typeof i23.GravityRadioButtonComponent, typeof i24.GravityStatusIndicatorComponent, typeof i25.GravityStepperComponent, typeof i26.GravitySwitchComponent, typeof i27.GravityTableComponent, typeof i28.GravityTablesV2Component, typeof i29.GravityTextFieldComponent, typeof i30.GravityTextFieldNumberOnlyComponent, typeof i31.GravityTreeViewComponent, typeof i32.NodeComponent, typeof i33.NodeToggleComponent, typeof i34.NodeCheckboxComponent, typeof i35.NodeNameComponent, typeof i36.FilterByPipe, typeof i37.DateAbbreviationPipe, typeof i38.BsDatepickerDayDecoratorComponent, typeof i39.BsDatepickerNavigationViewComponent, typeof i40.BsDaysCalendarViewComponent, typeof i41.BsMonthCalendarViewComponent, typeof i42.BsYearsCalendarViewComponent, typeof i43.BsDatepickerContainerComponent, typeof i44.BsDatepickerDirective, typeof i45.BsDatepickerInlineContainerComponent, typeof i46.BsDatepickerInlineDirective, typeof i47.BsDaterangepickerContainerComponent, typeof i48.BsDaterangepickerDirective, typeof i49.BsDaterangepickerInlineContainerComponent, typeof i50.BsDaterangepickerInlineDirective, typeof i51.GravityModalComponent, typeof i52.GravityLinkComponent, typeof i53.GravityTabPrimaryComponent, typeof i54.GravityTabSecondaryComponent, typeof i55.GravityChipComponent, typeof i56.GravityChipGroupComponent, typeof i57.GravityEditableInputComponent, typeof i58.GravityCardButtonComponent, typeof i59.GravityDropdownLabelComponent, typeof i60.GravityNavigationCardComponent, typeof i61.GravityGenericAvatarSecondaryComponent, typeof i62.GravityBackdropComponent, typeof i63.GravityDatePickerComponent, typeof i64.DayCalendarComponent, typeof i65.MonthCalendarComponent, typeof i66.YearCalendarComponent, typeof i67.GravitySegmentedButtonComponent, typeof i68.GravityCurrencyDisplayV2Component, typeof i69.GravityHeaderComponent, typeof i70.GravityPushNotificationsComponent, typeof i71.GravityMenuComponent], [typeof i72.AngularSvgIconModule, typeof i73.AngularSvgIconPreloaderModule, typeof i74.BsDatepickerModule, typeof i75.CommonModule, typeof i76.FormsModule, typeof i77.GravityTooltipModule, typeof i78.NgbDatepickerModule, typeof i78.NgbOffcanvasModule, typeof i78.NgbProgressbarModule, typeof i78.NgbToastModule, typeof i76.ReactiveFormsModule, typeof i79.RouterLink], [typeof i1.GravityAttachFileComponent, typeof i2.GravityAvatarStackComponent, typeof i3.GravityGenericAvatarComponent, typeof i4.GravityButtonComponent, typeof i5.GravityCalendarComponent, typeof i6.GravityCalendarV2Component, typeof i7.GravityCardListComponent, typeof i8.GravityCheckboxComponent, typeof i9.GravityCurrencyComponent, typeof i10.GravityCurrencyDisplayComponent, typeof i68.GravityCurrencyDisplayV2Component, typeof i11.GravityDataViewComponent, typeof i12.GravityDataViewsV2Component, typeof i13.GravityDialogComponent, typeof i14.GravityDetailContainerComponent, typeof i15.GravityDropdownListComponent, typeof i16.GravityDropdownListDisplayComponent, typeof i17.GravityIconButtonComponent, typeof i18.GravityIconComponent, typeof i19.GravityMultiLanguageComponent, typeof i20.GravityNetworkPillComponent, typeof i22.GravityNotificationInstantContainerComponent, typeof i23.GravityRadioButtonComponent, typeof i24.GravityStatusIndicatorComponent, typeof i25.GravityStepperComponent, typeof i26.GravitySwitchComponent, typeof i27.GravityTableComponent, typeof i28.GravityTablesV2Component, typeof i29.GravityTextFieldComponent, typeof i30.GravityTextFieldNumberOnlyComponent, typeof i77.GravityTooltipModule, typeof i31.GravityTreeViewComponent, typeof i51.GravityModalComponent, typeof i52.GravityLinkComponent, typeof i53.GravityTabPrimaryComponent, typeof i54.GravityTabSecondaryComponent, typeof i55.GravityChipComponent, typeof i56.GravityChipGroupComponent, typeof i57.GravityEditableInputComponent, typeof i58.GravityCardButtonComponent, typeof i60.GravityNavigationCardComponent, typeof i61.GravityGenericAvatarSecondaryComponent, typeof i62.GravityBackdropComponent, typeof i63.GravityDatePickerComponent, typeof i67.GravitySegmentedButtonComponent, typeof i69.GravityHeaderComponent, typeof i70.GravityPushNotificationsComponent, typeof i71.GravityMenuComponent]>;
84
84
  static ɵinj: i0.ɵɵInjectorDeclaration<GravityDesignSystemModule>;
85
85
  }
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": "3.6.7",
4
+ "version": "3.6.9",
5
5
  "license": "SEE LICENSE IN LIBRARY-LICENSE",
6
6
  "peerDependencies": {
7
7
  "@angular/common": "^16.2.12",
package/public-api.d.ts CHANGED
@@ -4,7 +4,7 @@ export * from './lib/components/gravity-avatar-stack/gravity-avatar-stack.compon
4
4
  export * from './lib/components/gravity-button/gravity-button.component';
5
5
  export * from './lib/components/gravity-calendar/gravity-calendar.component';
6
6
  export * from './lib/components/gravity-calendar-v2/gravity-calendar-v2.component';
7
- export * from './lib/components/gravity-calendar-next/gravity-calendar-next.component';
7
+ export * from './lib/components/gravity-date-picker/gravity-date-picker.component';
8
8
  export * from './lib/components/gravity-card-list/gravity-card-list.component';
9
9
  export * from './lib/components/gravity-checkbox/gravity-checkbox.component';
10
10
  export * from './lib/components/gravity-currency/gravity-currency.component';
@@ -1,224 +0,0 @@
1
- import { calendarDateToDate, dateToString, getStartDate, stringToCalendarDate, stringToDate, dateToCalendarDay } from "../../shared/calendar.utils";
2
- export function isPreview(component, day) {
3
- const current = calendarDateToDate(day);
4
- if (component.selectedRangeStart && !component.selectedRangeEnd && component.hoveredDay) {
5
- const start = calendarDateToDate(component.selectedRangeStart);
6
- const hover = calendarDateToDate(component.hoveredDay);
7
- if (hover <= start)
8
- return false;
9
- return current > start && current <= hover;
10
- }
11
- if (!component.selectedRangeStart && component.selectedRangeEnd && component.hoveredDay) {
12
- const end = calendarDateToDate(component.selectedRangeEnd);
13
- const hover = calendarDateToDate(component.hoveredDay);
14
- if (hover >= end)
15
- return false;
16
- return current < end && current >= hover;
17
- }
18
- return false;
19
- }
20
- export function processPreselectedRangeDate(component) {
21
- let end = null;
22
- let start = null;
23
- component.startDateField.focus();
24
- if (Array.isArray(component.config.initDate)) {
25
- [start, end] = component.config.initDate;
26
- }
27
- if (start instanceof Date) {
28
- component.selectedRangeStart = dateToCalendarDay(start);
29
- setTimeout(() => {
30
- component.endDateField.focus();
31
- component.startDateField.inputValue = dateToString(start, component.appearance.language);
32
- }, 0);
33
- }
34
- if (end instanceof Date) {
35
- component.currentDate = getStartDate(end);
36
- component.selectedRangeEnd = dateToCalendarDay(end);
37
- setTimeout(() => {
38
- component.startDateField.focus();
39
- component.endDateField.inputValue = dateToString(end, component.appearance.language);
40
- }, 0);
41
- }
42
- else if (start instanceof Date) {
43
- component.currentDate = getStartDate(start);
44
- }
45
- }
46
- export function getRangeSelectionClass(component, day) {
47
- const current = calendarDateToDate(day);
48
- const start = component.selectedRangeStart ? calendarDateToDate(component.selectedRangeStart) : null;
49
- const end = component.selectedRangeEnd ? calendarDateToDate(component.selectedRangeEnd) : null;
50
- if (!start && !end) {
51
- return component.focused === 'start' ? 'nsl-start' : 'nsl-end';
52
- }
53
- if (start && !end) {
54
- if (current.getTime() === start.getTime())
55
- return 'sl start';
56
- if (current.getTime() < start.getTime())
57
- return 'nsl-start';
58
- return 'in-slt nsl-end';
59
- }
60
- if (!start && end) {
61
- if (current.getTime() === end.getTime())
62
- return 'sl end';
63
- if (current.getTime() > end.getTime())
64
- return 'nsl-end';
65
- return 'in-slt nsl-start';
66
- }
67
- if (start && end) {
68
- if (current.getTime() === start.getTime() &&
69
- start.getTime() === end.getTime())
70
- return 'start sl same-sln';
71
- if (current.getTime() === start.getTime())
72
- return 'sl start';
73
- if (current.getTime() < start.getTime())
74
- return 'nsl-start';
75
- if (current.getTime() === end.getTime())
76
- return 'sl end';
77
- if (current.getTime() > end.getTime())
78
- return 'nsl-end';
79
- if (current > start && current < end)
80
- return 'sl range';
81
- return 'default';
82
- }
83
- }
84
- export function onSelectDaysRange(component, day) {
85
- const selected = calendarDateToDate(day);
86
- const hasEnd = !!component.selectedRangeEnd;
87
- const hasStart = !!component.selectedRangeStart;
88
- const language = component.appearance.language;
89
- const endDate = hasEnd ? calendarDateToDate(component.selectedRangeEnd) : null;
90
- const startDate = hasStart ? calendarDateToDate(component.selectedRangeStart) : null;
91
- Object.assign(component, {
92
- notification: null,
93
- endDateError: '', startDateError: '',
94
- endFieldDisabled: false, startFieldDisabled: false,
95
- });
96
- const updateField = (field) => {
97
- component[`selectedRange${field === 'start' ? 'Start' : 'End'}`] = day;
98
- component[`${field}DateField`].inputValue = dateToString(selected, language);
99
- setTimeout(() => {
100
- const focusField = field === 'start' ?
101
- (component.selectedRangeEnd ? 'start' : 'end') :
102
- (component.selectedRangeStart ? 'end' : 'start');
103
- component[`${focusField}DateField`].focus();
104
- component[`${focusField}DateField`].inputElement.nativeElement.setSelectionRange(10, 10);
105
- }, 100);
106
- };
107
- if (!hasStart && !hasEnd) {
108
- updateField(component.focused);
109
- return;
110
- }
111
- if (hasStart && !hasEnd) {
112
- selected >= startDate ? updateField('end') : updateField('start');
113
- return;
114
- }
115
- if (!hasStart && hasEnd) {
116
- selected < endDate ? updateField('start') : updateField('end');
117
- return;
118
- }
119
- if (hasStart && hasEnd) {
120
- selected < startDate ? updateField('start') : updateField('end');
121
- return;
122
- }
123
- }
124
- export function onApplyRageDate(component) {
125
- const start = calendarDateToDate(component.selectedRangeStart);
126
- const end = calendarDateToDate(component.selectedRangeEnd);
127
- component.calendarResponse.emit([start, end]);
128
- }
129
- export function onHoverDay(component, day) {
130
- const startSelected = !!component.selectedRangeStart && !component.selectedRangeEnd;
131
- const endSelected = !!component.selectedRangeEnd && !component.selectedRangeStart;
132
- if (startSelected || endSelected) {
133
- component.hoveredDay = day;
134
- }
135
- }
136
- export function onClearHover(component) {
137
- component.hoveredDay = null;
138
- }
139
- export function searchDate(component, dateStr, target) {
140
- const i18n = component.i18n;
141
- const date = stringToDate(dateStr, component.appearance.language);
142
- const calendarDate = stringToCalendarDate(dateStr, component.appearance.language);
143
- const errorProp = target === 'start' ? 'startDateError' : 'endDateError';
144
- const field = target === 'start' ? component.startDateField : component.endDateField;
145
- const oppositeDisabled = target === 'start' ? 'endFieldDisabled' : 'startFieldDisabled';
146
- if (!dateStr) {
147
- component[oppositeDisabled] = false;
148
- return;
149
- }
150
- if (!calendarDate) {
151
- field.focus();
152
- component[oppositeDisabled] = true;
153
- component[errorProp] = i18n.invalid_date;
154
- component.notification = { text: i18n.select_valid_date, error: true };
155
- return;
156
- }
157
- if (!validateDateLimits(component, date, target)) {
158
- component[oppositeDisabled] = true;
159
- return;
160
- }
161
- const otherCalendarDate = target === 'start' ? component.selectedRangeEnd : component.selectedRangeStart;
162
- const otherDate = otherCalendarDate ? calendarDateToDate(otherCalendarDate) : null;
163
- if ((target === 'start' && otherDate && date > otherDate) ||
164
- (target === 'end' && otherDate && date < otherDate)) {
165
- field.focus();
166
- component[oppositeDisabled] = true;
167
- component[errorProp] = i18n.invalid_date;
168
- component.notification = { text: target === 'start' ? i18n.start_before_end : i18n.end_after_start, error: true };
169
- return;
170
- }
171
- if (target === 'start') {
172
- component.selectedRangeStart = calendarDate;
173
- if (!component.selectedRangeEnd)
174
- setTimeout(() => component.endDateField.focus(), 100);
175
- }
176
- else {
177
- component.selectedRangeEnd = calendarDate;
178
- if (!component.selectedRangeStart)
179
- setTimeout(() => component.startDateField.focus(), 100);
180
- }
181
- component[errorProp] = null;
182
- component.currentDate = date;
183
- component.notification = null;
184
- component[oppositeDisabled] = false;
185
- }
186
- export function validateDateLimits(component, date, target) {
187
- if (component.config.minDate && date < component.config.minDate) {
188
- component.notification = { text: component.i18n.date_unavailable, error: true };
189
- target === 'start' ? component.startDateError = component.i18n.invalid_date : component.endDateError = component.i18n.invalid_date;
190
- return false;
191
- }
192
- if (component.config.maxDate && date > component.config.maxDate) {
193
- component.notification = { text: component.i18n.date_unavailable, error: true };
194
- target === 'start' ? component.startDateError = component.i18n.invalid_date : component.endDateError = component.i18n.invalid_date;
195
- return false;
196
- }
197
- return true;
198
- }
199
- export function onDateKeyup(component, event, target) {
200
- const ignoredKeys = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter', ' ', 'Spacebar'];
201
- if (ignoredKeys.includes(event.key)) {
202
- return;
203
- }
204
- const errorProp = target === 'start' ? 'startDateError' : 'endDateError';
205
- const disabled = target === 'start' ? 'endFieldDisabled' : 'startFieldDisabled';
206
- const dateInput = target === 'start' ? component.startDateField : component.endDateField;
207
- const selectedRangeProp = target === 'start' ? 'selectedRangeStart' : 'selectedRangeEnd';
208
- const value = dateInput?.inputValue ?? '';
209
- if (value.length < 10) {
210
- component[selectedRangeProp] = null;
211
- if (!component.notification?.error) {
212
- component.notification = null;
213
- }
214
- if (value.length < 1) {
215
- component[errorProp] = '';
216
- component[disabled] = false;
217
- component.notification = null;
218
- }
219
- }
220
- if (value.length > 9) {
221
- searchDate(this, value, target);
222
- }
223
- }
224
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtZGF5cy1jYWxlbmRhci51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dyYXZpdHktZGVzaWduLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZ3Jhdml0eS1jYWxlbmRhci1uZXh0L2NvbXBvbmVudHMvZGF5LWNhbGVuZGFyL3JhbmdlLWRheXMtY2FsZW5kYXIudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFbEosTUFBTSxVQUFVLFNBQVMsQ0FBQyxTQUErQixFQUFFLEdBQWlCO0lBQzNFLE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXhDLElBQUksU0FBUyxDQUFDLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUU7UUFDeEYsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDL0QsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksS0FBSyxJQUFJLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNqQyxPQUFPLE9BQU8sR0FBRyxLQUFLLElBQUksT0FBTyxJQUFJLEtBQUssQ0FBQztLQUMzQztJQUVELElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLElBQUksU0FBUyxDQUFDLGdCQUFnQixJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUU7UUFDeEYsTUFBTSxHQUFHLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDM0QsTUFBTSxLQUFLLEdB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aW1wb3J0IHtDYWxlbmRhckRhdGV9IGZyb20gXCIuLi8uLi9zaGFyZWQvY2FsZW5kYXIubW9kYWxcIjtcbmltcG9ydCB7RGF5Q2FsZW5kYXJDb21wb25lbnR9IGZyb20gXCIuL2RheS1jYWxlbmRhci5jb21wb25lbnRcIjtcbmltcG9ydCB7Y2FsZW5kYXJEYXRlVG9EYXRlLCBkYXRlVG9TdHJpbmcsIGdldFN0YXJ0RGF0ZSwgc3RyaW5nVG9DYWxlbmRhckRhdGUsIHN0cmluZ1RvRGF0ZSwgZGF0ZVRvQ2FsZW5kYXJEYXl9IGZyb20gXCIuLi8uLi9zaGFyZWQvY2FsZW5kYXIudXRpbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJldmlldyhjb21wb25lbnQ6IERheUNhbGVuZGFyQ29tcG9uZW50LCBkYXk6IENhbGVuZGFyRGF0ZSk6IGJvb2xlYW4ge1xuXHRjb25zdCBjdXJyZW50ID0gY2FsZW5kYXJEYXRlVG9EYXRlKGRheSk7XG5cblx0aWYgKGNvbXBvbmVudC5zZWxlY3RlZFJhbmdlU3RhcnQgJiYgIWNvbXBvbmVudC5zZWxlY3RlZFJhbmdlRW5kICYmIGNvbXBvbmVudC5ob3ZlcmVkRGF5KSB7XG5cdFx0Y29uc3Qgc3RhcnQgPSBjYWxlbmRhckRhdGVUb0RhdGUoY29tcG9uZW50LnNlbGVjdGVkUmFuZ2VTdGFydCk7XG5cdFx0Y29uc3QgaG92ZXIgPSBjYWxlbmRhckRhdGVUb0RhdGUoY29tcG9uZW50LmhvdmVyZWREYXkpO1xuXHRcdGlmIChob3ZlciA8PSBzdGFydCkgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBjdXJyZW50ID4gc3RhcnQgJiYgY3VycmVudCA8PSBob3Zlcjtcblx0fVxuXG5cdGlmICghY29tcG9uZW50LnNlbGVjdGVkUmFuZ2VTdGFydCAmJiBjb21wb25lbnQuc2VsZWN0ZWRSYW5nZUVuZCAmJiBjb21wb25lbnQuaG92ZXJlZERheSkge1xuXHRcdGNvbnN0IGVuZCA9IGNhbGVuZGFyRGF0ZVRvRGF0ZShjb21wb25lbnQuc2VsZWN0ZWRSYW5nZUVuZCk7XG5cdFx0Y29uc3QgaG92ZXIgPSBjYWxlbmRhckRhdGVUb0RhdGUoY29tcG9uZW50LmhvdmVyZWREYXkpO1xuXHRcdGlmIChob3ZlciA+PSBlbmQpIHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gY3VycmVudCA8IGVuZCAmJiBjdXJyZW50ID49IGhvdmVyO1xuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1ByZXNlbGVjdGVkUmFuZ2VEYXRlKGNvbXBvbmVudDogRGF5Q2FsZW5kYXJDb21wb25lbnQpIHtcblx0bGV0IGVuZDogRGF0ZSB8IG51bGwgPSBudWxsO1xuXHRsZXQgc3RhcnQ6IERhdGUgfCBudWxsID0gbnVsbDtcblxuXHRjb21wb25lbnQuc3RhcnREYXRlRmllbGQuZm9jdXMoKTtcblxuXHRpZiAoQXJyYXkuaXNBcnJheShjb21wb25lbnQuY29uZmlnLmluaXREYXRlKSkge1tzdGFydCwgZW5kXSA9IGNvbXBvbmVudC5jb25maWcuaW5pdERhdGU7fVxuXG4gIGlmIChzdGFydCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBjb21wb25lbnQuc2VsZWN0ZWRSYW5nZVN0YXJ0ID0gZGF0ZVRvQ2FsZW5kYXJEYXkoc3RhcnQpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXHQgICAgY29tcG9uZW50LmVuZERhdGVGaWVsZC5mb2N1cygpO1xuXHRcdFx0Y29tcG9uZW50LnN0YXJ0RGF0ZUZpZWxkLmlucHV0VmFsdWUgPSBkYXRlVG9TdHJpbmcoc3RhcnQsIGNvbXBvbmVudC5hcHBlYXJhbmNlLmxhbmd1YWdlKTtcblx0XHR9LCAwKTtcbiAgfVxuXG4gIGlmIChlbmQgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgY29tcG9uZW50LmN1cnJlbnREYXRlID0gZ2V0U3RhcnREYXRlKGVuZCk7XG4gICAgY29tcG9uZW50LnNlbGVjdGVkUmFuZ2VFbmQgPSBkYXRlVG9DYWxlbmRhckRheShlbmQpO1xuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0Y29tcG9uZW50LnN0YXJ0RGF0ZUZpZWxkLmZvY3VzKCk7XG5cdFx0XHRjb21wb25lbnQuZW5kRGF0ZUZpZWxkLmlucHV0VmFsdWUgPSBkYXRlVG9TdHJpbmcoZW5kLCBjb21wb25lbnQuYXBwZWFyYW5jZS5sYW5ndWFnZSk7XG5cdFx0fSwgMCk7XG5cbiAgfSBlbHNlIGlmIChzdGFydCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBjb21wb25lbnQuY3VycmVudERhdGUgPSBnZXRTdGFydERhdGUoc3RhcnQpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZVNlbGVjdGlvbkNsYXNzKGNvbXBvbmVudDogRGF5Q2FsZW5kYXJDb21wb25lbnQsIGRheTogQ2FsZW5kYXJEYXRlKTogc3RyaW5nIHtcblx0Y29uc3QgY3VycmVudCA9IGNhbGVuZGFyRGF0ZVRvRGF0ZShkYXkpO1xuXHRjb25zdCBzdGFydCA9IGNvbXBvbmVudC5zZWxlY3RlZFJhbmdlU3RhcnQgPyBjYWxlbmRhckRhdGVUb0RhdGUoY29tcG9uZW50LnNlbGVjdGVkUmFuZ2VTdGFydCkgOiBudWxsO1xuXHRjb25zdCBlbmQgPSBjb21wb25lbnQuc2VsZWN0ZWRSYW5nZUVuZCA/IGNhbGVuZGFyRGF0ZVRvRGF0ZShjb21wb25lbnQuc2VsZWN0ZWRSYW5nZUVuZCkgOiBudWxsO1xuXG5cdGlmICghc3RhcnQgJiYgIWVuZCkge1xuXHRcdHJldHVybiBjb21wb25lbnQuZm9jdXNlZCA9PT0gJ3N0YXJ0JyA/ICduc2wtc3RhcnQnIDogJ25zbC1lbmQnO1xuXHR9XG5cblx0aWYgKHN0YXJ0ICYmICFlbmQpIHtcblx0XHRpZiAoY3VycmVudC5nZXRUaW1lKCkgPT09IHN0YXJ0LmdldFRpbWUoKSkgcmV0dXJuICdzbCBzdGFydCc7XG5cdFx0aWYgKGN1cnJlbnQuZ2V0VGltZSgpIDwgc3RhcnQuZ2V0VGltZSgpKSByZXR1cm4gJ25zbC1zdGFydCc7XG5cdFx0cmV0dXJuICdpbi1zbHQgbnNsLWVuZCc7XG5cdH1cblxuXHRpZiAoIXN0YXJ0ICYmIGVuZCkge1xuXHRcdGlmIChjdXJyZW50LmdldFRpbWUoKSA9PT0gZW5kLmdldFRpbWUoKSkgcmV0dXJuICdzbCBlbmQnO1xuXHRcdGlmIChjdXJyZW50LmdldFRpbWUoKSA+IGVuZC5nZXRUaW1lKCkpIHJldHVybiAnbnNsLWVuZCc7XG5cdFx0cmV0dXJuICdpbi1zbHQgbnNsLXN0YXJ0Jztcblx0fVxuXG5cdGlmIChzdGFydCAmJiBlbmQpIHtcblx0XHRpZihjdXJyZW50LmdldFRpbWUoKSA9PT0gc3RhcnQuZ2V0VGltZSgpICYmXG5cdFx0XHQgc3RhcnQuZ2V0VGltZSgpID09PSBlbmQuZ2V0VGltZSgpKVxuXHRcdFx0XHRyZXR1cm4gJ3N0YXJ0IHNsIHNhbWUtc2xuJztcblxuXHRcdGlmIChjdXJyZW50LmdldFRpbWUoKSA9PT0gc3RhcnQuZ2V0VGltZSgpKSByZXR1cm4gJ3NsIHN0YXJ0Jztcblx0XHRpZiAoY3VycmVudC5nZXRUaW1lKCkgPCBzdGFydC5nZXRUaW1lKCkpIHJldHVybiAnbnNsLXN0YXJ0Jztcblx0XHRpZiAoY3VycmVudC5nZXRUaW1lKCkgPT09IGVuZC5nZXRUaW1lKCkpIHJldHVybiAnc2wgZW5kJztcblx0XHRpZiAoY3VycmVudC5nZXRUaW1lKCkgPiBlbmQuZ2V0VGltZSgpKSByZXR1cm4gJ25zbC1lbmQnO1xuXHRcdGlmIChjdXJyZW50ID4gc3RhcnQgJiYgY3VycmVudCA8IGVuZCkgcmV0dXJuICdzbCByYW5nZSc7XG5cdFx0cmV0dXJuICdkZWZhdWx0Jztcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb25TZWxlY3REYXlzUmFuZ2UoY29tcG9uZW50OiBEYXlDYWxlbmRhckNvbXBvbmVudCwgZGF5OiBDYWxlbmRhckRhdGUpOiB2b2lkIHtcblx0Y29uc3Qgc2VsZWN0ZWQgPSBjYWxlbmRhckRhdGVUb0RhdGUoZGF5KTtcblx0Y29uc3QgaGFzRW5kID0gISFjb21wb25lbnQuc2VsZWN0ZWRSYW5nZUVuZDtcblx0Y29uc3QgaGFzU3RhcnQgPSAhIWNvbXBvbmVudC5zZWxlY3RlZFJhbmdlU3RhcnQ7XG5cdGNvbnN0IGxhbmd1YWdlID0gY29tcG9uZW50LmFwcGVhcmFuY2UubGFuZ3VhZ2U7XG5cdGNvbnN0IGVuZERhdGUgPSBoYXNFbmQgPyBjYWxlbmRhckRhdGVUb0RhdGUoY29tcG9uZW50LnNlbGVjdGVkUmFuZ2VFbmQpIDogbnVsbDtcblx0Y29uc3Qgc3RhcnREYXRlID0gaGFzU3RhcnQgPyBjYWxlbmRhckRhdGVUb0RhdGUoY29tcG9uZW50LnNlbGVjdGVkUmFuZ2VTdGFydCkgOiBudWxsO1xuXG5cdE9iamVjdC5hc3NpZ24oY29tcG9uZW50LCB7XG5cdFx0bm90aWZpY2F0aW9uOiBudWxsLFxuXHRcdGVuZERhdGVFcnJvcjogJycsIHN0YXJ0RGF0ZUVycm9yOiAnJyxcblx0XHRlbmRGaWVsZERpc2FibGVkOiBmYWxzZSwgc3RhcnRGaWVsZERpc2FibGVkOiBmYWxzZSxcblx0fSk7XG5cblx0Y29uc3QgdXBkYXRlRmllbGQgPSAoZmllbGQ6ICdzdGFydCcgfCAnZW5kJykgPT4ge1xuXHRcdGNvbXBvbmVudFtgc2VsZWN0ZWRSYW5nZSR7ZmllbGQgPT09ICdzdGFydCcgPyAnU3RhcnQnIDogJ0VuZCd9YF0gPSBkYXk7XG5cdFx0Y29tcG9uZW50W2Ake2ZpZWxkfURhdGVGaWVsZGBdLmlucHV0VmFsdWUgPSBkYXRlVG9TdHJpbmcoc2VsZWN0ZWQsIGxhbmd1YWdlKTtcblxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0Y29uc3QgZm9jdXNGaWVsZCA9IGZpZWxkID09PSAnc3RhcnQnID9cblx0XHRcdFx0KGNvbXBvbmVudC5zZWxlY3RlZFJhbmdlRW5kID8gJ3N0YXJ0JyA6ICdlbmQnKSA6XG5cdFx0XHRcdChjb21wb25lbnQuc2VsZWN0ZWRSYW5nZVN0YXJ0ID8gJ2VuZCcgOiAnc3RhcnQnKTtcblxuXHRcdFx0Y29tcG9uZW50W2Ake2ZvY3VzRmllbGR9RGF0ZUZpZWxkYF0uZm9jdXMoKTtcblx0XHRcdGNvbXBvbmVudFtgJHtmb2N1c0ZpZWxkfURhdGVGaWVsZGBdLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKDEwLCAxMCk7XG5cdFx0fSwgMTAwKTtcblx0fTtcblxuXHRpZiAoIWhhc1N0YXJ0ICYmICFoYXNFbmQpIHtcblx0XHR1cGRhdGVGaWVsZChjb21wb25lbnQuZm9jdXNlZCk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKGhhc1N0YXJ0ICYmICFoYXNFbmQpIHtcblx0XHRzZWxlY3RlZCA+PSBzdGFydERhdGUhID8gdXBkYXRlRmllbGQoJ2VuZCcpIDogdXBkYXRlRmllbGQoJ3N0YXJ0Jyk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKCFoYXNTdGFydCAmJiBoYXNFbmQpIHtcblx0XHRzZWxlY3RlZCA8IGVuZERhdGUhID8gdXBkYXRlRmllbGQoJ3N0YXJ0JykgOiB1cGRhdGVGaWVsZCgnZW5kJyk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKGhhc1N0YXJ0ICYmIGhhc0VuZCkge1xuXHRcdHNlbGVjdGVkIDwgc3RhcnREYXRlISA/IHVwZGF0ZUZpZWxkKCdzdGFydCcpIDogdXBkYXRlRmllbGQoJ2VuZCcpO1xuXHRcdHJldHVybjtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb25BcHBseVJhZ2VEYXRlKGNvbXBvbmVudDogRGF5Q2FsZW5kYXJDb21wb25lbnQpe1xuICAgIGNvbnN0IHN0YXJ0ID0gY2FsZW5kYXJEYXRlVG9EYXRlKGNvbXBvbmVudC5zZWxlY3RlZFJhbmdlU3RhcnQpO1xuICAgIGNvbnN0IGVuZCA9IGNhbGVuZGFyRGF0ZVRvRGF0ZShjb21wb25lbnQuc2VsZWN0ZWRSYW5nZUVuZCk7XG4gICAgY29tcG9uZW50LmNhbGVuZGFyUmVzcG9uc2UuZW1pdChbc3RhcnQsIGVuZF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25Ib3ZlckRheShjb21wb25lbnQ6IERheUNhbGVuZGFyQ29tcG9uZW50LCBkYXk6IENhbGVuZGFyRGF0ZSk6IHZvaWQge1xuXHRjb25zdCBzdGFydFNlbGVjdGVkID0gISFjb21wb25lbnQuc2VsZWN0ZWRSYW5nZVN0YXJ0ICYmICFjb21wb25lbnQuc2VsZWN0ZWRSYW5nZUVuZDtcblx0Y29uc3QgZW5kU2VsZWN0ZWQgPSAhIWNvbXBvbmVudC5zZWxlY3RlZFJhbmdlRW5kICYmICFjb21wb25lbnQuc2VsZWN0ZWRSYW5nZVN0YXJ0O1xuXHRpZiAoc3RhcnRTZWxlY3RlZCB8fCBlbmRTZWxlY3RlZCkgeyBjb21wb25lbnQuaG92ZXJlZERheSA9IGRheTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb25DbGVhckhvdmVyKGNvbXBvbmVudDogRGF5Q2FsZW5kYXJDb21wb25lbnQpOiB2b2lkIHtcblx0Y29tcG9uZW50LmhvdmVyZWREYXkgPSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VhcmNoRGF0ZShjb21wb25lbnQ6IERheUNhbGVuZGFyQ29tcG9uZW50LCBkYXRlU3RyOiBzdHJpbmcsIHRhcmdldDogJ3N0YXJ0JyB8ICdlbmQnKTogdm9pZCB7XG5cdGNvbnN0IGkxOG4gPSBjb21wb25lbnQuaTE4bjtcblx0Y29uc3QgZGF0ZSA9IHN0cmluZ1RvRGF0ZShkYXRlU3RyLCBjb21wb25lbnQuYXBwZWFyYW5jZS5sYW5ndWFnZSk7XG5cdGNvbnN0IGNhbGVuZGFyRGF0ZSA9IHN0cmluZ1RvQ2FsZW5kYXJEYXRlKGRhdGVTdHIsIGNvbXBvbmVudC5hcHBlYXJhbmNlLmxhbmd1YWdlKTtcblx0Y29uc3QgZXJyb3JQcm9wID0gdGFyZ2V0ID09PSAnc3RhcnQnID8gJ3N0YXJ0RGF0ZUVycm9yJyA6ICdlbmREYXRlRXJyb3InO1xuXHRjb25zdCBmaWVsZCA9IHRhcmdldCA9PT0gJ3N0YXJ0JyA/IGNvbXBvbmVudC5zdGFydERhdGVGaWVsZCA6IGNvbXBvbmVudC5lbmREYXRlRmllbGQ7XG5cdGNvbnN0IG9wcG9zaXRlRGlzYWJsZWQgPSB0YXJnZXQgPT09ICdzdGFydCcgPyAnZW5kRmllbGREaXNhYmxlZCcgOiAnc3RhcnRGaWVsZERpc2FibGVkJztcblxuXHRpZiAoIWRhdGVTdHIpIHsgY29tcG9uZW50W29wcG9zaXRlRGlzYWJsZWRdID0gZmFsc2U7IHJldHVybjsgfVxuXG5cdGlmICghY2FsZW5kYXJEYXRlKSB7XG5cdFx0ZmllbGQuZm9jdXMoKTtcblx0XHRjb21wb25lbnRbb3Bwb3NpdGVEaXNhYmxlZF0gPSB0cnVlO1xuXHRcdGNvbXBvbmVudFtlcnJvclByb3BdID0gaTE4bi5pbnZhbGlkX2RhdGU7XG5cdFx0Y29tcG9uZW50Lm5vdGlmaWNhdGlvbiA9IHsgdGV4dDogaTE4bi5zZWxlY3RfdmFsaWRfZGF0ZSwgZXJyb3I6IHRydWUgfTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAoIXZhbGlkYXRlRGF0ZUxpbWl0cyhjb21wb25lbnQsIGRhdGUsIHRhcmdldCkpIHtcblx0XHRjb21wb25lbnRbb3Bwb3NpdGVEaXNhYmxlZF0gPSB0cnVlO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IG90aGVyQ2FsZW5kYXJEYXRlID0gdGFyZ2V0ID09PSAnc3RhcnQnID8gY29tcG9uZW50LnNlbGVjdGVkUmFuZ2VFbmQgOiBjb21wb25lbnQuc2VsZWN0ZWRSYW5nZVN0YXJ0O1xuXHRjb25zdCBvdGhlckRhdGUgPSBvdGhlckNhbGVuZGFyRGF0ZSA/IGNhbGVuZGFyRGF0ZVRvRGF0ZShvdGhlckNhbGVuZGFyRGF0ZSkgOiBudWxsO1xuXG5cdGlmICgodGFyZ2V0ID09PSAnc3RhcnQnICYmIG90aGVyRGF0ZSAmJiBkYXRlID4gb3RoZXJEYXRlKSB8fFxuXHRcdCh0YXJnZXQgPT09ICdlbmQnICYmIG90aGVyRGF0ZSAmJiBkYXRlIDwgb3RoZXJEYXRlKSkge1xuXHRcdGZpZWxkLmZvY3VzKCk7XG5cdFx0Y29tcG9uZW50W29wcG9zaXRlRGlzYWJsZWRdID0gdHJ1ZTtcblx0XHRjb21wb25lbnRbZXJyb3JQcm9wXSA9IGkxOG4uaW52YWxpZF9kYXRlO1xuXHRcdGNvbXBvbmVudC5ub3RpZmljYXRpb24gPSB7IHRleHQ6IHRhcmdldCA9PT0gJ3N0YXJ0JyA/IGkxOG4uc3RhcnRfYmVmb3JlX2VuZCA6IGkxOG4uZW5kX2FmdGVyX3N0YXJ0LCBlcnJvcjogdHJ1ZSB9O1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmICh0YXJnZXQgPT09ICdzdGFydCcpIHtcblx0XHRjb21wb25lbnQuc2VsZWN0ZWRSYW5nZVN0YXJ0ID0gY2FsZW5kYXJEYXRlO1xuXHRcdGlmICghY29tcG9uZW50LnNlbGVjdGVkUmFuZ2VFbmQpIHNldFRpbWVvdXQoKCkgPT4gY29tcG9uZW50LmVuZERhdGVGaWVsZC5mb2N1cygpLCAxMDApO1xuXHR9IGVsc2Uge1xuXHRcdGNvbXBvbmVudC5zZWxlY3RlZFJhbmdlRW5kID0gY2FsZW5kYXJEYXRlO1xuXHRcdGlmICghY29tcG9uZW50LnNlbGVjdGVkUmFuZ2VTdGFydCkgc2V0VGltZW91dCgoKSA9PiBjb21wb25lbnQuc3RhcnREYXRlRmllbGQuZm9jdXMoKSwgMTAwKTtcblx0fVxuXG5cdGNvbXBvbmVudFtlcnJvclByb3BdID0gbnVsbDtcblx0Y29tcG9uZW50LmN1cnJlbnREYXRlID0gZGF0ZTtcblx0Y29tcG9uZW50Lm5vdGlmaWNhdGlvbiA9IG51bGw7XG5cdGNvbXBvbmVudFtvcHBvc2l0ZURpc2FibGVkXSA9IGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVEYXRlTGltaXRzKGNvbXBvbmVudDogRGF5Q2FsZW5kYXJDb21wb25lbnQsIGRhdGU6IERhdGUsIHRhcmdldDogJ3N0YXJ0JyB8ICdlbmQnKSA6IGJvb2xlYW4ge1xuXHRpZiAoY29tcG9uZW50LmNvbmZpZy5taW5EYXRlICYmIGRhdGUgPCBjb21wb25lbnQuY29uZmlnLm1pbkRhdGUpIHtcblx0XHRjb21wb25lbnQubm90aWZpY2F0aW9uID0geyB0ZXh0OiBjb21wb25lbnQuaTE4bi5kYXRlX3VuYXZhaWxhYmxlLCBlcnJvcjogdHJ1ZSB9O1xuXHRcdHRhcmdldCA9PT0gJ3N0YXJ0JyA/IGNvbXBvbmVudC5zdGFydERhdGVFcnJvciA9IGNvbXBvbmVudC5pMThuLmludmFsaWRfZGF0ZSA6IGNvbXBvbmVudC5lbmREYXRlRXJyb3IgPSBjb21wb25lbnQuaTE4bi5pbnZhbGlkX2RhdGU7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aWYgKGNvbXBvbmVudC5jb25maWcubWF4RGF0ZSAmJiBkYXRlID4gY29tcG9uZW50LmNvbmZpZy5tYXhEYXRlKSB7XG5cdFx0Y29tcG9uZW50Lm5vdGlmaWNhdGlvbiA9IHsgdGV4dDogY29tcG9uZW50LmkxOG4uZGF0ZV91bmF2YWlsYWJsZSwgZXJyb3I6IHRydWUgfTtcblx0XHR0YXJnZXQgPT09ICdzdGFydCcgPyBjb21wb25lbnQuc3RhcnREYXRlRXJyb3IgPSBjb21wb25lbnQuaTE4bi5pbnZhbGlkX2RhdGUgOiBjb21wb25lbnQuZW5kRGF0ZUVycm9yID0gY29tcG9uZW50LmkxOG4uaW52YWxpZF9kYXRlO1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25EYXRlS2V5dXAoY29tcG9uZW50OiBEYXlDYWxlbmRhckNvbXBvbmVudCwgZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHRhcmdldDogJ3N0YXJ0JyB8ICdlbmQnKTogdm9pZCB7XG5cdGNvbnN0IGlnbm9yZWRLZXlzID0gWydBcnJvd1VwJywgJ0Fycm93RG93bicsICdBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdFbnRlcicsICcgJywgJ1NwYWNlYmFyJ107XG5cdGlmIChpZ25vcmVkS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSB7IHJldHVybjsgfVxuXG5cdGNvbnN0IGVycm9yUHJvcCA9IHRhcmdldCA9PT0gJ3N0YXJ0JyA/ICdzdGFydERhdGVFcnJvcicgOiAnZW5kRGF0ZUVycm9yJztcblx0Y29uc3QgZGlzYWJsZWQgPSB0YXJnZXQgPT09ICdzdGFydCcgPyAnZW5kRmllbGREaXNhYmxlZCcgOiAnc3RhcnRGaWVsZERpc2FibGVkJztcblx0Y29uc3QgZGF0ZUlucHV0ID0gdGFyZ2V0ID09PSAnc3RhcnQnID8gY29tcG9uZW50LnN0YXJ0RGF0ZUZpZWxkIDogY29tcG9uZW50LmVuZERhdGVGaWVsZDtcblx0Y29uc3Qgc2VsZWN0ZWRSYW5nZVByb3AgPSB0YXJnZXQgPT09ICdzdGFydCcgPyAnc2VsZWN0ZWRSYW5nZVN0YXJ0JyA6ICdzZWxlY3RlZFJhbmdlRW5kJztcblxuXHRjb25zdCB2YWx1ZSA9IGRhdGVJbnB1dD8uaW5wdXRWYWx1ZSA/PyAnJztcblxuXHRpZiAodmFsdWUubGVuZ3RoIDwgMTApIHtcblx0XHRjb21wb25lbnRbc2VsZWN0ZWRSYW5nZVByb3BdID0gbnVsbDtcblxuXHRcdGlmKCFjb21wb25lbnQubm90aWZpY2F0aW9uPy5lcnJvcikge1xuXHRcdFx0Y29tcG9uZW50Lm5vdGlmaWNhdGlvbiA9IG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHZhbHVlLmxlbmd0aCA8IDEpIHtcblx0XHRcdGNvbXBvbmVudFtlcnJvclByb3BdID0gJyc7XG5cdFx0XHRjb21wb25lbnRbZGlzYWJsZWRdID0gZmFsc2U7XG5cdFx0XHRjb21wb25lbnQubm90aWZpY2F0aW9uID0gbnVsbDtcblx0XHR9XG5cdH1cblxuXHRpZiAodmFsdWUubGVuZ3RoID4gOSkge1xuXHRcdHNlYXJjaERhdGUodGhpcywgdmFsdWUsIHRhcmdldCk7XG5cdH1cblxufVxuIl19