{"version":3,"file":"ipi-soft-ng-components-datepicker.mjs","sources":["../../../../projects/ipi-soft/ng-components/datepicker/src/components/calendar-body/calendar-body.component.ts","../../../../projects/ipi-soft/ng-components/datepicker/src/components/calendar-body/calendar-body.component.html","../../../../projects/ipi-soft/ng-components/datepicker/src/datepicker-service.ts","../../../../projects/ipi-soft/ng-components/datepicker/src/components/year-view/year-view.component.ts","../../../../projects/ipi-soft/ng-components/datepicker/src/components/year-view/year-view.component.html","../../../../projects/ipi-soft/ng-components/datepicker/src/datepicker-selection-strategy.component.ts","../../../../projects/ipi-soft/ng-components/datepicker/src/components/month-view/month-view-calendar.component.ts","../../../../projects/ipi-soft/ng-components/datepicker/src/components/month-view/month-view-calendar.component.html","../../../../projects/ipi-soft/ng-components/datepicker/src/components/multi-year-view/multi-year-view.component.ts","../../../../projects/ipi-soft/ng-components/datepicker/src/components/multi-year-view/multi-year-view.component.html","../../../../projects/ipi-soft/ng-components/datepicker/src/components/calendar/calendar.component.ts","../../../../projects/ipi-soft/ng-components/datepicker/src/components/calendar/calendar.component.html","../../../../projects/ipi-soft/ng-components/datepicker/src/datepicker.component.ts","../../../../projects/ipi-soft/ng-components/datepicker/src/datepicker.component.html","../../../../projects/ipi-soft/ng-components/datepicker/ipi-soft-ng-components-datepicker.ts"],"sourcesContent":["import { Component, ElementRef, SimpleChanges, ChangeDetectionStrategy, EventEmitter, Input, Output, NgZone } from '@angular/core';\n\nimport { Platform, normalizePassiveListenerOptions } from '@angular/cdk/platform';\n\nimport { DateSelectionEvent } from './../../datepicker.component';\n\nexport class CalendarCell<D = any> {\n\n  constructor(\n    public value: number,\n    public displayValue: string,\n    public ariaLabel: string,\n    public enabled: boolean,\n    public compareValue = value,\n    public rawValue?: D,\n  ) {}\n}\n\nlet calendarBodyId = 1;\n\n@Component({\n  selector: '[calendar-body]',\n  host: {\n    'class': 'calendar-body',\n  },\n  templateUrl: 'calendar-body.component.html',\n  styleUrl: 'calendar-body.component.css',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\nexport class CalendarBody {\n\n  constructor(\n    private ngZone: NgZone,\n    private platform: Platform,\n    private elementRef: ElementRef,\n  ) {\n    this.ngZone.runOutsideAngular(() => {\n      const element = this.elementRef.nativeElement;\n\n      element.addEventListener('touchmove', this.touchmoveHandler, this.activeCapturingEventOptions);\n\n      element.addEventListener('mouseenter', this.enterHandler, this.passiveCapturingEventOptions);\n      element.addEventListener('focus', this.enterHandler, this.passiveCapturingEventOptions);\n      element.addEventListener('mouseleave', this.leaveHandler, this.passiveCapturingEventOptions);\n\n      element.addEventListener('mousedown', this.mousedownHandler, this.passiveEventOptions);\n      element.addEventListener('touchstart', this.mousedownHandler, this.passiveEventOptions);\n\n      if (this.platform.isBrowser) {\n        window.addEventListener('mouseup', this.mouseupHandler);\n        window.addEventListener('touchend', this.touchendHandler);\n      }\n    });\n  }\n\n  /** The label for the table. (e.g. \"Jan 2017\"). */\n  @Input() label!: string;\n\n  /** The cells to display in the table. */\n  @Input() rows!: CalendarCell[][];\n\n  /** The value in the table that corresponds to today. */\n  @Input() todayValue!: number;\n\n  /** Start value of the selected date range. */\n  @Input() startValue!: number;\n\n  /** End value of the selected date range. */\n  @Input() endValue!: number;\n\n  /** The minimum number of free cells needed to fit the label in the first row. */\n  @Input() labelMinRequiredCells!: number;\n\n  /** The number of columns in the table. */\n  @Input() numCols: number = 7;\n\n  /** The cell number of the active cell in the table. */\n  @Input() activeCell: number = 0;\n\n  /** Whether a range is being selected. */\n  @Input() isRange: boolean = false;\n\n  /**\n   * The aspect ratio (width / height) to use for the cells in the table. This aspect ratio will be\n   * maintained even as the table resizes.\n   */\n  @Input() cellAspectRatio: number = 1;\n\n  /** Start of the comparison range. */\n  @Input() comparisonStart!: number | null;\n\n  /** End of the comparison range. */\n  @Input() comparisonEnd!: number | null;\n\n  /** Start of the preview range. */\n  @Input() previewStart: number | null = null;\n\n  /** End of the preview range. */\n  @Input() previewEnd: number | null = null;\n\n  /** ARIA Accessible name of the StartDate */\n  @Input() startDateAccessibleName!: string | null;\n\n  /** ARIA Accessible name of the EndDate */\n  @Input() endDateAccessibleName!: string | null;\n\n  /** Emits when a new value is selected. */\n  @Output() selectedValueChange = new EventEmitter<DateSelectionEvent<number>>();\n\n  /** Emits when the preview has changed as a result of a user action. */\n  @Output() previewChange = new EventEmitter<DateSelectionEvent<CalendarCell | null>>();\n\n  @Output() activeDateChange = new EventEmitter<DateSelectionEvent<number>>();\n\n  /** Emits the date at the possible start of a drag event. */\n  @Output() dragStarted = new EventEmitter<DateSelectionEvent<Date>>();\n\n  /** Emits the date at the conclusion of a drag, or null if mouse was not released on a date. */\n  @Output() dragEnded = new EventEmitter<DateSelectionEvent<Date | null>>();\n\n  /** The number of blank cells to put at the beginning for the first row. */\n  public firstRowOffset!: number;\n\n  /** Padding for the individual date cells. */\n  public cellPadding!: string;\n\n  private id = `calendar-body-${calendarBodyId++}`;\n  public startDateLabelId = `${this.id}-start-date`;\n  public endDateLabelId = `${this.id}-end-date`;\n\n  /** Width of an individual cell. */\n  public cellWidth!: string;\n\n  /**\n    * Used to skip the next focus event when rendering the preview range.\n    * We need a flag like this, because some browsers fire focus events asynchronously.\n  */\n  private skipNextFocus!: boolean;\n\n  /**\n    * Used to focus the active cell after change detection has run.\n  */\n  private focusActiveCellAfterViewChecked = true;\n\n  private didDragSinceMouseDown = false;\n\n  private activeCapturingEventOptions = normalizePassiveListenerOptions({\n    passive: false,\n    capture: true,\n  });\n\n  private passiveCapturingEventOptions = normalizePassiveListenerOptions({\n    passive: true,\n    capture: true,\n  });\n\n  private passiveEventOptions = normalizePassiveListenerOptions({ passive: true });\n\n  public ngOnChanges(changes: SimpleChanges): void {\n    const columnChanges = changes['numCols'];\n    const {rows, numCols} = this;\n\n    if (changes['rows'] || columnChanges) {\n      this.firstRowOffset = rows && rows.length && rows[0].length ? numCols - rows[0].length : 0;\n    }\n\n    if (changes['cellAspectRatio'] || columnChanges || !this.cellPadding) {\n      this.cellPadding = `${(50 * this.cellAspectRatio) / numCols}%`;\n    }\n\n    if (columnChanges || !this.cellWidth) {\n      this.cellWidth = `${100 / numCols}%`;\n    }\n  }\n\n  public ngAfterViewChecked(): void {\n    if (this.focusActiveCellAfterViewChecked) {\n      this.focusActiveCell();\n      this.focusActiveCellAfterViewChecked = false;\n    }\n  }\n\n  public ngOnDestroy(): void {\n    const element = this.elementRef.nativeElement;\n\n    element.removeEventListener('touchmove', this.touchmoveHandler, this.activeCapturingEventOptions);\n\n    element.removeEventListener('mouseenter', this.enterHandler, this.passiveCapturingEventOptions);\n    element.removeEventListener('focus', this.enterHandler, this.passiveCapturingEventOptions);\n    element.removeEventListener('mouseleave', this.leaveHandler, this.passiveCapturingEventOptions);\n\n    element.removeEventListener('mousedown', this.mousedownHandler, this.passiveEventOptions);\n    element.removeEventListener('touchstart', this.mousedownHandler, this.passiveEventOptions);\n\n    if (this.platform.isBrowser) {\n      window.removeEventListener('mouseup', this.mouseupHandler);\n      window.removeEventListener('touchend', this.touchendHandler);\n    }\n  }\n\n  public trackRow = (row: CalendarCell[]) => row;\n\n  /** Called when a cell is clicked. */\n  public cellClicked(cell: CalendarCell, event: MouseEvent): void {\n    // Ignore \"clicks\" that are actually canceled drags (eg the user dragged\n    // off and then went back to this cell to undo).\n    if (this.didDragSinceMouseDown) {\n      return;\n    }\n\n    if (cell.enabled) {\n      this.selectedValueChange.emit({ value: cell.value, event });\n    }\n  }\n\n  public emitActiveDateChange(cell: CalendarCell, event: FocusEvent): void {\n    if (cell.enabled) {\n      this.activeDateChange.emit({ value: cell.value, event });\n    }\n  }\n\n  /** Returns whether a cell should be marked as selected. */\n  public isSelected(value: number): boolean {\n    return this.startValue === value || this.endValue === value;\n  }\n\n  /** Returns whether a cell is active. */\n  public isActiveCell(rowIndex: number, colIndex: number): boolean {\n    let cellNumber = rowIndex * this.numCols + colIndex;\n\n    // Account for the fact that the first row may not have as many cells.\n    if (rowIndex) {\n      cellNumber -= this.firstRowOffset;\n    }\n\n    return cellNumber == this.activeCell;\n  }\n\n  public focusActiveCell(movePreview = true): void {\n    const activeCell: HTMLElement | null = this.elementRef.nativeElement.querySelector(\n      '.active',\n    );\n\n    if (activeCell) {\n      if (!movePreview) {\n        this.skipNextFocus = true;\n      }\n\n      activeCell.focus();\n    }\n  }\n\n  /** Focuses the active cell after change detection has run and the microtask queue is empty. */\n  public scheduleFocusActiveCellAfterViewChecked(): void {\n    this.focusActiveCellAfterViewChecked = true;\n  }\n\n  /** Gets whether a value is the start of the main range. */\n  public isRangeStart(value: number): boolean {\n    return this.isStart(value, this.startValue, this.endValue);\n  }\n\n  /** Gets whether a value is the end of the main range. */\n  public isRangeEnd(value: number): boolean {\n    return this.isEnd(value, this.startValue, this.endValue);\n  }\n\n  /** Gets whether a value is within the currently-selected range. */\n  public isCellInRange(value: number): boolean {\n    return this.isInRange(value, this.startValue, this.endValue, this.isRange);\n  }\n\n  /** Gets whether a value is the start of the preview range. */\n  public isPreviewStart(value: number): boolean {\n    return this.isStart(value, this.previewStart, this.previewEnd);\n  }\n\n  /** Gets whether a value is the end of the preview range. */\n  public isPreviewEnd(value: number): boolean {\n    return this.isEnd(value, this.previewStart, this.previewEnd);\n  }\n\n  /** Gets whether a value is inside the preview range. */\n  public isInPreview(value: number): boolean {\n    return this.isInRange(value, this.previewStart, this.previewEnd, this.isRange);\n  }\n\n  /** Gets ids of aria descriptions for the start and end of a date range. */\n  public getDescribedby(value: number): string | null {\n    if (!this.isRange) {\n      return null;\n    }\n\n    if (this.startValue === value && this.endValue === value) {\n      return `${this.startDateLabelId} ${this.endDateLabelId}`;\n    } else if (this.startValue === value) {\n      return this.startDateLabelId;\n    } else if (this.endValue === value) {\n      return this.endDateLabelId;\n    }\n\n    return null;\n  }\n\n  /**\n   * Event handler for when the user enters an element\n   * inside the calendar body (e.g. by hovering in or focus).\n   */\n  private enterHandler = (event: Event) => {\n    if (this.skipNextFocus && event.type === 'focus') {\n      this.skipNextFocus = false;\n      return;\n    }\n\n    // We only need to hit the zone when we're selecting a range.\n    if (event.target && this.isRange) {\n      const cell = this.getCellFromElement(event.target as HTMLElement);\n\n      if (!cell?.enabled) {\n        return;\n      }\n  \n      if (cell) {\n        this.ngZone.run(() => this.previewChange.emit({ value: cell.enabled ? cell : null, event }));\n      }\n    }\n  };\n\n  private touchmoveHandler = (event: TouchEvent) => {\n    if (!this.isRange) return;\n\n    const target = this.getActualTouchTarget(event);\n    const cell = target ? this.getCellFromElement(target as HTMLElement) : null;\n\n    if (!cell?.enabled) {\n      return;\n    }\n\n    if (target !== event.target) {\n      this.didDragSinceMouseDown = true;\n    }\n\n    // If the initial target of the touch is a date cell, prevent default so\n    // that the move is not handled as a scroll.\n    if (this.getCellElement(event.target as HTMLElement)) {\n      event.preventDefault();\n    }\n\n    this.ngZone.run(() => this.previewChange.emit({value: cell?.enabled ? cell : null, event}));\n  };\n\n  /**\n   * Event handler for when the user's pointer leaves an element\n   * inside the calendar body (e.g. by hovering out or blurring).\n   */\n  private leaveHandler = (event: Event) => {\n    // We only need to hit the zone when we're selecting a range.\n    if (this.previewEnd !== null && this.isRange) {\n      if (event.type !== 'blur') {\n        this.didDragSinceMouseDown = true;\n      }\n\n      const cell = this.getCellFromElement(event.target as HTMLElement);\n\n      if (!cell?.enabled) {\n        return;\n      }\n\n      // Only reset the preview end value when leaving cells. This looks better, because\n      // we have a gap between the cells and the rows and we don't want to remove the\n      // range just for it to show up again when the user moves a few pixels to the side.\n      if (\n        event.target &&\n        cell &&\n        !(\n          (event as MouseEvent).relatedTarget &&\n          this.getCellFromElement((event as MouseEvent).relatedTarget as HTMLElement)\n        )\n      ) {\n        this.ngZone.run(() => this.previewChange.emit({ value: null, event }));\n      }\n    }\n  };\n\n  /**\n   * Triggered on mousedown or touchstart on a date cell.\n   * Respsonsible for starting a drag sequence.\n   */\n  private mousedownHandler = (event: Event) => {\n    if (!this.isRange) return;\n\n    this.didDragSinceMouseDown = false;\n    // Begin a drag if a cell within the current range was targeted.\n    const cell = event.target && this.getCellFromElement(event.target as HTMLElement);\n\n    if (!cell || !this.isCellInRange(cell.compareValue)) {\n      return;\n    }\n\n    this.ngZone.run(() => {\n      this.dragStarted.emit({\n        value: cell.rawValue,\n        event,\n      });\n    });\n  };\n\n  /** Triggered on mouseup anywhere. Respsonsible for ending a drag sequence. */\n  private mouseupHandler = (event: Event) => {\n    if (!this.isRange) return;\n\n    const cellElement = this.getCellElement(event.target as HTMLElement);\n    if (!cellElement) {\n      // Mouseup happened outside of datepicker. Cancel drag.\n      this.ngZone.run(() => {\n        this.dragEnded.emit({value: null, event});\n      });\n      return;\n    }\n\n    // if (cellElement.closest('.calendar-body') !== this.elementRef.nativeElement) {\n    //   // Mouseup happened inside a different month instance.\n    //   // Allow it to handle the event.\n    //   return;\n    // }\n\n    this.ngZone.run(() => {\n      const cell = this.getCellFromElement(cellElement);\n\n      this.dragEnded.emit({value: cell?.rawValue ?? null, event});\n    });\n  };\n\n  /** Triggered on touchend anywhere. Respsonsible for ending a drag sequence. */\n  private touchendHandler = (event: TouchEvent) => {\n    const target = this.getActualTouchTarget(event);\n\n    if (target) {\n      this.mouseupHandler({ target } as unknown as Event);\n    }\n  };\n\n  /** Finds the CalendarCell that corresponds to a DOM node. */\n  private getCellFromElement(element: HTMLElement): CalendarCell | null {\n    const cell = this.getCellElement(element);\n\n    if (cell) {\n      const row = cell.getAttribute('data-row');\n      const col = cell.getAttribute('data-col');\n\n      if (row && col) {\n        return this.rows[parseInt(row)][parseInt(col)];\n      }\n    }\n\n    return null;\n  }\n\n  /**\n * Gets the date table cell element that is or contains the specified element.\n * Or returns null if element is not part of a date cell.\n */\n  private getCellElement(element: HTMLElement): HTMLElement | null {\n    let cell: HTMLElement | undefined;\n    if (this.isTableCell(element)) {\n      cell = element;\n    } else if (this.isTableCell(element.parentNode)) {\n      cell = element.parentNode as HTMLElement;\n    } else if (this.isTableCell(element.parentNode?.parentNode)) {\n      cell = element.parentNode!.parentNode as HTMLElement;\n    }\n\n    return cell?.getAttribute('data-row') != null ? cell : null;\n  }\n\n  /** Checks whether a node is a table cell element. */\n  private isTableCell(node: Node | undefined | null): node is HTMLTableCellElement {\n    return node?.nodeName === 'TD';\n  }\n\n  /** Checks whether a value is the start of a range. */\n  private isStart(value: number, start: number | null, end: number | null): boolean {\n    return end !== null && start !== end && value < end && value === start;\n  }\n\n  /** Checks whether a value is the end of a range. */\n  private isEnd(value: number, start: number | null, end: number | null): boolean {\n    return start !== null && start !== end && value >= start && value === end;\n  }\n\n  private isInRange(\n    value: number,\n    start: number | null,\n    end: number | null,\n    rangeEnabled: boolean,\n  ): boolean {\n    return (\n      rangeEnabled &&\n      start !== null &&\n      end !== null &&\n      start !== end &&\n      value >= start &&\n      value <= end\n    );\n  }\n\n\n  /**\n   * Extracts the element that actually corresponds to a touch event's location\n   * (rather than the element that initiated the sequence of touch events).\n   */\n  private getActualTouchTarget(event: TouchEvent): Element | null {\n    const touchLocation = event.changedTouches[0];\n    return document.elementFromPoint(touchLocation.clientX, touchLocation.clientY);\n  }\n\n}\n","@if (firstRowOffset < labelMinRequiredCells) {\n    <tr aria-hidden=\"true\">\n        <td class=\"calendar-body-label\"\n            [attr.colspan]=\"numCols\"\n            [style.paddingTop]=\"cellPadding\"\n            [style.paddingBottom]=\"cellPadding\">\n                {{ label }}\n        </td>\n    </tr>\n}\n\n@for (row of rows; track trackRow(row); let rowIndex = $index) {\n    <tr role=\"row\">\n        @if (rowIndex === 0 && firstRowOffset) {\n            <td\n                class=\"calendar-body-label\"\n                [attr.colspan]=\"firstRowOffset\"\n                [style.paddingTop]=\"cellPadding\"\n                [style.paddingBottom]=\"cellPadding\">\n                    {{ firstRowOffset >= labelMinRequiredCells ? label : ''}}\n            </td>\n        }\n\n        @for (item of row; track item; let colIndex = $index) {\n            <td\n                role=\"gridcell\"\n                class=\"calendar-body-cell-container\"\n                [style.width]=\"cellWidth\"\n                [style.paddingTop]=\"cellPadding\"\n                [style.paddingBottom]=\"cellPadding\"\n                [attr.data-row]=\"rowIndex\"\n                [attr.data-col]=\"colIndex\"\n            >\n                <button\n                    type=\"button\"\n                    class=\"calendar-body-cell\"\n                    [tabindex]=\"isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n                    [class.disabled]=\"!item.enabled\"\n                    [class.selected]=\"isSelected(item.compareValue)\"\n                    [class.active]=\"isActiveCell(rowIndex, colIndex)\"\n                    [class.today]=\"todayValue === item.compareValue\"\n                    [class.range-start]=\"isRangeStart(item.compareValue)\"\n                    [class.range-end]=\"isRangeEnd(item.compareValue)\"\n                    [class.in-range]=\"isCellInRange(item.compareValue)\"\n                    [class.in-preview]=\"isInPreview(item.compareValue)\"\n                    [class.preview-start]=\"isPreviewStart(item.compareValue)\"\n                    [class.preview-end]=\"isPreviewEnd(item.compareValue)\"\n                    [attr.aria-label]=\"item.ariaLabel\"\n                    [attr.aria-disabled]=\"!item.enabled || null\"\n                    [attr.aria-pressed]=\"isSelected(item.compareValue)\"\n                    [attr.aria-current]=\"todayValue === item.compareValue ? 'date' : null\"\n                    [attr.aria-describedby]=\"getDescribedby(item.compareValue)\"\n                    (click)=\"cellClicked(item, $event)\"\n                    (focus)=\"emitActiveDateChange(item, $event)\">\n                        <span class=\"calendar-body-cell-content focus-indicator\">\n                                {{ item.displayValue }}\n                        </span>\n\n                        <span class=\"calendar-body-cell-preview\" aria-hidden=\"true\"></span>\n                </button>\n            </td>\n        }\n    </tr>\n}\n\n<span [id]=\"startDateLabelId\" class=\"calendar-body-hidden-label\">{{ startDateAccessibleName }}</span>\n\n<span [id]=\"endDateLabelId\" class=\"calendar-body-hidden-label\">{{ endDateAccessibleName }}</span>\n","import { Injectable } from '@angular/core';\n\nimport { ValidatorFn, AbstractControl, ValidationErrors } from '@angular/forms';\n\n@Injectable({\n  providedIn: 'root'\n})\n\nexport class IpiDatepickerService {\n\n  public DAYS_PER_WEEK = 7;\n\n  public yearsPerRow = 4;\n  public yearsPerPage = 24;\n\n  private dateLocale = 'en-US';\n\n  public formatter = new Intl.DateTimeFormat(this.dateLocale, {\n    month: '2-digit',\n    day: '2-digit',\n    year: 'numeric',\n  });\n\n  public dateFormats = { \n    display: {\n      dateInput: { year: 'numeric', month: 'numeric', day: 'numeric' },\n      monthLabel: { month: 'short' },\n      monthYearLabel: { year: 'numeric', month: 'short' },\n      dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\n      monthYearA11yLabel: { year: 'numeric', month: 'long' },\n    },\n  }\n\n  public today(): Date {\n    return new Date();\n  }\n\n  public getDate(date: Date): number {\n    return date.getDate();\n  }\n\n  public getMonth(date: Date): number {\n    return date.getMonth();\n  }\n\n  public getYear(date: Date): number {\n    return date.getFullYear();\n  }\n\n  public getDayOfWeek(date: Date): number {\n    return date.getDay();\n  }\n\n  public getDateLocale(): string {\n    return this.dateLocale;\n  }\n\n  public setDateLocale(value: string): void {\n    this.formatter = new Intl.DateTimeFormat(value, {\n      month: '2-digit',\n      day: '2-digit',\n      year: 'numeric',\n    })\n\n    this.dateLocale = value;\n  }\n\n  public getMonthNames(style: 'long' | 'short' | 'narrow'): string[] {\n    const dtf = new Intl.DateTimeFormat(this.dateLocale, { month: style, timeZone: 'utc' });\n\n    return this.range(12, i => this.format(dtf, new Date(2017, i, 1)));\n  }\n\n  public getFirstDayOfWeek(): number {\n    if (typeof Intl !== 'undefined' && Intl.Locale) {\n      const locale = new Intl.Locale(this.dateLocale) as {\n        getWeekInfo?: () => {firstDay: number};\n        weekInfo?: {firstDay: number};\n      };\n\n      // Some browsers implement a `getWeekInfo` method while others have a `weekInfo` getter.\n      // Note that this isn't supported in all browsers so we need to null check it.\n      const firstDay = (locale.getWeekInfo?.() || locale.weekInfo)?.firstDay ?? 0;\n\n      // `weekInfo.firstDay` is a number between 1 and 7 where, starting from Monday,\n      // whereas our representation is 0 to 6 where 0 is Sunday so we need to normalize it.\n      return firstDay === 7 ? 0 : firstDay;\n    }\n\n    // Default to Sunday if the browser doesn't provide the week information.\n    return 0;\n  }\n\n  public getValidDateOrNull(obj: unknown): Date | null {\n    return this.isDateInstance(obj) && this.isValid(obj as Date) ? (obj as Date) : null;\n  }\n\n  public getDayOfWeekNames(style: 'long' | 'short' | 'narrow'): string[] {\n    const dtf = new Intl.DateTimeFormat(this.dateLocale, { weekday: style, timeZone: 'utc'});\n\n    return this.range(7, i => this.format(dtf, new Date(2017, 0, i + 1)));\n  }\n\n  public getDateNames(): string[] {\n    const dtf = new Intl.DateTimeFormat(this.dateLocale, {day: 'numeric', timeZone: 'utc'});\n\n    return this.range(31, i => this.format(dtf, new Date(2017, 0, i + 1)));\n  }\n\n  public getYearName(date: Date): string {\n    const dtf = new Intl.DateTimeFormat(this.dateLocale, {year: 'numeric', timeZone: 'utc'});\n\n    return this.format(dtf, date);\n  }\n\n  public getNumDaysInMonth(date: Date): number {\n    return this.getDate(\n      this.createDateWithOverflow(this.getYear(date), this.getMonth(date) + 1, 0),\n    );\n  }\n\n  public createDate(year: number, month: number, date: number): Date {\n    // Check for invalid month and date (except upper bound on date which we have to check after\n    // creating the Date).\n    if (month < 0 || month > 11) {\n      throw Error(`Invalid month index \"${month}\". Month index has to be between 0 and 11.`);\n    }\n\n    if (date < 1) {\n      throw Error(`Invalid date \"${date}\". Date has to be greater than 0.`);\n    }\n\n    let result = this.createDateWithOverflow(year, month, date);\n    // Check that the date wasn't above the upper bound for the month, causing the month to overflow\n    if (result.getMonth() != month) {\n      throw Error(`Invalid date \"${date}\" for month with index \"${month}\".`);\n    }\n\n    return result;\n  }\n\n  public addCalendarDays(date: Date, days: number): Date {\n    return this.createDateWithOverflow(\n      this.getYear(date),\n      this.getMonth(date),\n      this.getDate(date) + days,\n    );\n  }\n\n  public addCalendarMonths(date: Date, months: number): Date {\n    let newDate = this.createDateWithOverflow(\n      this.getYear(date),\n      this.getMonth(date) + months,\n      this.getDate(date),\n    );\n\n    // It's possible to wind up in the wrong month if the original month has more days than the new\n    // month. In this case we want to go to the last day of the desired month.\n    // Note: the additional + 12 % 12 ensures we end up with a positive number, since JS % doesn't\n    // guarantee this.\n    if (this.getMonth(newDate) != (((this.getMonth(date) + months) % 12) + 12) % 12) {\n      newDate = this.createDateWithOverflow(this.getYear(newDate), this.getMonth(newDate), 0);\n    }\n\n    return newDate;\n  }\n\n  public addCalendarYears(date: Date, years: number): Date {\n    return this.addCalendarMonths(date, years * 12);\n  }\n\n  public setTime(date: Date, hours: number, minutes: number): Date {\n    if (!this.isValid(date)) {\n      throw new Error(\"Invalid date provided\");\n    }\n\n    if (hours < 0 || hours > 23) {\n      throw new Error(\"Invalid hours provided, must be between 0 and 23\");\n    }\n\n    if (minutes < 0 || minutes > 59) {\n      throw new Error(\"Invalid minutes provided, must be between 0 and 59\");\n    }\n\n    const updatedDate = new Date(date);\n\n    updatedDate.setHours(hours);\n    updatedDate.setMinutes(minutes);\n\n    return updatedDate;\n  }\n\n  public sameDate(first: Date | null, second: Date | null): boolean {\n    if (first && second) {\n      let firstValid = this.isValid(first);\n      let secondValid = this.isValid(second);\n\n      if (firstValid && secondValid) {\n        return !this.compareDate(first, second);\n      }\n\n      return firstValid == secondValid;\n    }\n\n    return first == second;\n  }\n\n  /**\n  * Compares two dates.\n  * @param first The first date to compare.\n  * @param second The second date to compare.\n  * @returns 0 if the dates are equal, a number less than 0 if the first date is earlier,\n  *     a number greater than 0 if the first date is later.\n  */\n  public compareDate(first: Date, second: Date): number {\n    return (\n      this.getYear(first) - this.getYear(second) ||\n      this.getMonth(first) - this.getMonth(second) ||\n      this.getDate(first) - this.getDate(second)\n    );\n  }\n\n  public deserialize(value: any): Date | null {\n    if (value == null || (this.isDateInstance(value) && this.isValid(value))) {\n      return value;\n    }\n    return this.invalid();\n  }\n\n  public clampDate(date: Date, min?: Date | null, max?: Date | null): Date {\n    if (min && this.compareDate(date, min) < 0) {\n      return min;\n    }\n\n    if (max && this.compareDate(date, max) > 0) {\n      return max;\n    }\n\n    return date;\n  }\n\n  public formatDate(date: Date, displayFormat: Object): string {\n    if (!this.isValid(date)) {\n      throw Error('DatepickerService: Cannot format invalid date.');\n    }\n\n    const dtf = new Intl.DateTimeFormat(this.dateLocale, {...displayFormat, timeZone: 'utc'});\n    return this.format(dtf, date);\n  }\n\n  public minValidator(minDate: Date): ValidatorFn {\n    return (control: AbstractControl): ValidationErrors | null => {\n        const controlValue = control.value;\n  \n        const min = this.getValidDateOrNull(minDate);\n\n        return !min || !controlValue || this.compareDate(min, controlValue) <= 0\n            ? null\n            : { 'datepickerMin': { min, actual: controlValue } };\n    };\n  }\n\n  public maxValidator(maxDate: Date): ValidatorFn {\n    return (control: AbstractControl): ValidationErrors | null => {\n        const controlValue = control.value;\n\n        const max = this.getValidDateOrNull(maxDate);\n\n        return !max || !controlValue || this.compareDate(max, controlValue) >= 0\n            ? null\n            : { 'datepickerMax': { max, actual: controlValue } };\n    };\n  }\n\n  /** Creates a date but allows the month and date to overflow. */\n  private createDateWithOverflow(year: number, month: number, date: number) {\n    // Passing the year to the constructor causes year numbers <100 to be converted to 19xx.\n    // To work around this we use `setFullYear` and `setHours` instead.\n    const d = new Date();\n\n    d.setFullYear(year, month, date);\n    d.setHours(0, 0, 0, 0);\n\n    return d;\n  }\n\n  private format(dtf: Intl.DateTimeFormat, date: Date) {\n    // Passing the year to the constructor causes year numbers <100 to be converted to 19xx.\n    // To work around this we use `setUTCFullYear` and `setUTCHours` instead.\n    const d = new Date();\n\n    d.setUTCFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n    d.setUTCHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n\n    return dtf.format(d);\n  }\n\n  private isDateInstance(obj: any) {\n    return obj instanceof Date;\n  }\n\n  private isValid(date: Date) {\n    return !isNaN(date.getTime());\n  }\n\n  private invalid(): Date {\n    return new Date(NaN);\n  }\n\n  public getActiveOffset<D>(\n    activeDate: Date,\n    minDate: Date | null,\n    maxDate: Date | null,\n  ): number {\n    const activeYear = this.getYear(activeDate);\n\n    return this.positiveModulo(activeYear - this.getStartingYear(minDate, maxDate), this.yearsPerPage);\n  }\n\n  private getStartingYear<D>(\n    minDate: Date| null,\n    maxDate: Date | null,\n  ): number {\n    let startingYear = 0;\n\n    if (maxDate) {\n      const maxYear = this.getYear(maxDate);\n  \n      startingYear = maxYear - this.yearsPerPage + 1;\n    } else if (minDate) {\n      startingYear = this.getYear(minDate);\n    }\n\n    return startingYear;\n  }\n  \n  public positiveModulo(a: number, b: number): number {\n    return ((a % b) + b) % b;\n  }\n\n  public isSameMultiYearView<D>(\n    date1: Date,\n    date2: Date,\n    minDate: Date | null,\n    maxDate: Date | null,\n  ): boolean {\n    const year1 = this.getYear(date1);\n    const year2 = this.getYear(date2);\n\n    const startingYear = this.getStartingYear(minDate, maxDate);\n\n    return (Math.floor((year1 - startingYear) / this.yearsPerPage) === Math.floor((year2 - startingYear) / this.yearsPerPage));\n  }\n\n  private range<T>(length: number, valueFunction: (index: number) => T): T[] {\n    const valuesArray = Array(length);\n  \n    for (let i = 0; i < length; i++) {\n      valuesArray[i] = valueFunction(i);\n    }\n\n    return valuesArray;\n  }\n\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\n\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { Subscription } from 'rxjs';\n\nimport { DateRange } from './../../datepicker.component';\n\nimport { CalendarBody, CalendarCell } from './../calendar-body/calendar-body.component';\n\nimport { IpiDatepickerService } from './../../datepicker-service';\n\n@Component({\n  selector: 'ipi-calendar-year-view',\n  templateUrl: './year-view.component.html',\n  styleUrls: ['./year-view.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    FormsModule,\n    CalendarBody,\n    ReactiveFormsModule,\n  ],\n})\n\nexport class IpiCalendarYearView {\n\n  constructor(\n    public datePickerService: IpiDatepickerService,\n    private changeDetectorRef: ChangeDetectorRef) {\n      this._activeDate = this.datePickerService.today();\n  }\n\n  /** The body of calendar table */\n  @ViewChild(CalendarBody) CalendarBody!: CalendarBody;\n\n  @Input()\n  public get activeDate(): Date {\n    return this._activeDate;\n  }\n  public set activeDate(value: Date) {\n    let oldActiveDate = this._activeDate;\n\n    const validDate =\n      this.datePickerService.getValidDateOrNull(this.datePickerService.deserialize(value)) ||\n      this.datePickerService.today();\n\n    this._activeDate = this.datePickerService.clampDate(validDate, this.minDate, this.maxDate);\n\n    if (this.datePickerService.getYear(oldActiveDate) !== this.datePickerService.getYear(this._activeDate)) {\n      this.init();\n    }\n  }\n\n  @Input()\n  public get selected(): DateRange| Date | null {\n    return this._selected;\n  }\n  public set selected(value: DateRange | Date | null) {\n    if (value instanceof DateRange) {\n      this._selected = value;\n    } else {\n      this._selected = this.datePickerService.getValidDateOrNull(this.datePickerService.deserialize(value));\n    }\n\n    this.setSelectedMonth(value);\n  }\n\n  @Input()\n  public get minDate(): Date | null {\n    return this._minDate;\n  }\n  public set minDate(value: Date | null) {\n    this._minDate = this.datePickerService.getValidDateOrNull(this.datePickerService.deserialize(value));\n  }\n\n  @Input()\n  public get maxDate(): Date | null {\n    return this._maxDate;\n  }\n  public set maxDate(value: Date | null) {\n    this._maxDate = this.datePickerService.getValidDateOrNull(this.datePickerService.deserialize(value));\n  }\n\n  /** Emits when a new month is selected. */\n  @Output() selectedChange: EventEmitter<Date> = new EventEmitter<Date>();\n\n  /** Emits the selected month. This doesn't imply a change on the selected date */\n  @Output() monthSelected: EventEmitter<Date> = new EventEmitter<Date>();\n\n  /** Emits when any date is activated. */\n  @Output() activeDateChange: EventEmitter<Date> = new EventEmitter<Date>();\n\n  /** Grid of calendar cells representing the months of the year. */\n  public months!: CalendarCell[][];\n\n  /**\n   * The month in this year that the selected Date falls on.\n   * Null if the selected Date is in a different year.\n  */\n  public selectedMonth!: number | null;\n\n  /** The label for this year (e.g. \"2017\"). */\n  public yearLabel!: string;\n\n  /** The month in this year that today falls on. Null if today is in a different year. */\n  public todayMonth!: number | null;\n\n  private _activeDate: Date;\n  private _minDate!: Date | null;\n  private _maxDate!: Date | null;\n  private _selected!: DateRange | Date | null;\n\n  /** Flag used to filter out space/enter keyup events that originated outside of the view. */\n  private selectionKeyPressed!: boolean;\n\n  private dateFormats = {\n    dateInput: null,\n    display: {\n      dateInput: { year: 'numeric', month: 'numeric', day: 'numeric' },\n      monthLabel: { month: 'short' },\n      monthYearLabel: { year: 'numeric', month: 'short' },\n      dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\n      monthYearA11yLabel: { year: 'numeric', month: 'long' },\n    },\n  }\n\n  public ngAfterContentInit(): void {\n    this.init();\n  }\n\n  /** Initializes this year view. */\n  public init(): void {\n    this.setSelectedMonth(this.selected);\n\n    this.todayMonth = this.getMonthInCurrentYear(this.datePickerService.today());\n\n    this.yearLabel = this.datePickerService.getYearName(this.activeDate);\n\n    let monthNames = this.datePickerService.getMonthNames('short');\n\n    // First row of months only contains 5 elements so we can fit the year label on the same row.\n    this.months = [ [0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]\n      .map(row => row.map(month => this.createCellForMonth(month, monthNames[month])));\n    this.changeDetectorRef.markForCheck();\n  }\n\n  /** Handles when a new month is selected. */\n  public onMonthSelected(event: any): void {\n    const month = event.value;\n\n    const selectedMonth = this.datePickerService.createDate(\n      this.datePickerService.getYear(this.activeDate),\n      month,\n      1,\n    );\n\n    this.monthSelected.emit(selectedMonth);\n\n    const selectedDate = this.getDateFromMonth(month);\n    this.selectedChange.emit(selectedDate);\n  }\n\n  /**\n   * Takes the index of a calendar body cell wrapped in an event as argument. For the date that\n   * corresponds to the given cell, set `activeDate` to that date and fire `activeDateChange` with\n   * that date.\n   *\n   * This function is used to match each component's model of the active date with the calendar\n   * body cell that was focused. It updates its value of `activeDate` synchronously and updates the\n   * parent's value asynchronously via the `activeDateChange` event. The child component receives an\n   * updated value asynchronously via the `activeCell` Input.\n   */\n  public updateActiveDate(event: any): void {\n    const month = event.value;\n    const oldActiveDate = this._activeDate;\n\n    this.activeDate = this.getDateFromMonth(month);\n\n    if (this.datePickerService.compareDate(oldActiveDate, this.activeDate)) {\n      this.activeDateChange.emit(this.activeDate);\n    }\n  }\n\n  /** Handles keydown events on the calendar body when calendar is in year view. */\n  public handleCalendarBodyKeydown(event: KeyboardEvent): void {\n    const oldActiveDate = this._activeDate;\n\n    switch (event.code) {\n      case 'ArrowLeft':\n        this.activeDate = this.datePickerService.addCalendarMonths(this._activeDate, -1);\n        break;\n      case 'ArrowRight':\n        this.activeDate = this.datePickerService.addCalendarMonths(this._activeDate, 1);\n        break;\n      case 'ArrowUp':\n        this.activeDate = this.datePickerService.addCalendarMonths(this._activeDate, -4);\n        break;\n      case 'ArrowDown':\n        this.activeDate = this.datePickerService.addCalendarMonths(this._activeDate, 4);\n        break;\n      case 'Home':\n        this.activeDate = this.datePickerService.addCalendarMonths(\n          this._activeDate,\n          -this.datePickerService.getMonth(this._activeDate),\n        );\n        break;\n      case 'End':\n        this.activeDate = this.datePickerService.addCalendarMonths(\n          this._activeDate,\n          11 - this.datePickerService.getMonth(this._activeDate),\n        );\n        break;\n      case 'PageUp':\n        this.activeDate = this.datePickerService.addCalendarYears(\n          this._activeDate,\n          event.altKey ? -10 : -1,\n        );\n        break;\n      case 'PageDown':\n        this.activeDate = this.datePickerService.addCalendarYears(\n          this._activeDate,\n          event.altKey ? 10 : 1,\n        );\n        break;\n      case 'Enter':\n      case 'Space':\n        // Note that we only prevent the default action here while the selection happens in\n        // `keyup` below. We can't do the selection here, because it can cause the calendar to\n        // reopen if focus is restored immediately. We also can't call `preventDefault` on `keyup`\n        // because it's too late (see #23305).\n        this.selectionKeyPressed = true;\n        break;\n      default:\n        // Don't prevent default or focus active cell on keys that we don't explicitly handle.\n        return;\n    }\n\n    if (this.datePickerService.compareDate(oldActiveDate, this.activeDate)) {\n      this.activeDateChange.emit(this.activeDate);\n      this.focusActiveCellAfterViewChecked();\n    }\n\n    // Prevent unexpected default actions such as form submission.\n    event.preventDefault();\n  }\n\n  /** Handles keyup events on the calendar body when calendar is in year view. */\n  public handleCalendarBodyKeyup(event: KeyboardEvent): void {\n    if (event.code === 'Space' || event.code === 'Enter') {\n      if (this.selectionKeyPressed) {\n        this.onMonthSelected({ value: this.datePickerService.getMonth(this._activeDate), event });\n      }\n\n      this.selectionKeyPressed = false;\n    }\n  }\n\n  /** Focuses the active cell after the microtask queue is empty. */\n  public focusActiveCell(): void {\n    this.CalendarBody.focusActiveCell();\n  }\n\n  /** Schedules the matCalendarBody to focus the active cell after change detection has run */\n  public focusActiveCellAfterViewChecked(): void {\n    this.CalendarBody.scheduleFocusActiveCellAfterViewChecked();\n  }\n\n  /**\n   * Gets the month in this year that the given Date falls on.\n   * Returns null if the given Date is in another year.\n   */\n  private getMonthInCurrentYear(date: Date | null): number | null {\n    return date && this.datePickerService.getYear(date) == this.datePickerService.getYear(this.activeDate)\n      ? this.datePickerService.getMonth(date)\n      : null;\n  }\n\n  /**\n   * Takes a month and returns a new date in the same day and year as the currently active date.\n   *  The returned date will have the same month as the argument date.\n   */\n  private getDateFromMonth(month: number): Date {\n    const normalizedDate = this.datePickerService.createDate(\n      this.datePickerService.getYear(this.activeDate),\n      month,\n      1,\n    );\n\n    const daysInMonth = this.datePickerService.getNumDaysInMonth(normalizedDate);\n\n    return this.datePickerService.createDate(\n      this.datePickerService.getYear(this.activeDate),\n      month,\n      Math.min(this.datePickerService.getDate(this.activeDate), daysInMonth),\n    );\n  }\n\n  /** Creates an MatCalendarCell for the given month. */\n  private createCellForMonth(month: number, monthName: string) {\n    const date = this.datePickerService.createDate(this.datePickerService.getYear(this.activeDate), month, 1);\n    const ariaLabel = this.datePickerService.formatDate(date, this.dateFormats.display.monthYearA11yLabel);\n\n    return new CalendarCell(\n      month,\n      monthName.toLocaleUpperCase(),\n      ariaLabel,\n      this.shouldEnableMonth(month),\n    );\n  }\n\n  /** Whether the given month is enabled. */\n  private shouldEnableMonth(month: number) {\n    const activeYear = this.datePickerService.getYear(this.activeDate);\n\n    if (month === undefined || month === null || this.isYearAndMonthAfterMaxDate(activeYear, month) || this.isYearAndMonthBeforeMinDate(activeYear, month)) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Tests whether the combination month/year is after this.maxDate, considering\n   * just the month and year of this.maxDate\n   */\n  private isYearAndMonthAfterMaxDate(year: number, month: number) {\n    if (this.maxDate) {\n      const maxYear = this.datePickerService.getYear(this.maxDate);\n      const maxMonth = this.datePickerService.getMonth(this.maxDate);\n\n      return year > maxYear || (year === maxYear && month > maxMonth);\n    }\n\n    return false;\n  }\n\n  /**\n   * Tests whether the combination month/year is before this.minDate, considering\n   * just the month and year of this.minDate\n   */\n  private isYearAndMonthBeforeMinDate(year: number, month: number) {\n    if (this.minDate) {\n      const minYear = this.datePickerService.getYear(this.minDate);\n      const minMonth = this.datePickerService.getMonth(this.minDate);\n\n      return year < minYear || (year === minYear && month < minMonth);\n    }\n\n    return false;\n  }\n\n  /** Sets the currently-selected month based on a model value. */\n  private setSelectedMonth(value: DateRange | Date | null): void {\n    if (value instanceof DateRange) {\n      this.selectedMonth = \n        this.getMonthInCurrentYear(value.start) || this.getMonthInCurrentYear(value.end);\n    } else {\n      this.selectedMonth = this.getMonthInCurrentYear(value);\n    }\n  }\n\n}\n","<table class=\"calendar-table\" role=\"grid\">\n    <thead aria-hidden=\"true\" class=\"calendar-table-header\">\n        <tr>\n            <th class=\"calendar-table-header-divider\" colspan=\"4\"></th>\n        </tr>\n    </thead>\n\n    <tbody calendar-body\n         [label]=\"yearLabel\"\n         [rows]=\"months\"\n         [todayValue]=\"todayMonth!\"\n         [startValue]=\"selectedMonth!\"\n         [endValue]=\"selectedMonth!\"\n         [labelMinRequiredCells]=\"2\"\n         [numCols]=\"4\"\n         [cellAspectRatio]=\"4 / 7\"\n         [activeCell]=\"datePickerService.getMonth(activeDate)\"\n         (selectedValueChange)=\"onMonthSelected($event)\"\n         (activeDateChange)=\"updateActiveDate($event)\"\n         (keyup)=\"handleCalendarBodyKeyup($event)\"\n         (keydown)=\"handleCalendarBodyKeydown($event)\">\n    </tbody>\n</table>\n","import { Injectable } from \"@angular/core\";\n\nimport { IpiDatepickerService } from './datepicker-service';\n\nimport { DateRange } from './datepicker.component';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class DefaultCalendarRangeStrategy {\n  constructor(private datepickerService: IpiDatepickerService) {}\n\n  public selectionFinished(date: Date, currentRange: DateRange): DateRange {\n    let { start, end } = currentRange;\n\n    if (start == null) {\n      start = date;\n    } else if (end == null && date && this.datepickerService.compareDate(date, start) >= 0) {\n      end = date;\n    } else {\n      start = date;\n      end = null;\n    }\n\n    return new DateRange(start, end);\n  }\n\n  public createPreview(activeDate: Date | null, currentRange: DateRange): DateRange {\n    let start: Date | null = null;\n    let end: Date | null = null;\n\n    if (currentRange.start && !currentRange.end && activeDate) {\n      start = currentRange.start;\n      end = activeDate;\n    }\n\n    return new DateRange(start, end);\n  }\n\n  public createDrag(dragOrigin: Date, originalRange: DateRange, newDate: Date): DateRange | null {\n    let start = originalRange.start;\n    let end = originalRange.end;\n\n    if (!start || !end) {\n      // Can't drag from an incomplete range.\n      return null;\n    }\n\n    const service = this.datepickerService;\n\n    const isRange = service.compareDate(start, end) !== 0;\n    const diffYears = service.getYear(newDate) - service.getYear(dragOrigin);\n    const diffMonths = service.getMonth(newDate) - service.getMonth(dragOrigin);\n    const diffDays = service.getDate(newDate) - service.getDate(dragOrigin);\n\n    if (isRange && service.sameDate(dragOrigin, originalRange.start)) {\n      start = newDate;\n      // when selecting start date of range move only start date\n      if (service.compareDate(newDate, end) > 0) {\n        // if start date becomes after end date, move whole range\n        end = service.addCalendarYears(end, diffYears);\n        end = service.addCalendarMonths(end, diffMonths);\n        end = service.addCalendarDays(end, diffDays);\n      }\n    } else if (isRange && service.sameDate(dragOrigin, originalRange.end)) {\n      // when selecting end date of range move only end date\n      end = newDate;\n      if (service.compareDate(newDate, start) < 0) {\n        // if end date becomes before start date, move whole range\n        start = service.addCalendarYears(start, diffYears);\n        start = service.addCalendarMonths(start, diffMonths);\n        start = service.addCalendarDays(start, diffDays);\n      }\n    } else {  \n      // moving whole range if dragged from a middle date\n      start = service.addCalendarYears(start, diffYears);\n      start = service.addCalendarMonths(start, diffMonths);\n      start = service.addCalendarDays(start, diffDays);\n      end = service.addCalendarYears(end, diffYears);\n      end = service.addCalendarMonths(end, diffMonths);\n      end = service.addCalendarDays(end, diffDays);\n    }\n\n    return new DateRange(start, end);\n  }\n}","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, SimpleChanges, ViewChild } from '@angular/core';\n\nimport { hasModifierKey } from '@angular/cdk/keycodes';\n\nimport { IpiDatepickerService } from './../../datepicker-service';\n\nimport { CalendarBody, CalendarCell } from './../calendar-body/calendar-body.component';\n\nimport { DateRange, DateSelectionEvent } from './../../datepicker.component';\n\nimport { DefaultCalendarRangeStrategy } from './../../datepicker-selection-strategy.component';\n\n@Component({\n  selector: 'ipi-calendar-month-view',\n  templateUrl: './month-view-calendar.component.html',\n  styleUrls: ['./month-view-calendar.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CalendarBody,\n  ],\n})\n\nexport class IpiCalendarMonthView {\n\n  constructor(\n    public datepickerService: IpiDatepickerService,\n    private changeDetectorRef: ChangeDetectorRef,\n    private rangeSelectionStartegy: DefaultCalendarRangeStrategy) { \n      this._activeDate = this.datepickerService.today();\n  }\n\n  @ViewChild(CalendarBody) calendarBody!: CalendarBody;\n\n  @Input()\n  public get activeDate(): Date {\n    return this._activeDate;\n  }\n  public set activeDate(value: Date | null) {\n    const oldActiveDate = this._activeDate;\n  \n    const validDate =\n      this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(value)) ||\n      this.datepickerService.today();\n  \n    this._activeDate = this.datepickerService.clampDate(validDate, validDate, validDate);\n\n    if (!this.hasSameMonthAndYear(oldActiveDate, this._activeDate)) {\n      this.init();\n    }\n  }\n\n  @Input()\n  public get selected(): DateRange| Date | null {\n    return this._selected;\n  }\n  public set selected(value: DateRange | Date | null) {\n    if (value instanceof DateRange) {\n      this._selected = value;\n    } else {\n      this._selected = this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(value));\n    }\n\n    this.setRanges(this._selected);\n  }\n\n  @Input()\n  public get minDate(): Date | null {\n    return this._minDate;\n  }\n  public set minDate(value: Date | null) {\n    this._minDate = this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(value));\n  }\n\n  @Input()\n  public get maxDate(): Date | null {\n    return this._maxDate;\n  }\n  public set maxDate(value: Date | null) {\n    this._maxDate = this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(value));\n  }\n\n  @Input() activeDrag: DateSelectionEvent<Date> | null = null;\n\n  @Output() dragStarted = new EventEmitter<DateSelectionEvent<Date>>();\n  @Output() dragEnded = new EventEmitter<DateSelectionEvent<DateRange | null>>();\n\n  @Output() activeDateChange: EventEmitter<Date> = new EventEmitter<Date>();\n\n  @Output() userSelection: EventEmitter<DateSelectionEvent<Date | null>> =\n  new EventEmitter<DateSelectionEvent<Date | null>>();\n\n  @Output() selectedChange: EventEmitter<Date | null> = new EventEmitter<Date | null>();\n\n  public monthLabel!: string;\n\n  /** Grid of calendar cells representing the dates of the month. */\n  public weeks!: CalendarCell[][];\n\n  /** The number of blank cells in the first row before the 1st of the month. */\n  public firstWeekOffset!: number;\n\n  /** Start value of the currently-shown date range. */\n  public rangeStart!: number | null;\n\n  /** End value of the currently-shown date range. */\n  public rangeEnd!: number | null;\n\n  /** Start of the preview range. */\n  public previewStart!: number | null;\n\n  /** End of the preview range. */\n  public previewEnd!: number | null;\n\n  /** Whether the user is currently selecting a range of dates. */\n  public isRange!: boolean;\n\n  /** The date of the month that today falls on. Null if today is in another month. */\n  public todayDate!: number | null;\n\n  public weekdays!: { long: string; narrow: string; id: number }[];\n\n  private selectionKeyPressed!: boolean;\n\n  private _minDate!: Date | null;\n\n  private _maxDate!: Date | null;\n\n  private _selected!: DateRange | Date | null;\n\n  private _activeDate!: Date;\n\n  private uniqueIdCounter = 0;\n\n  public ngOnChanges(changes: SimpleChanges): void {\n    const comparisonChange = changes['comparisonStart'] || changes['comparisonEnd'];\n\n    if (comparisonChange && !comparisonChange.firstChange) {\n      this.setRanges(this.selected);\n    }\n\n    if (changes['activeDrag']) {\n      this.clearPreview();\n    }\n  }\n\n  public ngAfterContentInit(): void {\n    this.init();\n  }\n\n  public getActiveCell(): number {\n    return this.datepickerService.getDate(this.activeDate) - 1;\n  }\n\n  public updateActiveDate(event: DateSelectionEvent<number>): void {\n    const month = event.value;\n    const oldActiveDate = this._activeDate;\n    this.activeDate = this.getDateFromDayOfMonth(month);\n\n    if (this.datepickerService.compareDate(oldActiveDate, this.activeDate)) {\n      this.activeDateChange.emit(this._activeDate);\n    }\n  }\n\n  /** Handles when a new date is selected. */\n  public dateSelected(event: DateSelectionEvent<number>): void {\n    const date = event.value;\n    const selectedDate = this.getDateFromDayOfMonth(date);\n\n    let rangeStartDate: number | null;\n    let rangeEndDate: number | null;\n\n    if (this._selected instanceof DateRange) {\n      rangeStartDate = this.getDateInCurrentMonth(this._selected.start);\n      rangeEndDate = this.getDateInCurrentMonth(this._selected.end);\n    } else {\n      rangeStartDate = rangeEndDate = this.getDateInCurrentMonth(this._selected);\n    }\n\n    if (rangeStartDate !== date || rangeEndDate !== date) {\n      this.selectedChange.emit(selectedDate);\n    }\n\n    this.userSelection.emit({ value: selectedDate, event: event.event });\n\n    this.clearPreview();\n  }\n\n  public handleCalendarBodyKeydown(event: KeyboardEvent): void {\n    const oldActiveDate = this._activeDate;\n\n    switch (event.code) {\n      case 'ArrowLeft':\n        this.activeDate = this.datepickerService.addCalendarDays(this._activeDate, -1);\n        break;\n      case 'ArrowRight':\n        this.activeDate = this.datepickerService.addCalendarDays(this._activeDate, 1);\n        break;\n      case 'ArrowUp':\n        this.activeDate = this.datepickerService.addCalendarDays(this._activeDate, -7);\n        break;\n      case 'ArrowDown':\n        this.activeDate = this.datepickerService.addCalendarDays(this._activeDate, 7);\n        break;\n      case 'Home':\n        this.activeDate = this.datepickerService.addCalendarDays(\n          this._activeDate,\n          1 - this.datepickerService.getDate(this._activeDate),\n        );\n        break;\n      case 'End':\n        this.activeDate = this.datepickerService.addCalendarDays(\n          this._activeDate,\n          this.datepickerService.getNumDaysInMonth(this._activeDate) -\n            this.datepickerService.getDate(this._activeDate),\n        );\n        break;\n      case 'PageUp':\n        this.activeDate = event.altKey\n          ? this.datepickerService.addCalendarYears(this._activeDate, -1)\n          : this.datepickerService.addCalendarMonths(this._activeDate, -1);\n        break;\n      case 'PageDown':\n        this.activeDate = event.altKey\n          ? this.datepickerService.addCalendarYears(this._activeDate, 1)\n          : this.datepickerService.addCalendarMonths(this._activeDate, 1);\n        break;\n      case 'Enter':\n      case 'Space':\n        this.selectionKeyPressed = true;\n\n          // Prevent unexpected default actions such as form submission.\n          // Note that we only prevent the default action here while the selection happens in\n          // `keyup` below. We can't do the selection here, because it can cause the calendar to\n          // reopen if focus is restored immediately. We also can't call `preventDefault` on `keyup`\n          // because it's too late (see #23305).\n          event.preventDefault();\n        \n        return;\n      case 'Escape':\n        // Abort the current range selection if the user presses escape mid-selection.\n        if (this.previewEnd != null && !hasModifierKey(event)) {\n          this.clearPreview();\n          // If a drag is in progress, cancel the drag without changing the\n          // current selection.\n          if (this.activeDrag) {\n            this.dragEnded.emit({ value: null, event });\n          } else {\n            this.selectedChange.emit(null);\n            this.userSelection.emit({ value: null, event });\n          }\n          event.preventDefault();\n        }\n        return;\n      default:\n        // Don't prevent default or focus active cell on keys that we don't explicitly handle.\n        return;\n    }\n\n    if (this.datepickerService.compareDate(oldActiveDate, this.activeDate)) {\n      this.activeDateChange.emit(this.activeDate);\n\n      this.focusActiveCellAfterViewChecked();\n    }\n\n    event.preventDefault();\n  }\n\n  public previewChanged({ value: cell }: DateSelectionEvent<CalendarCell<Date> | null>) {\n    if (this.rangeSelectionStartegy) {\n      if (!this.selected) {\n         return; \n      }\n\n      // We can assume that this will be a range, because preview\n      // events aren't fired for single date selections.\n      const value = (cell ? cell.rawValue! : null) as Date | null;\n\n      const previewRange = this.rangeSelectionStartegy.createPreview(\n        value,\n        this.selected as DateRange,\n      );\n\n      this.previewStart = this.getCellCompareValue(previewRange.start);\n      this.previewEnd = this.getCellCompareValue(previewRange.end);\n\n      if (this.activeDrag && value) {\n        const dragRange = this.rangeSelectionStartegy.createDrag?.(\n          this.activeDrag.value,\n          this.selected as DateRange,\n          value,\n        );\n\n        if (dragRange) {\n          this.previewStart = this.getCellCompareValue(dragRange.start);\n          this.previewEnd = this.getCellCompareValue(dragRange.end);\n        }\n      }\n\n      this.changeDetectorRef.markForCheck();\n    }\n  }\n\n  public handleCalendarBodyKeyup(event: KeyboardEvent): void {\n    if (event.code === 'Space' || event.code === 'Enter') {\n      if (this.selectionKeyPressed && this.shouldEnableDate(this._activeDate)) {\n        this.dateSelected({ value: this.datepickerService.getDate(this._activeDate), event });\n      }\n\n      this.selectionKeyPressed = false;\n    }\n  }\n\n  public focusActiveCellAfterViewChecked(): void {\n    this.calendarBody.scheduleFocusActiveCellAfterViewChecked();\n  }\n\n  private clearPreview() {\n    this.previewStart = this.previewEnd = null;\n  }\n\n  /**\n * Gets the date in this month that the given Date falls on.\n * Returns null if the given Date is in another month.\n */\n  private getDateInCurrentMonth(date: Date | null): number | null {\n    return date && this.hasSameMonthAndYear(date, this.activeDate)\n      ? this.datepickerService.getDate(date)\n      : null;\n  }\n\n  private init(): void {\n    this.setRanges(this.selected);\n    IpiDatepickerService\n    this.todayDate = this.getCellCompareValue(this.datepickerService.today());\n\n    this.monthLabel = this.datepickerService.dateFormats.display.monthLabel\n      ? this.datepickerService.formatDate(this.activeDate, this.datepickerService.dateFormats.display.monthLabel)\n      : this.datepickerService\n          .getMonthNames('short')\n          [this.datepickerService.getMonth(this.activeDate)].toLocaleUpperCase();\n\n    let firstOfMonth = this.datepickerService.createDate(\n      this.datepickerService.getYear(this.activeDate),\n      this.datepickerService.getMonth(this.activeDate),\n      1,\n    );\n\n    this.firstWeekOffset =\n      (this.datepickerService.DAYS_PER_WEEK +\n        this.datepickerService.getDayOfWeek(firstOfMonth) -\n        this.datepickerService.getFirstDayOfWeek()) %\n        this.datepickerService.DAYS_PER_WEEK;\n\n    this.initWeekdays();\n    this.createWeekCells();\n  }\n\n  private setRanges(selectedValue: DateRange | Date | null) {\n    if (selectedValue instanceof DateRange) {\n\n    this.rangeStart = this.getCellCompareValue(selectedValue.start);\n    this.rangeEnd = this.getCellCompareValue(selectedValue.end);\n\n    this.isRange = true;\n    } else if (selectedValue instanceof Date) {\n      this.rangeStart = this.rangeEnd = this.getCellCompareValue(selectedValue);\n      this.isRange = false;\n    }\n  }\n\n  private getCellCompareValue(date: Date | null): number | null {\n    if (date) {\n      // We use the time since the Unix epoch to compare dates in this view, rather than the\n      // cell values, because we need to support ranges that span across multiple months/years.\n      const year = this.datepickerService.getYear(date);\n      const month = this.datepickerService.getMonth(date);\n      const day = this.datepickerService.getDate(date);\n      return new Date(year, month, day).getTime();\n    }\n\n    return null;\n  }\n\n  private initWeekdays(): void {\n    const firstDayOfWeek = this.datepickerService.getFirstDayOfWeek();\n\n    const narrowWeekdays = this.datepickerService.getDayOfWeekNames('narrow');\n    const longWeekdays = this.datepickerService.getDayOfWeekNames('long');\n\n    // Rotate the labels for days of the week based on the configured first day of the week.\n    let weekdays = longWeekdays.map((long, i) => {\n      return { long, narrow: narrowWeekdays[i], id: this.uniqueIdCounter++ };\n    });\n\n    this.weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));\n  }\n\n  private createWeekCells(): void {\n    const daysInMonth = this.datepickerService.getNumDaysInMonth(this.activeDate);\n    const dateNames = this.datepickerService.getDateNames();\n\n    this.weeks = [[]];\n\n    for (let i = 0, cell = this.firstWeekOffset; i < daysInMonth; i++, cell++) {\n      if (cell == this.datepickerService.DAYS_PER_WEEK) {\n        this.weeks.push([]);\n        cell = 0;\n      }\n\n      const date = this.datepickerService.createDate(\n        this.datepickerService.getYear(this.activeDate),\n        this.datepickerService.getMonth(this.activeDate),\n        i + 1,\n      );\n\n      const enabled = this.shouldEnableDate(date);\n      const ariaLabel = this.datepickerService.formatDate(date, this.datepickerService.dateFormats.display.dateA11yLabel);\n\n      this.weeks[this.weeks.length - 1].push(\n        new CalendarCell<Date>(\n          i + 1,\n          dateNames[i],\n          ariaLabel,\n          enabled,\n          this.getCellCompareValue(date)!,\n          date,\n        ),\n      );\n    }\n  }\n\n  private hasSameMonthAndYear(firstDate: Date | null, secondDate: Date | null): boolean {\n    return !!(\n      firstDate &&\n      secondDate &&\n      this.datepickerService.getMonth(firstDate) == this.datepickerService.getMonth(secondDate) &&\n      this.datepickerService.getYear(firstDate) == this.datepickerService.getYear(secondDate)\n    );\n  }\n\n  protected onDragEnded(event: DateSelectionEvent<Date | null>): void {\n    if (!this.activeDrag) return;\n\n    if (event.value) {\n      // Propagate drag effect\n      const dragDropResult = this.rangeSelectionStartegy?.createDrag?.(\n        this.activeDrag.value,\n        this.selected as DateRange,\n        event.value,\n      );\n      \n      if ((!dragDropResult?.end || !this.shouldEnableDate(dragDropResult.end)) || (!dragDropResult?.start || !this.shouldEnableDate(dragDropResult.start))) {\n          return;\n      }\n\n      this.dragEnded.emit({value: dragDropResult, event: event.event});\n    } else {\n      this.dragEnded.emit({value: null, event: event.event});\n    }\n  }\n\n  private shouldEnableDate(date: Date): boolean {\n    return (\n      !!date &&\n      (!this.minDate || this.datepickerService.compareDate(date as any, this.minDate) >= 0) &&\n      (!this.maxDate || this.datepickerService.compareDate(date as any, this.maxDate) <= 0)\n    );\n  }\n\n  private getDateFromDayOfMonth(dayOfMonth: number): Date {\n    return this.datepickerService.createDate(\n      this.datepickerService.getYear(this.activeDate),\n      this.datepickerService.getMonth(this.activeDate),\n      dayOfMonth,\n    );\n  }\n\n}\n","<table class=\"calendar-table\" role=\"grid\">\n    <thead class=\"calendar-table-header\">\n        <tr>\n            @for (day of weekdays; track day.id) {\n                <th scope=\"col\">\n                    <span class=\"cdk-visually-hidden\">{{ day.long }}</span>\n\n                    <span aria-hidden=\"true\">{{ day.narrow }}</span>\n                </th>\n            }\n        </tr>\n\n        <tr aria-hidden=\"true\">\n            <th class=\"calendar-table-header-divider\" colspan=\"7\"></th>\n        </tr>\n    </thead>\n\n    <tbody calendar-body\n           [label]=\"monthLabel\"\n           [rows]=\"weeks\"\n           [todayValue]=\"todayDate!\"\n           [startValue]=\"rangeStart!\"\n           [endValue]=\"rangeEnd!\"\n           [previewStart]=\"previewStart\"\n           [previewEnd]=\"previewEnd\"\n           [isRange]=\"isRange\"\n           [activeCell]=\"getActiveCell()\"\n           [labelMinRequiredCells]=\"2\"\n           (dragStarted)=\"dragStarted.emit($event)\"\n           (dragEnded)=\"onDragEnded($event)\"\n           (activeDateChange)=\"updateActiveDate($event)\"\n           (selectedValueChange)=\"dateSelected($event)\"\n           (previewChange)=\"previewChanged($event)\"\n           (keyup)=\"handleCalendarBodyKeyup($event)\"\n           (keydown)=\"handleCalendarBodyKeydown($event)\">\n    </tbody>\n</table>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\n\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { DateSelectionEvent } from './../../datepicker.component';\n\nimport { IpiDatepickerService } from './../../datepicker-service';\n\nimport { DateRange } from './../../datepicker.component';\n\nimport { CalendarCell, CalendarBody } from './../calendar-body/calendar-body.component';\n\n@Component({\n  selector: 'ipi-calendar-multi-year-view',\n  templateUrl: './multi-year-view.component.html',\n  styleUrls: ['./multi-year-view.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    FormsModule,\n    CalendarBody,\n    ReactiveFormsModule,\n  ],\n})\n\nexport class IpiCalendarMultiYearView {\n\n  constructor(\n    private changeDetectorRef: ChangeDetectorRef,\n    private datePickerService: IpiDatepickerService)\n  {\n    this._activeDate = this.datePickerService.today();\n  }\n\n  /** Flag used to filter out space/enter keyup events that originated outside of the view. */\n  private selectionKeyPressed!: boolean;\n\n  /** The date to display in this multi-year view (everything other than the year is ignored). */\n  @Input()\n  public get activeDate(): Date {\n    return this._activeDate;\n  }\n  public set activeDate(value: Date) {\n    let oldActiveDate = this._activeDate;\n\n    const validDate =\n      this.datePickerService.getValidDateOrNull(this.datePickerService.deserialize(value)) ||\n      this.datePickerService.today();\n    this._activeDate = this.datePickerService.clampDate(validDate, this.minDate, this.maxDate);\n\n    if (!this.isSameMultiYearView(oldActiveDate, this._activeDate, this.minDate, this.maxDate)) {\n      this.init();\n    }\n  }\n\n  @Input()\n  public get selected(): DateRange | Date | null {\n    return this._selected;\n  }\n  public set selected(value: DateRange | Date | null) {\n    if (value instanceof DateRange) {\n      this._selected = value;\n    } else {\n      this._selected = this.datePickerService.getValidDateOrNull(this.datePickerService.deserialize(value));\n    }\n\n    this.setSelectedYear(value);\n  }\n  private _selected!: DateRange | Date | null;\n\n  /** The minimum selectable date. */\n  @Input()\n  public get minDate(): Date | null {\n    return this._minDate;\n  }\n  public set minDate(value: Date | null) {\n    this._minDate = this.datePickerService.getValidDateOrNull(this.datePickerService.deserialize(value));\n  }\n\n  /** The maximum selectable date. */\n  @Input()\n  public get maxDate(): Date | null {\n    return this._maxDate;\n  }\n  public set maxDate(value: Date | null) {\n    this._maxDate = this.datePickerService.getValidDateOrNull(this.datePickerService.deserialize(value));\n  }\n\n  /** Emits when a new year is selected. */\n  @Output() selectedChange: EventEmitter<Date> = new EventEmitter<Date>();\n\n  /** Emits the selected year. This doesn't imply a change on the selected date */\n  @Output() yearSelected: EventEmitter<Date> = new EventEmitter<Date>();\n\n  /** Emits when any date is activated. */\n  @Output() activeDateChange: EventEmitter<Date> = new EventEmitter<Date>();\n\n  /** The body of calendar table */\n  @ViewChild(CalendarBody) calendarBody!: CalendarBody;\n\n  /** Grid of calendar cells representing the currently displayed years. */\n  _years!: CalendarCell[][];\n\n  /** The year that today falls on. */\n  _todayYear!: number;\n\n  /** The year of the selected date. Null if the selected date is null. */\n  public selectedYear!: number | null;\n\n  private _activeDate: Date;\n  private _maxDate!: Date | null;\n  private _minDate!: Date | null;\n\n  public ngAfterContentInit(): void {\n    this.init();\n  }\n\n  public init(): void {\n    this._todayYear = this.datePickerService.getYear(this.datePickerService.today());\n\n    // We want a range years such that we maximize the number of\n    // enabled dates visible at once. This prevents issues where the minimum year\n    // is the last item of a page OR the maximum year is the first item of a page.\n\n    // The offset from the active year to the \"slot\" for the starting year is the\n    // *actual* first rendered year in the multi-year view.\n    const activeYear = this.datePickerService.getYear(this._activeDate);\n    const minYearOfPage = activeYear - this.datePickerService.getActiveOffset(this.activeDate, this.minDate, this.maxDate);\n\n    this._years = [];\n  \n    for (let i = 0, row: number[] = []; i < this.datePickerService.yearsPerPage; i++) {\n      row.push(minYearOfPage + i);\n  \n      if (row.length == this.datePickerService.yearsPerRow) {\n        this._years.push(row.map(year => this.createCellForYear(year)));\n\n        row = [];\n      }\n    }\n\n    this.changeDetectorRef.markForCheck();\n  }\n\n  /** Handles when a new year is selected. */\n  public onYearSelected(event: DateSelectionEvent<number>): void {\n    const year = event.value;\n    const selectedYear = this.datePickerService.createDate(year, 0, 1);\n    const selectedDate = this.getDateFromYear(year);\n\n    this.yearSelected.emit(selectedYear);\n    this.selectedChange.emit(selectedDate);\n  }\n\n  /**\n   * Takes the index of a calendar body cell wrapped in an event as argument. For the date that\n   * corresponds to the given cell, set `activeDate` to that date and fire `activeDateChange` with\n   * that date.\n   *\n   * This function is used to match each component's model of the active date with the calendar\n   * body cell that was focused. It updates its value of `activeDate` synchronously and updates the\n   * parent's value asynchronously via the `activeDateChange` event. The child component receives an\n   * updated value asynchronously via the `activeCell` Input.\n   */\n  public updateActiveDate(event: DateSelectionEvent<number>): void {\n    const year = event.value;\n    const oldActiveDate = this._activeDate;\n\n    this.activeDate = this.getDateFromYear(year);\n    if (this.datePickerService.compareDate(oldActiveDate, this.activeDate)) {\n      this.activeDateChange.emit(this.activeDate);\n    }\n  }\n\n  /** Handles keydown events on the calendar body when calendar is in multi-year view. */\n  public handleCalendarBodyKeydown(event: KeyboardEvent): void {\n    const oldActiveDate = this._activeDate;\n\n    switch (event.code) {\n      case 'ArrowLeft':\n        this.activeDate = this.datePickerService.addCalendarYears(this._activeDate, -1);\n        break;\n      case 'ArrowRight':\n        this.activeDate = this.datePickerService.addCalendarYears(this._activeDate, 1);\n        break;\n      case 'ArrowUp':\n        this.activeDate = this.datePickerService.addCalendarYears(this._activeDate, - this.datePickerService.yearsPerRow);\n        break;\n      case 'ArrowDown':\n        this.activeDate = this.datePickerService.addCalendarYears(this._activeDate, this.datePickerService.yearsPerRow);\n        break;\n      case 'Home':\n        this.activeDate = this.datePickerService.addCalendarYears(\n          this._activeDate,\n          - this.datePickerService.getActiveOffset(this.activeDate, this.minDate, this.maxDate),\n        );\n        break;\n      case 'End':\n        this.activeDate = this.datePickerService.addCalendarYears(\n          this._activeDate,\n          this.datePickerService.yearsPerPage -\n            this.datePickerService.getActiveOffset(this.activeDate, this.minDate, this.maxDate) -\n            1,\n        );\n        break;\n      case 'PageUp':\n        this.activeDate = this.datePickerService.addCalendarYears(\n          this._activeDate,\n          event.altKey ? - this.datePickerService.yearsPerPage * 10 : - this.datePickerService.yearsPerPage,\n        );\n        break;\n      case 'PageDown':\n        this.activeDate = this.datePickerService.addCalendarYears(\n          this._activeDate,\n          event.altKey ? this.datePickerService.yearsPerPage * 10 : this.datePickerService.yearsPerPage,\n        );\n        break;\n      case 'Enter':\n      case 'Space':\n        this.selectionKeyPressed = true;\n        break;\n      default:\n        // Don't prevent default or focus active cell on keys that we don't explicitly handle.\n        return;\n    }\n  \n    if (this.datePickerService.compareDate(oldActiveDate, this.activeDate)) {\n      this.activeDateChange.emit(this.activeDate);\n    }\n\n    this.focusActiveCellAfterViewChecked();\n    // Prevent unexpected default actions such as form submission.\n    event.preventDefault();\n  }\n\n  /** Handles keyup events on the calendar body when calendar is in multi-year view. */\n  public handleCalendarBodyKeyup(event: KeyboardEvent): void {\n    if (event.code === 'Space' || event.code === 'Enter') {\n      if (this.selectionKeyPressed) {\n        this.onYearSelected({ value: this.datePickerService.getYear(this._activeDate), event });\n      }\n\n      this.selectionKeyPressed = false;\n    }\n  }\n\n  public getActiveCell(): number {\n    return this.datePickerService.getActiveOffset(this.activeDate, this.minDate, this.maxDate);\n  }\n\n  /** Focuses the active cell after the microtask queue is empty. */\n  public focusActiveCell(): void {\n    this.calendarBody.focusActiveCell();\n  }\n\n  /** Focuses the active cell after change detection has run and the microtask queue is empty. */\n  public focusActiveCellAfterViewChecked() {\n    this.calendarBody.scheduleFocusActiveCellAfterViewChecked();\n  }\n\n  /**\n   * Takes a year and returns a new date on the same day and month as the currently active date\n   *  The returned date will have the same year as the argument date.\n   */\n  private getDateFromYear(year: number) {\n    const activeMonth = this.datePickerService.getMonth(this.activeDate);\n    const daysInMonth = this.datePickerService.getNumDaysInMonth(this.datePickerService.createDate(year, activeMonth, 1));\n\n    const normalizedDate = this.datePickerService.createDate(\n      year,\n      activeMonth,\n      Math.min(this.datePickerService.getDate(this.activeDate), daysInMonth),\n    );\n  \n    return normalizedDate;\n  }\n\n  /** Creates an CalendarCell for the given year. */\n  private createCellForYear(year: number) {\n    const date = this.datePickerService.createDate(year, 0, 1);\n    const yearName = this.datePickerService.getYearName(date);\n\n    return new CalendarCell(year, yearName, yearName, this.shouldEnableYear(year));\n  }\n\n  /** Whether the given year is enabled. */\n  private shouldEnableYear(year: number): boolean {\n    // disable if the year is greater than maxDate lower than minDate\n    if (\n      year === undefined ||\n      year === null ||\n      (this.maxDate && year > this.datePickerService.getYear(this.maxDate)) ||\n      (this.minDate && year < this.datePickerService.getYear(this.minDate))\n    ) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /** Sets the currently-highlighted year based on a model value. */\n  private setSelectedYear(value: DateRange | Date | null) {\n    this.selectedYear = null;\n\n    if (value instanceof DateRange) {\n      const displayValue = value.start || value.end;\n\n      if (displayValue) {\n        this.selectedYear = this.datePickerService.getYear(displayValue);\n      }\n    } else if (value) {\n      this.selectedYear = this.datePickerService.getYear(value);\n    }\n  }\n\n  private isSameMultiYearView(\n    date1: Date,\n    date2: Date,\n    minDate: Date | null,\n    maxDate: Date | null,\n  ): boolean {\n    const year1 = this.datePickerService.getYear(date1);\n    const year2 = this.datePickerService.getYear(date2);\n    const startingYear = this.getStartingYear(minDate, maxDate);\n    return (\n      Math.floor((year1 - startingYear) / this.datePickerService.yearsPerPage) ===\n      Math.floor((year2 - startingYear) / this.datePickerService.yearsPerPage)\n    );\n  }\n  \n  private getStartingYear(\n    minDate: Date | null,\n    maxDate: Date | null,\n  ): number {\n    let startingYear = 0;\n    if (maxDate) {\n      const maxYear = this.datePickerService.getYear(maxDate);\n      startingYear = maxYear - this.datePickerService.yearsPerPage + 1;\n    } else if (minDate) {\n      startingYear = this.datePickerService.getYear(minDate);\n    }\n    return startingYear;\n  }\n\n}\n","<table class=\"calendar-table\" role=\"grid\">\n    <thead aria-hidden=\"true\" class=\"calendar-table-header\">\n        <tr>\n            <th class=\"calendar-table-header-divider\" colspan=\"4\"></th>\n        </tr>\n    </thead>\n\n    <tbody calendar-body\n            [rows]=\"_years\"\n            [todayValue]=\"_todayYear\"\n            [startValue]=\"selectedYear!\"\n            [endValue]=\"selectedYear!\"\n            [numCols]=\"4\"\n            [cellAspectRatio]=\"4 / 7\"\n            [activeCell]=\"getActiveCell()\"\n            (selectedValueChange)=\"onYearSelected($event)\"\n            (activeDateChange)=\"updateActiveDate($event)\"\n            (keyup)=\"handleCalendarBodyKeyup($event)\"\n            (keydown)=\"handleCalendarBodyKeydown($event)\">\n    </tbody>\n</table>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { IpiButtonComponent } from '@ipi-soft/ng-components/button';\n\nimport { IpiCalendarYearView } from './../year-view/year-view.component';\nimport { IpiCalendarMonthView } from './../month-view/month-view-calendar.component';\nimport { IpiCalendarMultiYearView } from './../multi-year-view/multi-year-view.component';\n\nimport { IpiDatepickerService } from './../../datepicker-service';\n\nimport { DateRange, DateSelectionEvent } from './../../datepicker.component';\n\nexport const months = [\n    'January',\n    'February',\n    'March',\n    'April',\n    'May',\n    'Jun',\n    'July',\n    'August',\n    'September',\n    'October',\n    'November',\n    'December',\n];\n\nexport type activeDateView = 'month' | 'year' | 'multi-year';\n\n@Component({\n  selector: 'ipi-calendar',\n  templateUrl: './calendar.component.html',\n  styleUrls: ['./calendar.component.css'],\n  imports: [\n    IpiButtonComponent,\n    IpiCalendarYearView,\n    IpiCalendarMonthView,\n    IpiCalendarMultiYearView,\n  ],\n})\n\nexport class IpiCalendarComponent {\n\n  constructor(private datePickerService: IpiDatepickerService) {}\n\n  @Input()\n  public get activeDate(): any {\n    return this._activeDate;\n  }\n  public set activeDate(value: Date | null) {\n        const validDate =\n      this.datePickerService.getValidDateOrNull(this.datePickerService.deserialize(value)) ||\n      this.datePickerService.today();\n    \n    this._activeDate = this.datePickerService.clampDate(validDate, validDate, validDate);\n  }\n\n  @Input()\n  public get minDate(): Date | null {\n    return this._minDate;\n  }\n  public set minDate(value: Date | null) {\n    this._minDate = this.datePickerService.getValidDateOrNull(this.datePickerService.deserialize(value));\n  }\n\n  @Input()\n  public get selected(): DateRange | Date | null {\n    return this._selected;\n  }\n  public set selected(value: DateRange | Date | null) {\n    if (value instanceof DateRange) {\n      this._selected = value;\n    } else {\n      this._selected = this.datePickerService.getValidDateOrNull(this.datePickerService.deserialize(value));\n    }\n  }\n\n  @Input()\n  public get maxDate(): Date | null {\n    return this._maxDate;\n  }\n  public set maxDate(value: Date | null) {\n    this._maxDate = this.datePickerService.getValidDateOrNull(this.datePickerService.deserialize(value));\n  }\n\n  @Input() comparisonStart!: Date | null;\n\n  /** End of the comparison range. */\n  @Input() comparisonEnd!: Date | null;\n\n  /** ARIA Accessible name of the `<input StartDate/>` */\n  @Input() startDateAccessibleName!: string | null;\n\n  /** ARIA Accessible name of the `<input EndDate/>` */\n  @Input() endDateAccessibleName!: string | null;\n\n  @Output() monthSelected: EventEmitter<Date> = new EventEmitter<Date>();\n  @Output() yearSelected: EventEmitter<Date> = new EventEmitter<Date>();\n  @Output() activeDateChange = new EventEmitter<DateSelectionEvent<number>>();\n  @Output() userDragDrop = new EventEmitter<DateSelectionEvent<DateRange>>();\n  @Output() selectedChange: EventEmitter<Date | null> = new EventEmitter<Date | null>();\n  @Output() userSelection: EventEmitter<DateSelectionEvent<Date | null>> = new EventEmitter<DateSelectionEvent<Date | null>>();\n  @Output() calendarClose: EventEmitter<any> = new EventEmitter<any>();\n\n  public isButtonHidden = true;\n\n  public activeDateView: activeDateView = 'month';\n\n  public activeDrag: DateSelectionEvent<Date> | null = null;\n\n  private _activeDate!: Date;\n  private _minDate!: Date | null;\n  private _maxDate!: Date | null;\n  private _selected!: DateRange | Date | null;\n\n  public calendarDateViewChange(): void {\n    this.activeDateView = this.activeDateView == 'month' ? 'multi-year' : 'month';\n  }\n\n  public onCalendarDateViewKeydown(event: KeyboardEvent): void {\n    if (event.code.startsWith('Arrow')) {\n      event.preventDefault();\n    }\n\n    if (event.code === 'Enter' || event.code === 'Space') {\n      this.calendarDateViewChange();\n    }\n  }\n\n  public goToPreviousView(): void {\n    this.activeDate =\n      this.activeDateView == 'month'\n        ? this.datePickerService.addCalendarMonths(this.activeDate, -1)\n        : this.datePickerService.addCalendarYears(\n            this.activeDate,\n            this.activeDateView == 'year' ? -1 : - this.datePickerService.yearsPerPage,\n          );\n  }\n\n  public goToNextView(): void {\n    this.activeDate =\n      this.activeDateView == 'month'\n        ? this.datePickerService.addCalendarMonths(this.activeDate, 1)\n        : this.datePickerService.addCalendarYears(\n            this.activeDate,\n            this.activeDateView == 'year' ? 1 : this.datePickerService.yearsPerPage,\n          );\n  }\n\n  public onArrowKeydown(event: KeyboardEvent, direction: 'next' | 'previous'): void {\n    if (event.code.startsWith('Arrow')) {\n      event.preventDefault();\n    }\n\n    if (event.code === 'Enter' || event.code === 'Space') {\n      if (direction === 'next') {\n        this.goToNextView();\n      } else {\n        this.goToPreviousView();\n      }\n    }\n  }\n\n  public previousEnabled(): boolean {\n    if (!this.minDate) {\n      return true;\n    }\n    return (\n      !this.minDate || !this.isSameView(this.activeDate, this.minDate)\n    );\n  }\n\n  public nextEnabled(): boolean {\n    return (\n      !this.maxDate || !this.isSameView(this.activeDate, this.maxDate)\n    );\n  }\n\n  public dragStarted(event: any): void {\n    this.activeDrag = event;\n  }\n\n  /**\n   * Called when a drag completes. It may end in cancelation or in the selection\n   * of a new range.\n   */\n  public dragEnded(event: any): void {\n    if (!this.activeDrag) return;\n\n    if (event.value) {\n      this.userDragDrop.emit(event as DateSelectionEvent<DateRange>);\n    }\n\n    this.activeDrag = null;\n  }\n\n  public get viewButtonText(): string {\n    if (this.activeDateView === 'month') {\n      return this.getCurrentMonthAndYear(this.activeDate);\n    }\n\n    if (this.activeDateView === 'year') {\n        return this.getCurrentYear(this.activeDate);\n    }\n\n    return this.formatYearRange(...this.formatMinAndMaxYearLabels());\n  }\n\n  public goToDateInView(date: Date, view: 'month' | 'year' | 'multi-year'): void {\n    this.activeDate = date;\n    this.activeDateView = view;\n  }\n\n  public monthSelectedInYearView(normalizedMonth: Date): void {\n    this.monthSelected.emit(normalizedMonth);\n  }\n\n  public yearSelectedInMultiYearView(normalizedYear: Date): void {\n    this.yearSelected.emit(normalizedYear);\n  }\n\n  public dateSelected(event: any): void {\n    const date = event.value;\n\n    if (this.selected instanceof DateRange ||\n      (date && !this.datePickerService.sameDate(date, this.selected))) {\n      this.selectedChange.emit(date);\n    }\n\n    this.userSelection.emit({value: date, event });\n  }\n\n  public toggleButtonVisibility(event: FocusEvent) {\n    if (event.type === 'focusout') {\n      this.isButtonHidden = true;\n    } else if (event.type === 'focusin') {\n      this.isButtonHidden = false;\n    }\n  }\n\n  private getCurrentMonthAndYear(date: Date): string {  \n    const month = months[date.getMonth()];\n    const year = date.getFullYear();\n  \n    return `${month} ${year}`;\n  }\n\n  private getCurrentYear(date: Date): string {\n    return date.getFullYear().toString();\n  }\n\n  private formatYearRange(start: string, end: string): string {\n    return `${start} \\u2013 ${end}`;\n  }\n\n  private formatMinAndMaxYearLabels(): [minYearLabel: string, maxYearLabel: string] {\n    // The offset from the active year to the \"slot\" for the starting year is the\n    // *actual* first rendered year in the multi-year view, and the last year is\n    // just yearsPerPage - 1 away.\n    const activeYear = this.datePickerService.getYear(this.activeDate);\n    const minYearOfPage =\n      activeYear -\n      this.datePickerService.getActiveOffset(\n        this.activeDate,\n        this.minDate,\n        this.maxDate,\n      );\n    const maxYearOfPage = minYearOfPage + this.datePickerService.yearsPerPage - 1;\n    const minYearLabel = this.datePickerService.getYearName(\n      this.datePickerService.createDate(minYearOfPage, 0, 1),\n    );\n    const maxYearLabel = this.datePickerService.getYearName(\n      this.datePickerService.createDate(maxYearOfPage, 0, 1),\n    );\n\n    return [minYearLabel, maxYearLabel];\n  }\n\n  private isSameView(date1: Date, date2: Date): boolean {\n    if (this.activeDateView == 'month') {\n      return (\n        this.datePickerService.getYear(date1) == this.datePickerService.getYear(date2) &&\n        this.datePickerService.getMonth(date1) == this.datePickerService.getMonth(date2)\n      );\n    }\n    if (this.activeDateView == 'year') {\n      return this.datePickerService.getYear(date1) == this.datePickerService.getYear(date2);\n    }\n\n    // Otherwise we are in 'multi-year' view.\n    return this.datePickerService.isSameMultiYearView(\n      date1,\n      date2,\n      this.minDate,\n      this.maxDate,\n    );\n  }\n\n}\n","<div class=\"container\">\n    <div class=\"header\">\n        <span \n            tabindex=\"0\"\n            class=\"active-date-view\"\n            (click)=\"calendarDateViewChange()\"\n            (keydown)=\"onCalendarDateViewKeydown($event)\">\n                {{ viewButtonText }}\n        </span>\n\n        <div class=\"header-navigation\">\n            <div class=\"chevron-wrapper\"\n                tabindex=\"0\"\n                [class.disabled]=\"!previousEnabled()\"\n                (click)=\"goToPreviousView()\"\n                (keydown)=\"onArrowKeydown($event, 'previous')\">\n                    <span class=\"chevron left\"></span>\n            </div>\n\n            <div class=\"chevron-wrapper\" \n                tabindex=\"0\"\n                [class.disabled]=\"!nextEnabled()\"    \n                (click)=\"goToNextView()\"\n                (keydown)=\"onArrowKeydown($event, 'next')\">\n                    <span class=\"chevron right\"></span>\n            </div>\n        </div>\n    </div>\n\n    <div class=\"calendar\">\n        @switch (activeDateView) {\n            @case ('month') {\n                <ipi-calendar-month-view\n                    [(activeDate)]=\"activeDate\"\n                    [(selected)]=\"selected\"\n                    [maxDate]=\"maxDate\"\n                    [minDate]=\"minDate\"\n                    (userSelection)=\"dateSelected($event)\"\n                    (dragStarted)=\"dragStarted($event)\"\n                    (dragEnded)=\"dragEnded($event)\"\n                    [activeDrag]=\"activeDrag\">\n                </ipi-calendar-month-view>\n            }\n\n            @case ('year') {\n                <ipi-calendar-year-view\n                    [(activeDate)]=\"activeDate\"\n                    [selected]=\"selected\"\n                    [maxDate]=\"maxDate\"\n                    [minDate]=\"minDate\"\n                    (monthSelected)=\"monthSelectedInYearView($event)\"\n                    (selectedChange)=\"goToDateInView($event, 'month')\">\n                </ipi-calendar-year-view>\n            }\n\n            @case ('multi-year') {\n                <ipi-calendar-multi-year-view\n                    [(activeDate)]=\"activeDate\"\n                    [selected]=\"selected\"\n                    [maxDate]=\"maxDate\"\n                    [minDate]=\"minDate\"\n                    (yearSelected)=\"yearSelectedInMultiYearView($event)\"\n                    (selectedChange)=\"goToDateInView($event, 'year')\">\n                </ipi-calendar-multi-year-view>\n            }\n          }\n    </div>\n</div>\n\n<ipi-button\n    [ariaLabel]=\"'Button for closing the calendar.'\" \n    (clickChange)=\"calendarClose.emit($event)\" \n    (focusChange)=\"toggleButtonVisibility($event)\"\n    [class.cdk-visually-hidden]=\"isButtonHidden\">\n        Close Calendar\n</ipi-button>\n","import { Component, ChangeDetectionStrategy, ChangeDetectorRef, ElementRef, Input, NgZone, ViewChild, HostListener } from '@angular/core';\nimport { FormGroup, FormsModule } from '@angular/forms';\n\nimport { Subscription } from 'rxjs';\n\nimport { ControlErrors } from '@ipi-soft/ng-components/select';\n\nimport { OSService, MobileOS, OverlayService } from '@ipi-soft/ng-components/services';\n\nimport { IpiCalendarComponent } from './components/calendar/calendar.component';\nimport { DefaultCalendarRangeStrategy } from './datepicker-selection-strategy.component';\n\nimport { IpiDatepickerService } from './datepicker-service';\n\nexport interface DateSelectionEvent<D> {\n  value: D;\n  event: Event;\n}\n\n/** A class representing a range of dates. */\nexport class DateRange {\n  constructor(\n    readonly start: Date | null,\n    readonly end: Date | null,\n  ) {}\n}\n\nexport class DateRangeFormControls {\n  constructor(\n    readonly start: string,\n    readonly end: string,\n  ) {}\n}\n\nexport interface IpiDatepickerOptions {\n  label: string,\n  formGroup: FormGroup,\n  formControlName: string | DateRangeFormControls,\n  min?: Date;\n  max?: Date;\n  errors?: ControlErrors;\n}\n\n@Component({\n  selector: 'ipi-datepicker',\n  templateUrl: './datepicker.component.html',\n  styleUrls: ['./datepicker.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    FormsModule,\n    IpiCalendarComponent,\n  ],\n})\n\nexport class IpiDatepickerComponent {\n\n  constructor(\n    private ngZone: NgZone,\n    private osService: OSService,\n    private elementRef: ElementRef,\n    private overlayService: OverlayService,\n    private changeDetectorRef: ChangeDetectorRef,\n    private datepickerService: IpiDatepickerService,\n    private rangeSelectionStrategy: DefaultCalendarRangeStrategy,\n  ) {}\n\n  @ViewChild('datepicker') datepicker!: ElementRef<HTMLElement> | null;\n  @ViewChild('calendar') calendar!: ElementRef<HTMLElement> | null;\n\n  @Input() options!: IpiDatepickerOptions;\n\n  public get activeDate(): Date | null {\n    return this._activeDate;\n  }\n  public set activeDate(value: Date) {\n    const validDate =\n      this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(value)) ||\n      this.datepickerService.today();\n\n    this._activeDate = this.datepickerService.clampDate(validDate, this.minDate, this.maxDate);\n\n    this._activeDate = value;\n    this.shouldShowCalendar = false;\n  }\n\n  public get minDate(): Date | null {\n    return this._minDate;\n  }\n  public set minDate(value: Date | null) {\n    this._minDate = this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(value));\n  }\n\n  public get maxDate(): Date | null {\n    return this._maxDate;\n  }\n  public set maxDate(value: Date | null) {\n    this._maxDate = this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(value));\n  }\n\n  public get selectedDate(): DateRange | Date | null {\n    return this._selected;\n  }\n  public set selectedDate(value: DateRange | Date | null) {\n    if (this.options.formControlName instanceof DateRangeFormControls) {\n      if (value instanceof DateRange) {\n        this._selected = value;\n      } else {\n        this._selected = new DateRange(this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(value)), null);\n      }\n\n      this.options.formGroup.controls[this.options.formControlName.start].setValue(this._selected.start, { emitEvent: false });\n      this.options.formGroup.controls[this.options.formControlName.end].setValue(this._selected.end, { emitEvent: false });\n     } else {\n        this._selected = this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(value));\n\n        this.options.formGroup.controls[this.options.formControlName].setValue(this._selected, { emitEvent: false });\n     }\n  }\n\n  public shouldShowCalendar!: boolean;\n\n  public closeButtonFocused = false;\n\n  public formErrorMessage: string | null = null; \n\n  private errors!: ControlErrors;\n\n  private _activeDate!: Date | null;\n  private _selected!: DateRange | Date | null;\n  private _minDate: Date | null = this.options?.min ? this.options.min : null;\n  private _maxDate: Date | null = this.options?.max ? this.options.max : null;\n\n  private formControlSubscriptions: Subscription[] = [];\n\n  public ngOnInit(): void {\n    this._selected = \n      this.options.formControlName instanceof DateRangeFormControls \n      ? new DateRange(this.options.formGroup.value[this.options.formControlName.start], this.options.formGroup.value[this.options.formControlName.end])\n      : this.options.formGroup.value[this.options.formControlName];\n\n    this.maxDate = this.options.max ? this.options.max : null;\n    this.minDate = this.options.min ? this.options.min : null;\n\n    this.initDefaultErrors();\n\n    this.changeDetectorRef.detectChanges();\n\n    this.ngZone.runOutsideAngular(() => {\n      if (this.datepicker) {\n        this.datepicker.nativeElement.addEventListener('focus', () => this.activateControl());\n      }\n    });\n  }\n\n  public ngAfterViewInit(): void {\n    this.setFormSubscriptions();\n  }\n\n  public ngOnDestroy(): void {\n    if (this.datepicker) {\n      this.datepicker.nativeElement.removeEventListener('focusin', () => this.activateControl());\n    }\n\n    this.formControlSubscriptions.forEach((subscription) => subscription.unsubscribe());\n  }\n\n  public activateControl(): void {\n    if (this.calendar) {\n      return;\n    }\n\n    this.ngZone.run(() => {\n      this.shouldShowCalendar = true;\n      })\n\n      this.changeDetectorRef.markForCheck();\n  \n      setTimeout(() => { \n        this.generateCalendarPosition(this.calendar!);\n\n        this.overlayService.appendToOverlay(this.calendar!.nativeElement, true);\n\n        this.changeDetectorRef.detectChanges();\n      })\n  }\n\n  @HostListener('document:click', ['$event'])\n  onClick(event: PointerEvent): void {\n    if (!this.shouldShowCalendar) {\n      return;\n    }\n\n    if (this.datepicker) {\n      const isIputClicked = this.checkPosition(event, this.elementRef.nativeElement.getBoundingClientRect());\n\n      if (isIputClicked) {\n        this.shouldShowCalendar = isIputClicked;\n\n        if (!this.shouldShowCalendar) {\n          this.overlayService.removeFromOverlay(this.calendar!.nativeElement);\n        }\n\n        return;\n      }\n    }\n\n    if (this.calendar) {\n      const isCalendarClicked = this.checkPosition(event, this.calendar.nativeElement.getBoundingClientRect());\n\n      if (isCalendarClicked) {\n        this.ngZone.run(() => {\n          this.shouldShowCalendar = isCalendarClicked;\n        })\n  \n        if (!this.shouldShowCalendar) {\n          this.overlayService.removeFromOverlay(this.calendar!.nativeElement);\n        }\n  \n        return;\n      }\n    }\n\n    this.closeCalendar();\n\n    if (!this.shouldShowCalendar) {\n      this.overlayService.removeFromOverlay(this.calendar!.nativeElement);\n    }\n  }\n\n  public getDisplayValue(): string {\n    if (!this.selectedDate) {\n      return 'No date selected.';\n    }\n\n    if (this.selectedDate instanceof Date) {\n      return this.datepickerService.formatter.format(this.selectedDate);\n    }\n  \n    if (this.selectedDate instanceof DateRange) {\n      if (this.selectedDate.start && this.selectedDate.end) {\n        return `${this.datepickerService.formatter.format(this.selectedDate.start)} - ${this.datepickerService.formatter.format(this.selectedDate.end)}`;\n      }\n\n      if (this.selectedDate.start) {\n        return `${this.datepickerService.formatter.format(this.selectedDate.start)} - `;\n      }\n    }\n  \n    return 'No date selected.';\n  }\n\n  public getformErrorMessage(): string | null {\n    this.formErrorMessage = this.getErrorIfControlInvalid();\n\n    return this.formErrorMessage ? this.formErrorMessage : null;\n  }\n\n  public onCloseClick(): void {\n    this.closeCalendar();\n\n    if (this.datepicker) {\n      this.datepicker.nativeElement.focus();\n    }\n  }\n\n  public onCloseKeyDown(event: KeyboardEvent): void {\n    if (event.code.startsWith('Arrow') || event.code === 'Space') {\n      event.preventDefault();\n    }\n\n    if (event.code === 'Enter' || event.code === 'Space') {\n      this.closeCalendar();\n\n      if (this.datepicker) {\n        this.datepicker.nativeElement.focus();\n      }\n\n    }\n  }\n\n  public handleDragAndDropEnd(event: any): void {\n    this.selectedDate = new DateRange(event.value.start, event.value.end);\n  }\n\n  public handleUserSelection(event: DateSelectionEvent<Date | null>): void {\n    const selection = this.selectedDate;\n\n    const value = event.value;\n    const isRange = selection instanceof DateRange;\n\n    if (!value) {\n      this.selectedDate = null;\n\n      return;\n    }\n\n    if (isRange && this.rangeSelectionStrategy) {\n      const newSelection = this.rangeSelectionStrategy.selectionFinished(\n        value,\n        selection,\n      );\n\n      this.selectedDate = newSelection;\n    } else if (value && (isRange || !this.datepickerService.sameDate(value, selection))) {\n      this.selectedDate = value;\n    }\n  }\n\n  private closeCalendar(): void {\n    this.shouldShowCalendar = false;\n\n    if (this.options.formControlName instanceof DateRangeFormControls) {\n      this.options.formGroup.controls[this.options.formControlName.start].markAsTouched();\n      this.options.formGroup.controls[this.options.formControlName.end].markAsTouched();\n    } else {\n      this.options.formGroup.controls[this.options.formControlName].markAsTouched();\n    }\n\n    this.overlayService.removeFromOverlay(this.calendar!.nativeElement);\n  }\n\n  private generateCalendarPosition(calendar: ElementRef): void {\n    const calendarEl = calendar.nativeElement;\n    const elementRefRect = this.elementRef.nativeElement.getBoundingClientRect();\n\n    if (this.osService.mobileOS === MobileOS.iOS) {\n      elementRefRect.y += window.visualViewport!.offsetTop;\n      elementRefRect.x += window.visualViewport!.offsetLeft;\n    }\n\n    calendarEl.style.left = elementRefRect.x + 'px';\n    calendarEl.style.top = elementRefRect.y + elementRefRect.height + 10 + 'px';\n\n    if (window.innerHeight < calendarEl.getBoundingClientRect().bottom) {\n      calendarEl.style.top = 'unset';\n      calendarEl.style.left = elementRefRect.x + 'px';\n      calendarEl.style.bottom = window.innerHeight - elementRefRect.y + 10 + 'px';\n    }\n  }\n\n  private setFormSubscriptions(): void { \n    if (this.options.formControlName instanceof DateRangeFormControls) {\n      const startControl = this.options.formGroup.controls[this.options.formControlName.start];\n      const endControl = this.options.formGroup.controls[this.options.formControlName.end];\n\n      this.formControlSubscriptions.push(\n        startControl.valueChanges.subscribe((value) => {\n          if (value && this.selectedDate instanceof DateRange) {\n            this.selectedDate = new DateRange(\n              this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(value)),\n              this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(this.selectedDate.end))\n            )\n          }\n\n          this.changeDetectorRef.detectChanges();\n        }),\n\n        endControl.valueChanges.subscribe((value) => {\n          if (value && this.selectedDate instanceof DateRange) {\n            this.selectedDate = new DateRange(\n              this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(this.selectedDate.start)),\n              this.datepickerService.getValidDateOrNull(this.datepickerService.deserialize(value))\n            )\n\n            this.changeDetectorRef.detectChanges();\n          }\n        }),\n      );\n\n      return;\n    } else {\n      const control = this.options.formGroup.controls[this.options.formControlName];\n\n      this.formControlSubscriptions.push(\n        control.valueChanges.subscribe(() => {\n          this.selectedDate = control.value;\n\n          this.changeDetectorRef.detectChanges();\n        })\n      );\n    }\n  } \n\n  // Unified position checker for both input and calendar\n  private checkPosition(event: PointerEvent, rect: DOMRect): boolean {\n      const x = event.clientX;\n      const y = event.clientY;\n  \n      if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) {\n        return true;\n      }\n\n      return false;      \n  }\n\n  private initDefaultErrors(): void {\n    let defaultErrors: ControlErrors = {\n      required: 'This is a required field',\n    }\n\n    if (this.options.min) {\n      this.setMinValidator();\n  \n      defaultErrors['datepickerMin'] = `Start date should be before ${this.datepickerService.formatter.format(this.minDate!)}`;\n    }\n\n    if (this.options.max) {\n      this.setMaxValidator();\n\n      defaultErrors['datepickerMax'] = `End date should be before ${this.datepickerService.formatter.format(this.maxDate!)}`;\n    }\n\n    if (!this.options.errors) {\n      this.errors = defaultErrors;\n\n      return;\n    }\n\n    this.errors = {\n      ...defaultErrors,\n      ...this.options.errors\n    }\n  }\n\n  private getErrorIfControlInvalid(): string | null {\n    if (this.options.formControlName instanceof DateRangeFormControls) {\n      const startControl = this.options.formGroup.controls[this.options.formControlName.start];\n      const endControl = this.options.formGroup.controls[this.options.formControlName.end];\n\n      if (startControl.touched && startControl.invalid || endControl.touched && endControl.invalid) {\n        for (const error in this.errors) {\n          if (this.options.formGroup.controls[this.options.formControlName.start].hasError(error)) {\n\n            return this.errors[error];\n          }\n\n          if (this.options.formGroup.controls[this.options.formControlName.end].hasError(error)) {\n            return this.errors[error];\n          }\n        }\n      }\n    } else {\n      const control = this.options.formGroup.controls[this.options.formControlName];\n\n      if (control.touched && control.invalid) {\n        for (const error in this.errors) {\n          if (this.options.formGroup.controls[this.options.formControlName].hasError(error)) {\n            return this.errors[error];\n          }\n        }\n      }\n    }\n\n    return null;\n  }\n\n  private setMinValidator(): void {\n    const minValidator = this.datepickerService.minValidator(this.options.min!);\n\n    if (this.options.formControlName instanceof DateRangeFormControls) {\n      this.options.formGroup.controls[this.options.formControlName.start].addValidators(minValidator);\n    } else {\n      this.options.formGroup.controls[this.options.formControlName].addValidators(minValidator);\n    }\n  }\n\n  private setMaxValidator(): void {\n    const maxValidator = this.datepickerService.maxValidator(this.options.max!);\n  \n    if (this.options.formControlName instanceof DateRangeFormControls) {\n      this.options.formGroup.controls[this.options.formControlName.end].addValidators(maxValidator);\n    } else {\n      this.options.formGroup.controls[this.options.formControlName].addValidators(maxValidator);\n    }\n  }\n\n}\n","@if (options) {\n    @if (options.formControlName && options.formGroup) {\n        <div class=\"label-wrapper\">\n            @if (options.label !== '') {\n                <label>{{ options.label }}</label>\n             }\n        </div>\n\n        <div tabindex=\"0\" \n            #datepicker \n            class=\"datepicker\"\n            [class.datepicker-error]=\"formErrorMessage\"\n            (click)=\"this.activateControl()\">\n            <span\n                class=\"datepicker-value\"\n                role=\"textbox\" \n                aria-readonly=\"true\" \n                aria-label=\"Selected date\"\n                aria-live=\"polite\">\n                    {{ getDisplayValue() }}\n            </span>\n\n            <div class=\"svg-wrapper\">\n                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"#f1f1f1\" \n                    viewBox=\"0 0 256 256\"><path d=\"M208,32H184V24a8,8,0,0,0-16,0v8H88V24a8,8,0,0,0-16,0v8H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM72,48v8a8,8,0,0,0,16,0V48h80v8a8,8,0,0,0,16,0V48h24V80H48V48ZM208,208H48V96H208V208Zm-68-76a12,12,0,1,1-12-12A12,12,0,0,1,140,132Zm44,0a12,12,0,1,1-12-12A12,12,0,0,1,184,132ZM96,172a12,12,0,1,1-12-12A12,12,0,0,1,96,172Zm44,0a12,12,0,1,1-12-12A12,12,0,0,1,140,172Zm44,0a12,12,0,1,1-12-12A12,12,0,0,1,184,172Z\"></path>\n                </svg>\n            </div>\n        </div>\n\n        <div class=\"footer\">\n                <div>{{ getformErrorMessage() }}</div>\n        </div>\n\n        @if (shouldShowCalendar) {\n            <div #calendar class=\"calendar\">\n                <ipi-calendar\n                    [(activeDate)]=\"activeDate\"\n                    [(selected)]=\"selectedDate\"\n                    [minDate]=\"minDate\"\n                    [maxDate]=\"maxDate\"\n                    (calendarClose)=\"onCloseKeyDown($event)\"\n                    (userSelection)=\"handleUserSelection($event)\"\n                    (userDragDrop)=\"handleDragAndDropEnd($event)\">\n                </ipi-calendar>\n            </div>\n        }\n    }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.IpiDatepickerService","i2.DefaultCalendarRangeStrategy","i1","i2.IpiDatepickerService","i3.DefaultCalendarRangeStrategy"],"mappings":"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"}