@updevs/components 1.0.0-alpha.47 → 1.0.0-alpha.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -13
- package/calendar/calendar.component.d.ts +58 -122
- package/calendar/models/calendar-date.model.d.ts +10 -0
- package/calendar/models/calendar-month.model.d.ts +7 -0
- package/calendar/models/calendar-selected.model.d.ts +5 -0
- package/calendar/models/calendar-year.model.d.ts +6 -0
- package/calendar/models/date-range.model.d.ts +0 -4
- package/calendar/models/enums/calendar-view.enum.d.ts +5 -0
- package/calendar/models/public-api.d.ts +5 -0
- package/calendar/upd-calendar.module.d.ts +6 -11
- package/card/public-api.d.ts +1 -0
- package/card/types/public-api.d.ts +5 -0
- package/dropdown/dropdown.component.d.ts +3 -0
- package/esm2022/calendar/calendar.component.mjs +288 -217
- package/esm2022/calendar/models/calendar-date.model.mjs +2 -0
- package/esm2022/calendar/models/calendar-month.model.mjs +2 -0
- package/esm2022/calendar/models/calendar-selected.model.mjs +2 -0
- package/esm2022/calendar/models/calendar-year.model.mjs +2 -0
- package/esm2022/calendar/models/date-range.model.mjs +1 -1
- package/esm2022/calendar/models/enums/calendar-view.enum.mjs +7 -0
- package/esm2022/calendar/models/public-api.mjs +6 -1
- package/esm2022/calendar/upd-calendar.module.mjs +2 -20
- package/esm2022/card/public-api.mjs +2 -1
- package/esm2022/card/types/public-api.mjs +6 -0
- package/esm2022/dropdown/dropdown.component.mjs +23 -7
- package/esm2022/form-controls/date-picker/date-picker.component.mjs +45 -60
- package/esm2022/form-controls/input/input.component.mjs +3 -3
- package/esm2022/lib/models/row-column-size.mjs +1 -1
- package/esm2022/lib/tools/column-size.helper.mjs +2 -2
- package/esm2022/popover/popover.directive.mjs +10 -26
- package/esm2022/pricing-cards/index.mjs +2 -0
- package/esm2022/pricing-cards/models/price-item-feature.model.mjs +2 -0
- package/esm2022/pricing-cards/models/price-item-features-group.model.mjs +2 -0
- package/esm2022/pricing-cards/models/price-item.model.mjs +2 -0
- package/esm2022/pricing-cards/models/public-api.mjs +4 -0
- package/esm2022/pricing-cards/pricing-cards.component.mjs +24 -0
- package/esm2022/pricing-cards/public-api.mjs +4 -0
- package/esm2022/pricing-cards/upd-pricing-cards.module.mjs +36 -0
- package/esm2022/pricing-cards/updevs-components-pricing-cards.mjs +5 -0
- package/esm2022/table/abstractions/base.column.mjs +30 -44
- package/esm2022/table/table.component.mjs +9 -12
- package/fesm2022/updevs-components-calendar.mjs +319 -1449
- package/fesm2022/updevs-components-calendar.mjs.map +1 -1
- package/fesm2022/updevs-components-dropdown.mjs +22 -6
- package/fesm2022/updevs-components-dropdown.mjs.map +1 -1
- package/fesm2022/updevs-components-form-controls-date-picker.mjs +44 -59
- package/fesm2022/updevs-components-form-controls-date-picker.mjs.map +1 -1
- package/fesm2022/updevs-components-form-controls-input.mjs +2 -2
- package/fesm2022/updevs-components-form-controls-input.mjs.map +1 -1
- package/fesm2022/updevs-components-popover.mjs +9 -25
- package/fesm2022/updevs-components-popover.mjs.map +1 -1
- package/fesm2022/updevs-components-pricing-cards.mjs +64 -0
- package/fesm2022/updevs-components-pricing-cards.mjs.map +1 -0
- package/fesm2022/updevs-components-table.mjs +38 -55
- package/fesm2022/updevs-components-table.mjs.map +1 -1
- package/fesm2022/updevs-components.mjs +1 -1
- package/fesm2022/updevs-components.mjs.map +1 -1
- package/form-controls/date-picker/date-picker.component.d.ts +10 -31
- package/lib/models/row-column-size.d.ts +5 -9
- package/package.json +36 -30
- package/pricing-cards/index.d.ts +1 -0
- package/pricing-cards/models/price-item-feature.model.d.ts +5 -0
- package/pricing-cards/models/price-item-features-group.model.d.ts +5 -0
- package/pricing-cards/models/price-item.model.d.ts +19 -0
- package/pricing-cards/models/public-api.d.ts +3 -0
- package/pricing-cards/pricing-cards.component.d.ts +11 -0
- package/pricing-cards/public-api.d.ts +3 -0
- package/pricing-cards/upd-pricing-cards.module.d.ts +11 -0
- package/table/abstractions/base.column.d.ts +4 -0
- package/calendar/components/calendar-body/calendar-body.component.d.ts +0 -263
- package/calendar/components/calendar-header/calendar-header.component.d.ts +0 -57
- package/calendar/components/calendar-month-view/calendar-month-view.component.d.ts +0 -151
- package/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +0 -10
- package/calendar/components/calendar-year-view/calendar-year-view.component.d.ts +0 -9
- package/calendar/models/calendar-cell.model.d.ts +0 -16
- package/calendar/services/calendar.service.d.ts +0 -15
- package/calendar/tools/events-options.d.ts +0 -12
- package/calendar/tools/keyboard-tools.d.ts +0 -9
- package/calendar/tools/passive-listeners.d.ts +0 -16
- package/calendar/types/calendar-cell-class-function.type.d.ts +0 -3
- package/calendar/types/calendar-cell-css-classes.type.d.ts +0 -3
- package/calendar/types/modifier-key.type.d.ts +0 -1
- package/esm2022/calendar/components/calendar-body/calendar-body.component.mjs +0 -515
- package/esm2022/calendar/components/calendar-header/calendar-header.component.mjs +0 -144
- package/esm2022/calendar/components/calendar-month-view/calendar-month-view.component.mjs +0 -423
- package/esm2022/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -18
- package/esm2022/calendar/components/calendar-year-view/calendar-year-view.component.mjs +0 -17
- package/esm2022/calendar/models/calendar-cell.model.mjs +0 -18
- package/esm2022/calendar/services/calendar.service.mjs +0 -40
- package/esm2022/calendar/tools/events-options.mjs +0 -14
- package/esm2022/calendar/tools/keyboard-tools.mjs +0 -14
- package/esm2022/calendar/tools/passive-listeners.mjs +0 -29
- package/esm2022/calendar/types/calendar-cell-class-function.type.mjs +0 -2
- package/esm2022/calendar/types/calendar-cell-css-classes.type.mjs +0 -2
- package/esm2022/calendar/types/modifier-key.type.mjs +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updevs-components-calendar.mjs","sources":["../../../../libs/components/calendar/src/models/date-range.model.ts","../../../../libs/components/calendar/src/services/calendar-range-strategy.service.ts","../../../../libs/components/calendar/src/tools/passive-listeners.ts","../../../../libs/components/calendar/src/tools/events-options.ts","../../../../libs/components/calendar/src/services/calendar-signals.service.ts","../../../../libs/components/calendar/src/components/calendar-body/calendar-body.component.ts","../../../../libs/components/calendar/src/components/calendar-body/calendar-body.component.html","../../../../libs/components/calendar/src/models/calendar-cell.model.ts","../../../../libs/components/calendar/src/tools/keyboard-tools.ts","../../../../libs/components/calendar/src/components/calendar-multi-year-view/calendar-multi-year-view.component.ts","../../../../libs/components/calendar/src/components/calendar-multi-year-view/calendar-multi-year-view.component.html","../../../../libs/components/calendar/src/services/calendar.service.ts","../../../../libs/components/calendar/src/components/calendar-header/calendar-header.component.ts","../../../../libs/components/calendar/src/components/calendar-header/calendar-header.component.html","../../../../libs/components/calendar/src/components/calendar-month-view/calendar-month-view.component.ts","../../../../libs/components/calendar/src/components/calendar-month-view/calendar-month-view.component.html","../../../../libs/components/calendar/src/components/calendar-year-view/calendar-year-view.component.ts","../../../../libs/components/calendar/src/components/calendar-year-view/calendar-year-view.component.html","../../../../libs/components/calendar/src/calendar.component.ts","../../../../libs/components/calendar/src/calendar.component.html","../../../../libs/components/calendar/src/upd-calendar.module.ts","../../../../libs/components/calendar/src/updevs-components-calendar.ts"],"sourcesContent":["/**\n * A class representing a range of dates.\n */\nexport class DateRangeModel {\n /**\n * Ensures that objects with a `start` and `end` property can't be assigned to a variable that\n * expects a `DateRange`\n */// @ts-ignore\n private disableStructuralEquivalency: never;\n\n constructor(\n /**\n * The start date of the range.\n */\n readonly start?: Date,\n /**\n * The end date of the range.\n */\n readonly end?: Date\n ) {\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { DateService } from '@updevs/sdk/core';\nimport { OptionalType } from '@updevs/sdk/types';\n\nimport { DateRangeModel } from '../models/date-range.model';\n\n/**\n * Provides the default date range selection behavior.\n */\n@Injectable()\nexport class CalendarRangeStrategyService {\n private readonly dateService = inject(DateService);\n\n /**\n * Called when the user has finished selecting a value.\n * @param date Date that was selected. Will be null if the user cleared the selection.\n * @param currentRange Range that is currently show in the calendar.\n */\n selectionFinished(date: OptionalType<Date>, currentRange: DateRangeModel): DateRangeModel {\n let { start, end } = currentRange;\n\n if (start === undefined) {\n start = date;\n } else if (end === undefined && date && this.dateService.compare(date, start) >= 0) {\n end = date;\n } else {\n start = date;\n end = undefined;\n }\n\n return new DateRangeModel(start, end);\n }\n\n /**\n * Called when the user has activated a new date (e.g. by hovering over\n * it or moving focus) and the calendar tries to display a date range.\n *\n * @param activeDate Date that the user has activated. Will be null if the user moved\n * focus to an element that's no a calendar cell.\n * @param currentRange Range that is currently shown in the calendar.\n */\n createPreview(activeDate: OptionalType<Date>, currentRange: DateRangeModel): DateRangeModel {\n let start: OptionalType<Date>;\n let end: OptionalType<Date>;\n\n if (!!currentRange.start && !currentRange.end && !!activeDate) {\n start = currentRange.start;\n end = activeDate;\n }\n\n return new DateRangeModel(start, end);\n }\n\n /**\n * Called when the user has dragged a date in the currently selected range to another\n * date. Returns the date updated range that should result from this interaction.\n *\n * @param dragOrigin The date the user started dragging from.\n * @param originalRange The originally selected date range.\n * @param newDate The currently targeted date in the drag operation.\n */\n createDrag(dragOrigin: Date, originalRange: DateRangeModel, newDate: Date): OptionalType<DateRangeModel> {\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 undefined;\n }\n\n const isRange = this.dateService.compare(start, end) !== 0;\n const diffYears = newDate.getFullYear() - dragOrigin.getFullYear();\n const diffMonths = newDate.getMonth() - dragOrigin.getMonth();\n const diffDays = newDate.getDate() - dragOrigin.getDate();\n\n if (isRange && this.dateService.areEqual(dragOrigin, originalRange.start)) {\n start = newDate;\n\n if (this.dateService.compare(newDate, end) > 0) {\n end = this.dateService.addYears(end, diffYears);\n end = this.dateService.addMonths(end, diffMonths);\n end = this.dateService.addDays(end, diffDays);\n }\n } else if (isRange && this.dateService.areEqual(dragOrigin, originalRange.end)) {\n end = newDate;\n\n if (this.dateService.compare(newDate, start) < 0) {\n start = this.dateService.addYears(start, diffYears);\n start = this.dateService.addMonths(start, diffMonths);\n start = this.dateService.addDays(start, diffDays);\n }\n } else {\n start = this.dateService.addYears(start, diffYears);\n start = this.dateService.addMonths(start, diffMonths);\n start = this.dateService.addDays(start, diffDays);\n end = this.dateService.addYears(end, diffYears);\n end = this.dateService.addMonths(end, diffMonths);\n end = this.dateService.addDays(end, diffDays);\n }\n\n return new DateRangeModel(start, end);\n }\n}\n","export class PassiveListeners {\n /** Cached result of whether the user's browser supports passive event listeners. */\n private static supportsPassiveEvents?: boolean;\n\n /**\n * Checks whether the user's browser supports passive event listeners.\n * See: https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n */\n static supportsPassiveEventListeners(): boolean {\n if (this.supportsPassiveEvents === undefined && typeof window !== 'undefined') {\n try {\n window.addEventListener(\n 'test',\n undefined!,\n Object.defineProperty({}, 'passive', {\n get: () => (this.supportsPassiveEvents = true)\n })\n );\n } finally {\n this.supportsPassiveEvents = this.supportsPassiveEvents || false;\n }\n }\n\n return this.supportsPassiveEvents!;\n }\n\n /**\n * Normalizes an `AddEventListener` object to something that can be passed\n * to `addEventListener` on any browser, no matter whether it supports the\n * `options` parameter.\n * @param options Object to be normalized.\n */\n static normalizePassiveListenerOptions(options: AddEventListenerOptions): AddEventListenerOptions | boolean {\n return this.supportsPassiveEventListeners() ? options : !!options.capture;\n }\n}\n","import { PassiveListeners } from './passive-listeners';\n\n/**\n * Event options that can be used to bind an active, capturing event.\n */\nexport const activeCapturingEventOptions = PassiveListeners.normalizePassiveListenerOptions({ passive: false, capture: true });\n\n/**\n * Event options that can be used to bind a passive, capturing event.\n */\nexport const passiveCapturingEventOptions = PassiveListeners.normalizePassiveListenerOptions({ passive: true, capture: true });\n\n/**\n * Event options that can be used to bind a passive, non-capturing event.\n */\nexport const passiveEventOptions = PassiveListeners.normalizePassiveListenerOptions({ passive: true });\n","import { Injectable, signal, Signal } from '@angular/core';\nimport { OptionalType } from '@updevs/sdk/types';\n\nimport { CalendarViewType } from '../types/calendar-view.type';\nimport { DateRangeModel } from '../models/date-range.model';\n\n@Injectable()\nexport class CalendarSignalsService {\n get minDate(): Signal<OptionalType<Date>> {\n return this.minDateSignal.asReadonly();\n }\n set minDate(value: OptionalType<Date>) {\n this.minDateSignal.set(value);\n }\n get maxDate(): Signal<OptionalType<Date>> {\n return this.maxDateSignal.asReadonly();\n }\n set maxDate(value: OptionalType<Date>) {\n this.maxDateSignal.set(value);\n }\n get activeDate(): Signal<Date> {\n return this.activeDateSignal.asReadonly();\n }\n set activeDate(value: Date) {\n this.activeDateSignal.set(value);\n }\n get selectedDate(): Signal<DateRangeModel | OptionalType<Date>> {\n return this.selectedDateSignal.asReadonly();\n }\n set selectedDate(value: OptionalType<DateRangeModel | OptionalType<Date>>) {\n this.selectedDateSignal.set(value);\n }\n get currentView(): Signal<CalendarViewType> {\n return this.currentViewSignal.asReadonly();\n }\n set currentView(value: CalendarViewType) {\n this.currentViewSignal.set(value);\n }\n\n private readonly minDateSignal = signal<OptionalType<Date>>(undefined);\n private readonly maxDateSignal = signal<OptionalType<Date>>(undefined);\n private readonly activeDateSignal = signal<Date>(new Date());\n private readonly selectedDateSignal = signal<DateRangeModel | OptionalType<Date>>(undefined);\n private readonly currentViewSignal = signal<CalendarViewType>('month');\n}\n","import {\n Component,\n EventEmitter,\n Injector,\n Input,\n Output,\n SimpleChanges,\n inject,\n OnChanges,\n AfterViewChecked,\n OnDestroy,\n ElementRef,\n NgZone,\n afterNextRender\n} from '@angular/core';\nimport { OptionalType } from '@updevs/sdk/types';\nimport { DateService } from '@updevs/sdk/core';\n\nimport { CalendarCellModel } from '../../models/calendar-cell.model';\nimport { CalendarUserEventModel } from '../../models/calendar-user-event.model';\nimport { activeCapturingEventOptions, passiveCapturingEventOptions, passiveEventOptions } from '../../tools/events-options';\nimport { CalendarSignalsService } from '../../services/calendar-signals.service';\n\nlet calendarBodyId = 1;\n\n@Component({\n selector: 'upd-calendar-body',\n templateUrl: './calendar-body.component.html',\n styleUrl: './calendar-body.component.scss'\n})\nexport class CalendarBodyComponent implements OnChanges, AfterViewChecked, OnDestroy {\n /**\n * The label for the table. (e.g. \"Jan 2017\").\n */\n @Input() label!: string;\n\n /**\n * The cells to display in the table.\n */\n @Input() rows!: CalendarCellModel[][];\n\n /**\n * The value in the table that corresponds to today.\n */\n @Input() todayValue?: number;\n\n /**\n * Start value of the selected date range.\n */\n @Input() startValue?: number;\n\n /**\n * End value of the selected date range.\n */\n @Input() endValue?: number;\n\n /**\n * The minimum number of free cells needed to fit the label in the first row.\n */\n @Input() labelMinRequiredCells!: number;\n\n /**\n * The number of columns in the table.\n */\n @Input() numCols = 7;\n\n /**\n * The cell number of the active cell in the table.\n */\n @Input() activeCell = 0;\n\n /**\n * Whether a range is being selected.\n */\n @Input() isRange = 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 = 1;\n\n /**\n * Start of the comparison range.\n */\n @Input() comparisonStart?: number;\n\n /**\n * End of the comparison range.\n */\n @Input() comparisonEnd?: number;\n\n /**\n * Start of the preview range.\n */\n @Input() previewStart?: number;\n\n /**\n * End of the preview range.\n */\n @Input() previewEnd?: number;\n\n /**\n * ARIA Accessible name of the `<input updStartDate/>`\n */\n @Input() startDateAccessibleName?: string;\n\n /**\n * ARIA Accessible name of the `<input updEndDate/>`\n */\n @Input() endDateAccessibleName?: string;\n\n /**\n * Emits when a new value is selected.\n */\n @Output() readonly selectedValueChange = new EventEmitter<CalendarUserEventModel<number>>();\n\n /**\n * Emits when the preview has changed as a result of a user action.\n */\n @Output() readonly previewChange = new EventEmitter<CalendarUserEventModel<OptionalType<CalendarCellModel>>>();\n\n /**\n * Emits the date at the possible start of a drag event.\n */\n @Output() readonly dragStarted = new EventEmitter<CalendarUserEventModel<Date>>();\n\n /**\n * Emits the date at the conclusion of a drag, or null if mouse was not released on a date.\n */\n @Output() readonly dragEnded = new EventEmitter<CalendarUserEventModel<OptionalType<Date>>>();\n\n /**\n * The number of blank cells to put at the beginning for the first row.\n */\n firstRowOffset!: number;\n\n /**\n * Padding for the individual date cells.\n */\n cellPadding!: string;\n\n /**\n * Width of an individual cell.\n */\n cellWidth!: string;\n\n hoveredDate?: string;\n\n get startDateLabelId(): string {\n return `${this.id}-start-date`;\n }\n get endDateLabelId(): string {\n return `${this.id}-end-date`;\n }\n get colspanClass(): string {\n return `col-${this.firstRowOffset}`;\n }\n\n private didDragSinceMouseDown = false;\n private id = `upd-calendar-body-${calendarBodyId++}`;\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 * Used to focus the active cell after change detection has run.\n */\n private focusActiveCellAfterViewChecked = false;\n\n private readonly injector = inject(Injector);\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly ngZone = inject(NgZone);\n private readonly calendarSignalsService = inject(CalendarSignalsService);\n private readonly dateService = inject(DateService);\n\n constructor() {\n this.ngZone.runOutsideAngular(() => {\n const element = this.elementRef.nativeElement;\n\n // `touchmove` is active since we need to call `preventDefault`.\n element.addEventListener('touchmove', this.touchmoveHandler, activeCapturingEventOptions);\n element.addEventListener('mouseenter', this.enterHandler, passiveCapturingEventOptions);\n element.addEventListener('focus', this.enterHandler, passiveCapturingEventOptions);\n element.addEventListener('mouseleave', this.leaveHandler, passiveCapturingEventOptions);\n element.addEventListener('blur', this.leaveHandler, passiveCapturingEventOptions);\n element.addEventListener('mousedown', this.mousedownHandler, passiveEventOptions);\n element.addEventListener('touchstart', this.mousedownHandler, passiveEventOptions);\n window.addEventListener('mouseup', this.mouseupHandler);\n window.addEventListener('touchend', this.touchendHandler);\n });\n }\n\n ngAfterViewChecked(): void {\n if (this.focusActiveCellAfterViewChecked) {\n this.focusActiveCell();\n this.focusActiveCellAfterViewChecked = false;\n }\n }\n\n 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 ngOnDestroy(): void {\n const element = this.elementRef.nativeElement;\n\n element.removeEventListener('touchmove', this.touchmoveHandler, activeCapturingEventOptions);\n element.removeEventListener('mouseenter', this.enterHandler, passiveCapturingEventOptions);\n element.removeEventListener('focus', this.enterHandler, passiveCapturingEventOptions);\n element.removeEventListener('mouseleave', this.leaveHandler, passiveCapturingEventOptions);\n element.removeEventListener('blur', this.leaveHandler, passiveCapturingEventOptions);\n element.removeEventListener('mousedown', this.mousedownHandler, passiveEventOptions);\n element.removeEventListener('touchstart', this.mousedownHandler, passiveEventOptions);\n window.removeEventListener('mouseup', this.mouseupHandler);\n window.removeEventListener('touchend', this.touchendHandler);\n }\n\n getIndex(colIndex: number, rowIndex: number): string {\n return `${colIndex}${rowIndex}`;\n }\n\n onDateEnter(index: string): void {\n this.hoveredDate = index;\n }\n\n onDateLeave(): void {\n this.hoveredDate = undefined;\n }\n\n /**\n * Tracking function for rows based on their identity. Ideally we would use some sort of\n * key on the row, but that would require a breaking change for the `rows` input. We don't\n * use the built-in identity tracking, because it logs warnings.\n */\n trackRow = (row: CalendarCellModel[]) => row;\n\n /**\n * Called when a cell is clicked.\n * @param cell\n * @param event\n */\n cellClicked(cell: CalendarCellModel, event: MouseEvent): void {\n // Ignore \"clicks\" that are actually canceled drags (eg the user dragged off and then went back to this cell to undo).\n if (this.didDragSinceMouseDown) {\n return;\n }\n\n if (cell.isEnabled) {\n this.selectedValueChange.emit({ value: cell.value, event });\n }\n }\n\n emitActiveDateChange(cell: CalendarCellModel): void {\n if (cell.isEnabled) {\n const month = cell.value;\n const oldActiveDate = this.calendarSignalsService.activeDate();\n const tempDate = this.getDateFromDayOfMonth(oldActiveDate, month);\n\n if (this.dateService.compare(oldActiveDate, tempDate)) {\n this.calendarSignalsService.activeDate = tempDate;\n }\n }\n }\n\n /**\n * Returns whether a cell should be marked as selected.\n * @param value\n */\n isSelected(value: number): boolean {\n return this.startValue === value || this.endValue === value;\n }\n\n /**\n * Returns whether a cell is active.\n * @param rowIndex\n * @param colIndex\n */\n 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 /**\n * Focuses the active cell after the microtask queue is empty.\n *\n * Adding a 0ms setTimeout seems to fix Voiceover losing focus when pressing PageUp/PageDown\n * (issue #24330).\n *\n * Determined a 0ms by gradually increasing duration from 0 and testing two use cases with screen\n * reader enabled:\n *\n * 1. Pressing PageUp/PageDown repeatedly with pausing between each key press.\n * 2. Pressing and holding the PageDown key with repeated keys enabled.\n *\n * Test 1 worked roughly 95-99% of the time with 0ms and got a little bit better as the duration\n * increased. Test 2 got slightly better until the duration was long enough to interfere with\n * repeated keys. If the repeated key speed was faster than the timeout duration, then pressing\n * and holding pagedown caused the entire page to scroll.\n *\n * Since repeated key speed can verify across machines, determined that any duration could\n * potentially interfere with repeated keys. 0ms would be best because it almost entirely\n * eliminates the focus being lost in Voiceover (#24330) without causing unintended side effects.\n * Adding delay also complicates writing tests.\n */\n focusActiveCell(movePreview = true): void {\n afterNextRender(\n () => {\n setTimeout(() => {\n const activeCell = this.elementRef.nativeElement.querySelector('.upd-calendar-body-active');\n\n if (!!activeCell) {\n if (!movePreview) {\n this.skipNextFocus = true;\n }\n\n activeCell.focus();\n }\n });\n },\n { injector: this.injector }\n );\n }\n\n /**\n * Focuses the active cell after change detection has run and the microtask queue is empty.\n */\n scheduleFocusActiveCellAfterViewChecked(): void {\n this.focusActiveCellAfterViewChecked = true;\n }\n\n /**\n * Gets whether a value is the start of the main range.\n * @param value\n */\n 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 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 isInRange(value: number): boolean {\n return this.isInsideRange(value, this.startValue, this.endValue, this.isRange);\n }\n\n /** Gets whether a value is the start of the comparison range. */\n isComparisonStart(value: number): boolean {\n return this.isStart(value, this.comparisonStart, this.comparisonEnd);\n }\n\n /** Whether the cell is a start bridge cell between the main and comparison ranges. */\n isComparisonBridgeStart(value: number, rowIndex: number, colIndex: number) {\n if (!this.isComparisonStart(value) || this.isRangeStart(value) || !this.isInRange(value)) {\n return false;\n }\n\n let previousCell: CalendarCellModel | undefined = this.rows[rowIndex][colIndex - 1];\n\n if (!previousCell) {\n const previousRow = this.rows[rowIndex - 1];\n previousCell = previousRow && previousRow[previousRow.length - 1];\n }\n\n return previousCell && !this.isRangeEnd(previousCell.compareValue);\n }\n\n /** Whether the cell is an end bridge cell between the main and comparison ranges. */\n isComparisonBridgeEnd(value: number, rowIndex: number, colIndex: number) {\n if (!this.isComparisonEnd(value) || this.isRangeEnd(value) || !this.isInRange(value)) {\n return false;\n }\n\n let nextCell: CalendarCellModel | undefined = this.rows[rowIndex][colIndex + 1];\n\n if (!nextCell) {\n const nextRow = this.rows[rowIndex + 1];\n nextCell = nextRow && nextRow[0];\n }\n\n return nextCell && !this.isRangeStart(nextCell.compareValue);\n }\n\n /** Gets whether a value is the end of the comparison range. */\n isComparisonEnd(value: number) {\n return this.isEnd(value, this.comparisonStart, this.comparisonEnd);\n }\n\n /** Gets whether a value is within the current comparison range. */\n isInComparisonRange(value: number) {\n return this.isInsideRange(value, this.comparisonStart, this.comparisonEnd, this.isRange);\n }\n\n /**\n * Gets whether a value is the same as the start and end of the comparison range.\n * For context, the functions that we use to determine whether something is the start/end of\n * a range don't allow for the start and end to be on the same day, because we'd have to use\n * much more specific CSS selectors to style them correctly in all scenarios. This is fine for\n * the regular range, because when it happens, the selected styles take over and still show where\n * the range would've been, however we don't have these selected styles for a comparison range.\n * This function is used to apply a class that serves the same purpose as the one for selected\n * dates, but it only applies in the context of a comparison range.\n */\n isComparisonIdentical(value: number) {\n // Note that we don't need to null check the start/end\n // here, because the `value` will always be defined.\n return this.comparisonStart === this.comparisonEnd && value === this.comparisonStart;\n }\n\n /** Gets whether a value is the start of the preview range. */\n isPreviewStart(value: number) {\n return this.isStart(value, this.previewStart, this.previewEnd);\n }\n\n /** Gets whether a value is the end of the preview range. */\n isPreviewEnd(value: number) {\n return this.isEnd(value, this.previewStart, this.previewEnd);\n }\n\n /** Gets whether a value is inside the preview range. */\n isInPreview(value: number) {\n // console.log('is in range', this.isInsideRange(value, this.previewStart, this.previewEnd, this.isRange));\n return this.isInsideRange(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 getDescribedby(value: number): OptionalType<string> {\n if (!this.isRange) {\n return undefined;\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 undefined;\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) {\n this.ngZone.run(() => this.previewChange.emit({ value: cell.isEnabled ? cell : undefined, event }));\n }\n }\n };\n\n private touchmoveHandler = (event: TouchEvent) => {\n if (!this.isRange) {\n return;\n }\n\n const target = this.getActualTouchTarget(event);\n const cell = target ? this.getCellFromElement(target as HTMLElement) : undefined;\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?.isEnabled ? cell : undefined, 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 !== undefined && this.isRange) {\n if (event.type !== 'blur') {\n this.didDragSinceMouseDown = true;\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 this.getCellFromElement(event.target as HTMLElement) &&\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: undefined, event }));\n }\n }\n };\n\n /**\n * Triggered on mousedown or touchstart on a date cell.\n * Responsible for starting a drag sequence.\n */\n private mousedownHandler = (event: Event) => {\n if (!this.isRange) {\n return;\n }\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.isInRange(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. Responsible for ending a drag sequence. */\n private mouseupHandler = (event: Event) => {\n if (!this.isRange) {\n return;\n }\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: undefined, event });\n });\n return;\n }\n\n if (cellElement.closest('.upd-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 this.dragEnded.emit({ value: cell?.rawValue ?? undefined, 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): OptionalType<CalendarCellModel> {\n const cell = this.getCellElement(element);\n\n if (!!cell) {\n const row = cell.getAttribute('data-upd-row');\n const col = cell.getAttribute('data-upd-col');\n\n if (row && col) {\n return this.rows[parseInt(row, 10)][parseInt(col, 10)];\n }\n }\n\n return undefined;\n }\n\n /** Checks whether a node is a table cell element. */\n private isTableCell(node: OptionalType<Node>): node is HTMLTableCellElement {\n return node?.nodeName === 'DIV';\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): OptionalType<HTMLElement> {\n let cell: OptionalType<HTMLElement>;\n\n if (this.isTableCell(element)) {\n cell = element;\n } else if (this.isTableCell(element.parentNode || undefined)) {\n cell = element.parentNode as HTMLElement;\n } else if (this.isTableCell(element.parentNode?.parentNode || undefined)) {\n cell = element.parentNode!.parentNode as HTMLElement;\n }\n\n return cell?.getAttribute('data-upd-row') !== undefined ? cell : undefined;\n }\n\n /** Checks whether a value is the start of a range. */\n private isStart(value: number, start: OptionalType<number>, end: OptionalType<number>): boolean {\n return end !== undefined && 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: OptionalType<number>, end: OptionalType<number>): boolean {\n return start !== undefined && start !== end && value >= start && value === end;\n }\n\n /** Checks whether a value is inside of a range. */\n private isInsideRange(value: number, start: OptionalType<number>, end: OptionalType<number>, rangeEnabled: boolean): boolean {\n return (rangeEnabled && start !== undefined && end !== undefined && start !== end && value >= start && value <= end);\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 * Takes a day of the month and returns a new date in the same month and year as the currently\n * active date. The returned date will have the same day of the month as the argument date.\n */\n private getDateFromDayOfMonth(activeDate: Date, dayOfMonth: number): Date {\n return this.dateService.create(activeDate.getFullYear(), activeDate.getMonth(), dayOfMonth);\n }\n}\n","<div class=\"container\">\n <!--\n If there's not enough space in the first row, create a separate label row. We mark this row as\n aria-hidden because we don't want it to be read out as one of the weeks in the month.\n -->\n @if (firstRowOffset < labelMinRequiredCells) {\n <div class=\"row seven-cols\" aria-hidden=\"true\">\n <div class=\"col-7 p-1 d-flex align-items-center\" [style.min-height.px]=\"40\">\n {{ label }}\n </div>\n </div>\n }\n\n <!-- Create the first row separately so we can include a special spacer cell. -->\n @for (row of rows; track trackRow(row); let rowIndex = $index) {\n <div class=\"row seven-cols\">\n <!--\n This cell is purely decorative, but we can't put `aria-hidden` or `role=\"presentation\"` on it,\n because it throws off the week days for the rest of the row on NVDA. The aspect ratio of the\n table cells is maintained by setting the top and bottom padding as a percentage of the width\n (a variant of the trick described here: https://www.w3schools.com/howto/howto_css_aspect_ratio.asp).\n -->\n @if (rowIndex === 0 && firstRowOffset) {\n <div [ngClass]=\"colspanClass\" class=\"p-1 d-flex align-items-center\" [style.min-height.px]=\"40\">\n {{ firstRowOffset >= labelMinRequiredCells ? label : '' }}\n </div>\n }\n\n <!--\n Each gridcell in the calendar contains a button, which signals to assistive technology that the\n cell is interactable, as well as the selection state via `aria-pressed`. See #23476 for\n background.\n -->\n @for (item of row; track item.id; let colIndex = $index) {\n <div class=\"col-1 justify-content-center p-1 d-flex align-items-center cursor-pointer\" [attr.data-upd-row]=\"rowIndex\"\n [attr.data-upd-col]=\"colIndex\" [style.min-height.px]=\"40\"\n [class.bg-secondary-lt]=\"hoveredDate === getIndex(rowIndex, colIndex)\" [class.border]=\"isActiveCell(rowIndex, colIndex)\"\n [class.border-secondary]=\"isActiveCell(rowIndex, colIndex)\" [class.bg-azure]=\"isSelected(item.compareValue)\"\n [class.text-azure-fg]=\"isSelected(item.compareValue)\" [tabindex]=\"isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [class.upd-calendar-body-disabled]=\"!item.isEnabled\" [class.bg-danger]=\"isRangeStart(item.compareValue)\"\n [class.text-danger-fg]=\"isRangeStart(item.compareValue)\" [class.bg-muted]=\"isRangeEnd(item.compareValue)\"\n [class.text-muted-fg]=\"isRangeEnd(item.compareValue)\"\n [class.upd-calendar-body-range-end]=\"isRangeEnd(item.compareValue)\"\n [class.upd-calendar-body-in-range]=\"isInRange(item.compareValue)\"\n [class.upd-calendar-body-comparison-bridge-start]=\"isComparisonBridgeStart(item.compareValue, rowIndex, colIndex)\"\n [class.upd-calendar-body-comparison-bridge-end]=\"isComparisonBridgeEnd(item.compareValue, rowIndex, colIndex)\"\n [class.upd-calendar-body-comparison-start]=\"isComparisonStart(item.compareValue)\"\n [class.upd-calendar-body-comparison-end]=\"isComparisonEnd(item.compareValue)\"\n [class.upd-calendar-body-in-comparison-range]=\"isInComparisonRange(item.compareValue)\"\n [class.rounded-start]=\"isPreviewStart(item.compareValue)\" [class.rounded-end]=\"isPreviewEnd(item.compareValue)\"\n [class.border-top]=\"isInPreview(item.compareValue)\" [class.fw-bold]=\"isInPreview(item.compareValue)\"\n [class.border-bottom]=\"isInPreview(item.compareValue)\" [class.border-secondary-lt]=\"isInPreview(item.compareValue)\"\n [attr.aria-label]=\"item.ariaLabel\" [attr.aria-disabled]=\"!item.isEnabled || undefined\"\n [attr.aria-pressed]=\"isSelected(item.compareValue)\"\n [attr.aria-current]=\"todayValue === item.compareValue ? 'date' : undefined\"\n [attr.aria-describedby]=\"getDescribedby(item.compareValue)\" (click)=\"cellClicked(item, $event)\"\n (focus)=\"emitActiveDateChange(item)\" (mouseenter)=\"onDateEnter(getIndex(rowIndex, colIndex))\"\n (mouseleave)=\"onDateLeave()\">\n <span [class.upd-calendar-body-selected]=\"isSelected(item.compareValue)\"\n [class.upd-calendar-body-comparison-identical]=\"isComparisonIdentical(item.compareValue)\"\n [class.upd-calendar-body-today]=\"todayValue === item.compareValue\">\n {{ item.displayValue }}\n </span>\n </div>\n }\n </div>\n }\n\n <label [id]=\"startDateLabelId\" class=\"upd-calendar-body-hidden-label\">\n {{ startDateAccessibleName }}\n </label>\n <label [id]=\"endDateLabelId\" class=\"upd-calendar-body-hidden-label\">\n {{ endDateAccessibleName }}\n </label>\n</div>\n","import { CalendarCellCssClassesType } from '../types/calendar-cell-css-classes.type';\n\nlet uniqueIdCounter = 0;\n\n/**\n * An internal class that represents the data corresponding to a single calendar cell.\n * @docs-private\n */\nexport class CalendarCellModel {\n readonly id = uniqueIdCounter++;\n\n constructor(\n public value: number,\n public displayValue: string,\n public ariaLabel: string,\n public isEnabled: boolean,\n public cssClasses: CalendarCellCssClassesType = {},\n public compareValue = value,\n public rawValue?: Date\n ) {\n }\n}\n","import { ModifierKeyType } from '../types/modifier-key.type';\n\nexport class KeyboardTools {\n /**\n * Checks whether a modifier key is pressed.\n * @param event Event to be checked.\n * @param modifiers\n */\n static hasModifierKey(event: KeyboardEvent, ...modifiers: ModifierKeyType[]): boolean {\n if (modifiers.length) {\n return modifiers.some(modifier => event[modifier]);\n }\n\n return event.altKey || event.shiftKey || event.ctrlKey || event.metaKey;\n }\n}\n","import { Component } from '@angular/core';\n\nexport const yearsPerPage = 24;\n\n@Component({\n selector: 'upd-calendar-multi-year-view',\n templateUrl: './calendar-multi-year-view.component.html',\n styleUrl: './calendar-multi-year-view.component.scss'\n})\nexport class CalendarMultiYearViewComponent {\n /** Initializes this month view. */\n init(): void {\n\n }\n\n /** Focuses the active cell after the microtask queue is empty. */\n focusActiveCell(movePreview?: boolean): void {\n }\n}\n","<p>calendar-multi-year-view works!</p>\n","import { Injectable } from '@angular/core';\nimport { OptionalType } from '@updevs/sdk/types';\n\nimport { yearsPerPage } from '../components/calendar-multi-year-view/calendar-multi-year-view.component';\n\n@Injectable()\nexport class CalendarService {\n /**\n * When the multi-year view is first opened, the active year will be in view.\n * So we compute how many years are between the active year and the *slot* where our\n * \"startingYear\" will render when paged into view.\n */\n getMultiYearActiveOffset(activeDate: Date, minDate: OptionalType<Date>, maxDate: OptionalType<Date>): number {\n const activeYear = activeDate.getFullYear();\n return this.euclideanModulo(activeYear - this.getStartingYear(minDate, maxDate), yearsPerPage);\n }\n\n isSameMultiYearView(date1: Date, date2: Date, minDate: OptionalType<Date>, maxDate: OptionalType<Date>): boolean {\n const year1 = date1.getFullYear();\n const year2 = date2.getFullYear();\n const startingYear = this.getStartingYear(minDate, maxDate);\n\n return Math.floor((year1 - startingYear) / yearsPerPage) === Math.floor((year2 - startingYear) / yearsPerPage);\n }\n\n getStartingYear(minDate: OptionalType<Date>, maxDate: OptionalType<Date>): number {\n let startingYear = 0;\n\n if (maxDate) {\n const maxYear = maxDate.getFullYear();\n startingYear = maxYear - yearsPerPage + 1;\n } else if (minDate) {\n startingYear = minDate.getFullYear();\n }\n\n return startingYear;\n }\n\n private euclideanModulo(a: number, b: number): number {\n return ((a % b) + b) % b;\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { DateService } from '@updevs/sdk/core';\n\nimport { CalendarService } from '../../services/calendar.service';\nimport { CalendarSignalsService } from '../../services/calendar-signals.service';\nimport { yearsPerPage } from '../calendar-multi-year-view/calendar-multi-year-view.component';\n\nlet calendarHeaderId = 1;\n\n@Component({\n selector: 'upd-calendar-header',\n templateUrl: './calendar-header.component.html',\n styleUrl: './calendar-header.component.scss'\n})\nexport class CalendarHeaderComponent {\n /**\n * The `aria-label` for changing the calendar view.\n */\n get periodButtonLabel(): string {\n return this.calendarSignalsService.currentView() === 'month' ? 'SwitchToMultiYearView' : 'SwitchToMonthView';\n }\n\n /**\n * The label for the previous button.\n */\n get prevButtonLabel(): string {\n return {\n 'month': 'PreviousMonth',\n 'year': 'PreviousYear',\n 'multi-year': 'PreviousMultiYear'\n }[this.calendarSignalsService.currentView()];\n }\n\n /**\n * The label for the next button.\n */\n get nextButtonLabel(): string {\n return {\n 'month': 'NextMonth',\n 'year': 'NextYear',\n 'multi-year': 'NextMultiYear'\n }[this.calendarSignalsService.currentView()];\n }\n\n /**\n * Whether the selected view is not a month.\n */\n get isNotMonth(): boolean {\n return this.calendarSignalsService.currentView() !== 'month';\n }\n\n /**\n * ID of the label of the period button.\n */\n get periodButtonLabelId(): string {\n return `${this.id}-period-label`;\n }\n\n get minYearOfPageLabel(): string {\n return this.dateService.getYearName(this.dateService.create(this.minYearOfPage, 0, 1));\n }\n\n get maxYearOfPageLabel(): string {\n const maxYearOfPage = this.minYearOfPage + yearsPerPage - 1;\n return this.dateService.getYearName(this.dateService.create(maxYearOfPage, 0, 1));\n }\n\n get periodText(): string {\n if (this.calendarSignalsService.currentView() === 'month') {\n return this.dateService\n .format(this.calendarSignalsService.activeDate(), { year: 'numeric', month: 'short' })\n .toLocaleUpperCase();\n }\n\n if (this.calendarSignalsService.currentView() === 'year') {\n return this.dateService.getYearName(this.calendarSignalsService.activeDate());\n }\n\n return '';\n }\n\n private get minYearOfPage(): number {\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 activeDate = this.calendarSignalsService.activeDate();\n const activeYear = activeDate.getFullYear();\n const offset = this.calendarService.getMultiYearActiveOffset(\n activeDate,\n this.calendarSignalsService.minDate(),\n this.calendarSignalsService.maxDate()\n );\n\n return activeYear - offset;\n }\n\n private id = `upd-calendar-header-${calendarHeaderId++}`;\n private readonly calendarService = inject(CalendarService);\n private readonly calendarSignalsService = inject(CalendarSignalsService);\n private readonly dateService = inject(DateService);\n\n /**\n * Handles user clicks on the period label.\n */\n currentPeriodClicked(): void {\n this.calendarSignalsService.currentView = this.calendarSignalsService.currentView() === 'month' ? 'multi-year' : 'month';\n }\n\n /**\n * Handles user clicks on the previous button.\n */\n previousClicked(): void {\n this.calendarSignalsService.activeDate =\n this.calendarSignalsService.currentView() === 'month'\n ? this.dateService.addMonths(this.calendarSignalsService.activeDate(), -1)\n : this.dateService.addYears(\n this.calendarSignalsService.activeDate(),\n this.calendarSignalsService.currentView() === 'year' ? -1 : -yearsPerPage\n );\n }\n\n /**\n * Handles user clicks on the next button.\n */\n nextClicked(): void {\n this.calendarSignalsService.activeDate =\n this.calendarSignalsService.currentView() === 'month'\n ? this.dateService.addMonths(this.calendarSignalsService.activeDate(), 1)\n : this.dateService.addYears(\n this.calendarSignalsService.activeDate(),\n this.calendarSignalsService.currentView() === 'year' ? 1 : yearsPerPage\n );\n }\n\n /**\n * Whether the previous period button is enabled.\n */\n previousEnabled(): boolean {\n if (!this.calendarSignalsService.minDate()) {\n return true;\n }\n\n return !this.calendarSignalsService.minDate()\n || !this.isSameView(this.calendarSignalsService.activeDate(), this.calendarSignalsService.minDate()!);\n }\n\n /**\n * Whether the next period button is enabled.\n */\n nextEnabled(): boolean {\n return !this.calendarSignalsService.maxDate()\n || !this.isSameView(this.calendarSignalsService.activeDate(), this.calendarSignalsService.maxDate()!);\n }\n\n /**\n * Whether the two dates represent the same view in the current view mode (month or year).\n */\n private isSameView(date1: Date, date2: Date): boolean {\n if (this.calendarSignalsService.currentView() === 'month') {\n return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth();\n }\n\n if (this.calendarSignalsService.currentView() === 'year') {\n return date1.getFullYear() === date2.getFullYear();\n }\n\n // Otherwise we are in 'multi-year' view.\n return this.calendarService.isSameMultiYearView(\n date1,\n date2,\n this.calendarSignalsService.minDate(),\n this.calendarSignalsService.maxDate()\n );\n }\n}\n","<ng-container *transloco=\"let t; prefix: 'UpDevs.Calendar'\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col d-flex\">\n <label [id]=\"periodButtonLabelId\" class=\"visually-hidden\" aria-live=\"polite\">\n {{ periodText || t('YearRangeLabel', { start: minYearOfPageLabel, end: maxYearOfPageLabel }) }}\n </label>\n\n <upd-button [isIcon]=\"true\" [iconModel]=\"{tablerIcon:'chevron-left'}\" [isDisabled]=\"!previousEnabled()\"\n (clicked)=\"previousClicked()\" [attr.aria-label]=\"t(prevButtonLabel)\">\n </upd-button>\n\n <upd-button (click)=\"currentPeriodClicked()\" [attr.aria-label]=\"t(periodButtonLabel)\"\n [attr.aria-describedby]=\"periodButtonLabelId\" customClasses=\"mx-1 flex-grow-1\">\n <span aria-hidden=\"true\">\n {{ periodText || t('YearRange', { start: minYearOfPageLabel, end: maxYearOfPageLabel }) }}\n </span>\n <upd-icon [tablerIcon]=\"!isNotMonth ? 'chevron-down' : 'chevron-up'\"></upd-icon>\n </upd-button>\n\n <upd-button [isIcon]=\"true\" [iconModel]=\"{tablerIcon:'chevron-right'}\" [isDisabled]=\"!nextEnabled()\"\n (clicked)=\"nextClicked()\" [attr.aria-label]=\"t(nextButtonLabel)\">\n </upd-button>\n </div>\n </div>\n </div>\n</ng-container>\n","import {\n AfterContentInit,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n effect,\n inject\n} from '@angular/core';\nimport { OptionalType } from '@updevs/sdk/types';\nimport { DateService } from '@updevs/sdk/core';\nimport { BaseComponent } from '@updevs/sdk/layout';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { startWith } from 'rxjs';\n\nimport { CalendarUserEventModel } from '../../models/calendar-user-event.model';\nimport { CalendarBodyComponent } from '../calendar-body/calendar-body.component';\nimport { DateRangeModel } from '../../models/date-range.model';\nimport { CalendarCellModel } from '../../models/calendar-cell.model';\nimport { CalendarCellClassFunctionType } from '../../types/calendar-cell-class-function.type';\nimport { KeyboardTools } from '../../tools/keyboard-tools';\nimport { CalendarRangeStrategyService } from '../../services/calendar-range-strategy.service';\nimport { CalendarSignalsService } from '../../services/calendar-signals.service';\n\nconst daysPerWeek = 7;\n\nlet uniqueIdCounter = 0;\n\n@Component({\n selector: 'upd-calendar-month-view',\n templateUrl: './calendar-month-view.component.html',\n styleUrl: './calendar-month-view.component.scss'\n})\nexport class CalendarMonthViewComponent extends BaseComponent implements AfterContentInit, OnChanges {\n /**\n * The body of calendar table\n */\n @ViewChild(CalendarBodyComponent) _matCalendarBody!: CalendarBodyComponent;\n\n /**\n * The date to display in this month view (everything other than the month and year is ignored).\n */\n @Input()\n get activeDate(): Date {\n return this.calendarSignalsService.activeDate();\n }\n set activeDate(value: Date) {\n this.updateActiveDate(value);\n }\n\n /** The currently selected date. */\n @Input()\n get selected(): DateRangeModel | OptionalType<Date> {\n return this.calendarSignalsService.selectedDate();\n }\n set selected(value: DateRangeModel | OptionalType<Date>) {\n let currValue: DateRangeModel | OptionalType<Date>;\n\n if (value instanceof DateRangeModel) {\n currValue = value;\n } else {\n currValue = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));\n }\n\n this.calendarSignalsService.selectedDate = currValue;\n\n this.setRanges(currValue);\n }\n\n /** The minimum selectable date. */\n @Input()\n get minDate(): OptionalType<Date> {\n return this._minDate;\n }\n set minDate(value: OptionalType<Date>) {\n this._minDate = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));\n }\n\n /** The maximum selectable date. */\n @Input()\n get maxDate(): OptionalType<Date> {\n return this._maxDate;\n }\n set maxDate(value: OptionalType<Date>) {\n this._maxDate = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));\n }\n\n /** Function used to filter which dates are selectable. */\n @Input() dateFilter?: (date: Date) => boolean;\n\n /** Function that can be used to add custom CSS classes to dates. */\n @Input() dateClass?: CalendarCellClassFunctionType;\n\n /** Start of the comparison range. */\n @Input() comparisonStart?: Date;\n\n /** End of the comparison range. */\n @Input() comparisonEnd?: Date;\n\n /** ARIA Accessible name of the `<input matStartDate/>` */\n @Input() startDateAccessibleName?: string;\n\n /** ARIA Accessible name of the `<input matEndDate/>` */\n @Input() endDateAccessibleName?: string;\n\n /**\n * First day of week.\n * Zero-based starting from Sunday.\n * Default: 0 - Sunday.\n */\n @Input() firstDayOfWeek = 0;\n\n /** Origin of active drag, or null when dragging is not active. */\n @Input() activeDrag?: CalendarUserEventModel<Date>;\n\n /** Whether the user is currently selecting a range of dates. */\n @Input() isRange = false;\n\n /** Emits when a new date is selected. */\n @Output() readonly selectedChange = new EventEmitter<OptionalType<Date>>();\n\n /** Emits when any date is selected. */\n @Output() readonly userSelection = new EventEmitter<CalendarUserEventModel<OptionalType<Date>>>();\n\n /** Emits when the user initiates a date range drag via mouse or touch. */\n @Output() readonly dragStarted = new EventEmitter<CalendarUserEventModel<Date>>();\n\n /**\n * Emits when the user completes or cancels a date range drag.\n * Emits null when the drag was canceled or the newly selected date range if completed.\n */\n @Output() readonly dragEnded = new EventEmitter<CalendarUserEventModel<OptionalType<DateRangeModel>>>();\n\n /** Emits when any date is activated. */\n @Output() readonly activeDateChange = new EventEmitter<Date>();\n\n /** The label for this month (e.g. \"January 2017\"). */\n monthLabel!: string;\n\n /** Grid of calendar cells representing the dates of the month. */\n weeks: CalendarCellModel[][] = [];\n\n /** The number of blank cells in the first row before the 1st of the month. */\n firstWeekOffset = 0;\n\n /** Start value of the currently-shown date range. */\n rangeStart?: number;\n\n /** End value of the currently-shown date range. */\n rangeEnd?: number;\n\n /** Start value of the currently-shown comparison date range. */\n comparisonRangeStart?: number;\n\n /** End value of the currently-shown comparison date range. */\n comparisonRangeEnd?: number;\n\n /** Start of the preview range. */\n previewStart?: number;\n\n /** End of the preview range. */\n previewEnd?: number;\n\n /** The date of the month that today falls on. Null if today is in another month. */\n todayDate?: number;\n\n /** The names of the weekdays. */\n weekdays: { long: string; narrow: string; id: number }[] = [];\n\n /** Flag used to filter out space/enter keyup events that originated outside of the view. */\n private _selectionKeyPressed = false;\n private _minDate?: Date;\n private _maxDate?: Date;\n private oldActiveDate?: Date;\n\n private readonly translocoService = inject(TranslocoService);\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n private readonly dateService = inject(DateService);\n private readonly calendarSignalsService = inject(CalendarSignalsService);\n private readonly calendarRangeStrategy = inject(CalendarRangeStrategyService);\n\n constructor() {\n super();\n effect(() => this.updateActiveDate(this.calendarSignalsService.activeDate(), true));\n }\n\n ngAfterContentInit(): void {\n const langSub = this.translocoService.langChanges$\n .pipe(startWith(undefined))\n .subscribe(() => this.init());\n this.addSubscriptions(langSub);\n }\n\n 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'] && !this.activeDrag) {\n this.clearPreview();\n }\n }\n\n /** Handles when a new date is selected. */\n dateSelected(event: CalendarUserEventModel<number>): void {\n const date = event.value;\n const selectedDate = this.getDateFromDayOfMonth(date);\n const currSelection = this.calendarSignalsService.selectedDate();\n let rangeStartDate: OptionalType<number>;\n let rangeEndDate: OptionalType<number>;\n\n if (currSelection instanceof DateRangeModel) {\n rangeStartDate = this.getDateInCurrentMonth(currSelection.start);\n rangeEndDate = this.getDateInCurrentMonth(currSelection.end);\n } else {\n rangeStartDate = rangeEndDate = this.getDateInCurrentMonth(currSelection);\n }\n\n if (rangeStartDate !== date || rangeEndDate !== date) {\n this.calendarSignalsService.selectedDate = selectedDate;\n }\n\n this.userSelection.emit({ value: selectedDate, event: event.event });\n this.clearPreview();\n this.changeDetectorRef.markForCheck();\n }\n\n /** Handles keydown events on the calendar body when calendar is in month view. */\n handleCalendarBodyKeydown(event: KeyboardEvent): void {\n // TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent\n // disabled ones from being selected. This may not be ideal, we should look into whether\n // navigation should skip over disabled dates, and if so, how to implement that efficiently.\n\n const oldActiveDate = this.activeDate;\n let tempActiveDate: OptionalType<Date>;\n\n switch (event.key) {\n case 'LEFT_ARROW':\n tempActiveDate = this.dateService.addDays(this.activeDate, -1);\n break;\n case 'RIGHT_ARROW':\n tempActiveDate = this.dateService.addDays(this.activeDate, 1);\n break;\n case 'UP_ARROW':\n tempActiveDate = this.dateService.addDays(this.activeDate, -7);\n break;\n case 'DOWN_ARROW':\n tempActiveDate = this.dateService.addDays(this.activeDate, 7);\n break;\n case 'HOME':\n tempActiveDate = this.dateService.addDays(this.activeDate, 1 - this.activeDate.getDate());\n break;\n case 'END':\n tempActiveDate = this.dateService.addDays(\n this.activeDate,\n this.dateService.getNumDaysInMonth(this.activeDate) -\n this.activeDate.getDate()\n );\n break;\n case 'PAGE_UP':\n tempActiveDate = event.altKey\n ? this.dateService.addYears(this.activeDate, -1)\n : this.dateService.addMonths(this.activeDate, -1);\n break;\n case 'PAGE_DOWN':\n tempActiveDate = event.altKey\n ? this.dateService.addYears(this.activeDate, 1)\n : this.dateService.addMonths(this.activeDate, 1);\n break;\n case 'ENTER':\n case 'SPACE':\n this._selectionKeyPressed = true;\n\n if (this.canSelect(this.activeDate)) {\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 !== undefined && !KeyboardTools.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: undefined, event });\n } else {\n this.selectedChange.emit(undefined);\n this.userSelection.emit({ value: undefined, event });\n }\n event.preventDefault();\n event.stopPropagation(); // Prevents the overlay from closing.\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.dateService.compare(oldActiveDate, this.activeDate)) {\n this.calendarSignalsService.activeDate = tempActiveDate;\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 month view. */\n handleCalendarBodyKeyup(event: KeyboardEvent): void {\n if (event.key === 'SPACE' || event.key === 'ENTER') {\n if (this._selectionKeyPressed && this.canSelect(this.activeDate)) {\n this.dateSelected({ value: this.activeDate.getDate(), event });\n }\n\n this._selectionKeyPressed = false;\n }\n }\n\n /** Initializes this month view. */\n init(): void {\n this.setRanges(this.selected);\n this.todayDate = this.getCellCompareValue(new Date());\n this.monthLabel = this.dateService.getMonthNames('short')[this.activeDate.getMonth()].toLocaleUpperCase();\n const firstOfMonth = this.dateService.create(\n this.activeDate.getFullYear(),\n this.activeDate.getMonth(),\n 1\n );\n this.firstWeekOffset = (daysPerWeek + firstOfMonth.getDay() - this.firstDayOfWeek) % daysPerWeek;\n\n this.initWeekdays();\n this.createWeekCells();\n this.changeDetectorRef.markForCheck();\n }\n\n /** Focuses the active cell after the microtask queue is empty. */\n focusActiveCell(movePreview?: boolean): void {\n this._matCalendarBody.focusActiveCell(movePreview);\n }\n\n /** Focuses the active cell after change detection has run and the microtask queue is empty. */\n focusActiveCellAfterViewChecked(): void {\n this._matCalendarBody.scheduleFocusActiveCellAfterViewChecked();\n }\n\n /** Called when the user has activated a new cell and the preview needs to be updated. */\n previewChanged({ value: cell }: CalendarUserEventModel<OptionalType<CalendarCellModel>>): void {\n if (!this.selected) {\n return;\n }\n\n if (this.isRange && !(this.selected instanceof DateRangeModel)) {\n this.selected = new DateRangeModel(this.selected);\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! : undefined;\n const previewRange = this.calendarRangeStrategy.createPreview(value, this.selected as DateRangeModel);\n this.previewStart = this.getCellCompareValue(previewRange.start);\n this.previewEnd = this.getCellCompareValue(previewRange.end);\n\n if (!!this.activeDrag && !!value) {\n const dragRange = this.calendarRangeStrategy.createDrag?.(this.activeDrag.value, this.selected as DateRangeModel, value);\n\n if (!!dragRange) {\n this.previewStart = this.getCellCompareValue(dragRange.start);\n this.previewEnd = this.getCellCompareValue(dragRange.end);\n }\n }\n\n // Note that here we need to use `detectChanges`, rather than `markForCheck`, because\n // the way `_focusActiveCell` is set up at the moment makes it fire at the wrong time\n // when navigating one month back using the keyboard which will cause this handler\n // to throw a \"changed after checked\" error when updating the preview state.\n this.changeDetectorRef.detectChanges();\n }\n\n /**\n * Called when the user has ended a drag. If the drag/drop was successful,\n * computes and emits the new range selection.\n */\n protected _dragEnded(event: CalendarUserEventModel<OptionalType<Date>>): void {\n if (!this.activeDrag) {\n return;\n }\n\n if (event.value) {\n // Propagate drag effect\n const dragDropResult = this.calendarRangeStrategy?.createDrag?.(\n this.activeDrag.value,\n this.selected as DateRangeModel,\n event.value\n );\n\n this.dragEnded.emit({ value: dragDropResult ?? undefined, event: event.event });\n } else {\n this.dragEnded.emit({ value: undefined, event: event.event });\n }\n }\n\n private updateActiveDate(value: Date, isFromEffect = false): void {\n this.oldActiveDate = this.oldActiveDate || value;\n const validDate = this.dateService.getValidOrUndefined(this.dateService.deserialize(value)) || new Date();\n\n if (!isFromEffect) {\n this.calendarSignalsService.activeDate = this.dateService.clamp(validDate, this.minDate, this.maxDate);\n }\n\n if (!this.isSameMonthAndYearAsActiveDate(this.oldActiveDate, this.calendarSignalsService.activeDate())) {\n this.init();\n }\n\n this.oldActiveDate = value;\n\n this.activeDateChange.emit(this.calendarSignalsService.activeDate());\n }\n\n /**\n * Takes a day of the month and returns a new date in the same month and year as the currently\n * active date. The returned date will have the same day of the month as the argument date.\n */\n private getDateFromDayOfMonth(dayOfMonth: number): Date {\n return this.dateService.create(this.activeDate.getFullYear(), this.activeDate.getMonth(), dayOfMonth);\n }\n\n /** Initializes the weekdays. */\n private initWeekdays(): void {\n const firstDayOfWeek = this.firstDayOfWeek;\n const narrowWeekdays = this.dateService.getDayOfWeekNames('narrow');\n const longWeekdays = this.dateService.getDayOfWeekNames('long');\n // Rotate the labels for days of the week based on the configured first day of the week.\n const weekdays = longWeekdays.map((long, i) => ({ long, narrow: narrowWeekdays[i], id: uniqueIdCounter++ }));\n this.weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));\n }\n\n /** Creates MatCalendarCells for the dates in this month. */\n private createWeekCells(): void {\n const daysInMonth = this.dateService.getNumDaysInMonth(this.activeDate);\n const dateNames = this.dateService.getDateNames();\n this.weeks = [[]];\n\n for (let i = 0, cell = this.firstWeekOffset; i < daysInMonth; i++, cell++) {\n if (cell === daysPerWeek) {\n this.weeks.push([]);\n cell = 0;\n }\n\n const date = this.dateService.create(this.activeDate.getFullYear(), this.activeDate.getMonth(), i + 1);\n const isEnabled = this.shouldEnableDate(date);\n const ariaLabel = this.dateService.format(date, { year: 'numeric', month: 'long', day: 'numeric' });\n const cellClasses = this.dateClass ? this.dateClass(date, 'month') : undefined;\n\n this.weeks[this.weeks.length - 1].push(\n new CalendarCellModel(\n i + 1,\n dateNames[i],\n ariaLabel,\n isEnabled,\n cellClasses,\n this.getCellCompareValue(date)!,\n date\n )\n );\n }\n }\n\n /** Date filter for the month */\n private shouldEnableDate(date: Date): boolean {\n return !!date &&\n (!this.minDate || this.dateService.compare(date, this.minDate) >= 0) &&\n (!this.maxDate || this.dateService.compare(date, this.maxDate) <= 0) &&\n (!this.dateFilter || this.dateFilter(date));\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): OptionalType<number> {\n return !!date && this.isSameMonthAndYearAsActiveDate(date, this.calendarSignalsService.activeDate())\n ? date.getDate()\n : undefined;\n }\n\n /** Checks whether the 2 dates are non-null and fall within the same month of the same year. */\n private isSameMonthAndYearAsActiveDate(d1?: Date, d2?: Date): boolean {\n return (!!d1 && !!d2 && d1.getMonth() === d2.getMonth() && d1.getFullYear() === d2.getFullYear());\n }\n\n /** Gets the value that will be used to one cell to another. */\n private getCellCompareValue(date?: Date): OptionalType<number> {\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 = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n\n return new Date(year, month, day).getTime();\n }\n\n return undefined;\n }\n\n /** Sets the current range based on a model value. */\n private setRanges(selectedValue: DateRangeModel | OptionalType<Date>): void {\n if (selectedValue instanceof DateRangeModel) {\n this.rangeStart = this.getCellCompareValue(selectedValue.start);\n this.rangeEnd = this.getCellCompareValue(selectedValue.end);\n this.isRange = true;\n } else {\n this.rangeStart = this.rangeEnd = this.getCellCompareValue(selectedValue);\n }\n\n this.comparisonRangeStart = this.getCellCompareValue(this.comparisonStart);\n this.comparisonRangeEnd = this.getCellCompareValue(this.comparisonEnd);\n }\n\n /** Gets whether a date can be selected in the month view. */\n private canSelect(date: Date): boolean {\n return !this.dateFilter || this.dateFilter(date);\n }\n\n /** Clears out preview state. */\n private clearPreview(): void {\n this.previewStart = this.previewEnd = undefined;\n }\n}\n","<upd-calendar-header></upd-calendar-header>\n<div class=\"container mt-2\">\n <div class=\"row seven-cols\">\n @for (day of weekdays; track day.id) {\n <div class=\"col-1 p-1 d-flex justify-content-center align-items-center\">\n <span class=\"visually-hidden\">{{ day.long }}</span>\n <span aria-hidden=\"true\">{{ day.narrow }}</span>\n </div>\n }\n </div>\n</div>\n<upd-calendar-body [label]=\"monthLabel\" [rows]=\"weeks\" [todayValue]=\"todayDate!\" [startValue]=\"rangeStart!\"\n [endValue]=\"rangeEnd!\" [comparisonStart]=\"comparisonRangeStart\" [comparisonEnd]=\"comparisonRangeEnd\"\n [previewStart]=\"previewStart\" [previewEnd]=\"previewEnd\" [isRange]=\"isRange\" [labelMinRequiredCells]=\"3\"\n [activeCell]=\"activeDate.getDate() - 1\" [startDateAccessibleName]=\"startDateAccessibleName\"\n [endDateAccessibleName]=\"endDateAccessibleName\" (selectedValueChange)=\"dateSelected($event)\"\n (previewChange)=\"previewChanged($event)\" (dragStarted)=\"dragStarted.emit($event)\" (dragEnded)=\"_dragEnded($event)\"\n (keyup)=\"handleCalendarBodyKeyup($event)\" (keydown)=\"handleCalendarBodyKeydown($event)\">\n</upd-calendar-body>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'upd-calendar-year-view',\n templateUrl: './calendar-year-view.component.html',\n styleUrl: './calendar-year-view.component.scss'\n})\nexport class CalendarYearViewComponent {\n /** Initializes this month view. */\n init(): void {\n\n }\n\n /** Focuses the active cell after the microtask queue is empty. */\n focusActiveCell(movePreview?: boolean): void {\n }\n}\n","<p>calendar-year-view works!</p>\n","import {\n AfterContentInit,\n AfterViewChecked,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChange,\n SimpleChanges,\n ViewChild,\n inject\n} from '@angular/core';\nimport { OptionalType } from '@updevs/sdk/types';\nimport { DateService } from '@updevs/sdk/core';\n\nimport { DateRangeModel } from './models/date-range.model';\nimport { CalendarViewType } from './types/calendar-view.type';\nimport { CalendarUserEventModel } from './models/calendar-user-event.model';\nimport { CalendarCellClassFunctionType } from './types/calendar-cell-class-function.type';\nimport { CalendarMonthViewComponent } from './components/calendar-month-view/calendar-month-view.component';\nimport { CalendarYearViewComponent } from './components/calendar-year-view/calendar-year-view.component';\nimport { CalendarMultiYearViewComponent } from './components/calendar-multi-year-view/calendar-multi-year-view.component';\n\n@Component({\n selector: 'upd-calendar',\n templateUrl: './calendar.component.html',\n styleUrl: './calendar.component.scss'\n})\nexport class CalendarComponent implements AfterContentInit, AfterViewChecked, OnChanges {\n /** Reference to the current month view component. */\n @ViewChild(CalendarMonthViewComponent) monthView?: CalendarMonthViewComponent;\n\n /** Reference to the current year view component. */\n @ViewChild(CalendarYearViewComponent) yearView?: CalendarYearViewComponent;\n\n /** Reference to the current multi-year view component. */\n @ViewChild(CalendarMultiYearViewComponent) multiYearView?: CalendarMultiYearViewComponent;\n\n /** A date representing the period (month or year) to start the calendar in. */\n @Input()\n get startAt(): OptionalType<Date> {\n return this._startAt;\n }\n set startAt(value: OptionalType<Date>) {\n this._startAt = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));\n }\n\n /**\n * Whether the calendar should be started in month or year view.\n */\n @Input() startView: CalendarViewType = 'month';\n /**\n * The currently selected date.\n */\n @Input()\n get selected(): DateRangeModel | OptionalType<Date> {\n return this._selected;\n }\n set selected(value: DateRangeModel | OptionalType<Date>) {\n console.log('setting selected', value);\n if (value instanceof DateRangeModel) {\n this._selected = value;\n } else {\n this._selected = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));\n }\n }\n /**\n * The minimum selectable date.\n */\n @Input()\n get minDate(): OptionalType<Date> {\n return this._minDate;\n }\n set minDate(value: OptionalType<Date>) {\n this._minDate = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));\n }\n /**\n * The maximum selectable date.\n */\n @Input()\n get maxDate(): OptionalType<Date> {\n return this._maxDate;\n }\n set maxDate(value: OptionalType<Date>) {\n this._maxDate = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));\n }\n /**\n * Function used to filter which dates are selectable.\n */\n @Input() dateFilter?: (date: Date) => boolean;\n\n /** Function that can be used to add custom CSS classes to dates. */\n @Input() dateClass?: CalendarCellClassFunctionType;\n\n /** Start of the comparison range. */\n @Input() comparisonStart?: Date;\n\n /** End of the comparison range. */\n @Input() comparisonEnd?: Date;\n\n /** ARIA Accessible name of the `<input matStartDate/>` */\n @Input() startDateAccessibleName?: string;\n\n /** ARIA Accessible name of the `<input matEndDate/>` */\n @Input() endDateAccessibleName?: string;\n /** Whether the user is currently selecting a range of dates. */\n @Input() isRange = false;\n\n /** Emits when the currently selected date changes. */\n @Output() readonly selectedChange = new EventEmitter<OptionalType<Date>>();\n\n /**\n * Emits the year chosen in multiyear view.\n * This doesn't imply a change on the selected date.\n */\n @Output() readonly yearSelected = new EventEmitter<Date>();\n\n /**\n * Emits the month chosen in year view.\n * This doesn't imply a change on the selected date.\n */\n @Output() readonly monthSelected = new EventEmitter<Date>();\n\n /**\n * Emits when the current view changes.\n */\n @Output() readonly viewChanged = new EventEmitter<CalendarViewType>(true);\n\n /** Emits when any date is selected. */\n @Output() readonly userSelection = new EventEmitter<CalendarUserEventModel<OptionalType<Date>>>();\n\n /** Emits a new date range value when the user completes a drag drop operation. */\n @Output() readonly userDragDrop = new EventEmitter<CalendarUserEventModel<DateRangeModel>>();\n\n /**\n * The current active date. This determines which time period is shown and which date is\n * highlighted when using keyboard navigation.\n */\n get activeDate(): Date {\n return this._clampedActiveDate;\n }\n set activeDate(value: Date) {\n this._clampedActiveDate = this.dateService.clamp(value, this.minDate, this.maxDate);\n this._changeDetectorRef.markForCheck();\n }\n\n /** Whether the calendar is in month view. */\n get currentView(): CalendarViewType {\n return this._currentView;\n }\n set currentView(value: CalendarViewType) {\n const viewChangedResult = this._currentView !== value ? value : undefined;\n this._currentView = value;\n this._moveFocusOnNextTick = true;\n\n this._changeDetectorRef.markForCheck();\n\n if (viewChangedResult) {\n this.viewChanged.emit(viewChangedResult);\n }\n }\n\n /** Origin of active drag, or null when dragging is not active. */\n protected _activeDrag?: CalendarUserEventModel<Date>;\n\n private _clampedActiveDate!: Date;\n private _startAt?: Date;\n private _selected?: DateRangeModel | Date;\n private _minDate?: Date;\n private _maxDate?: Date;\n\n /**\n * Used for scheduling that focus should be moved to the active cell on the next tick.\n * We need to schedule it, rather than do it immediately, because we have to wait\n * for Angular to re-evaluate the view children.\n */\n private _moveFocusOnNextTick = false;\n private _currentView!: CalendarViewType;\n\n private readonly dateService = inject(DateService);\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\n\n ngAfterContentInit(): void {\n this.activeDate = this.startAt || new Date();\n // Assign to the private property since we don't want to move focus on init.\n this._currentView = this.startView;\n }\n\n ngAfterViewChecked(): void {\n if (this._moveFocusOnNextTick) {\n this._moveFocusOnNextTick = false;\n this.focusActiveCell();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Ignore date changes that are at a different time on the same day. This fixes issues where\n // the calendar re-renders when there is no meaningful change to [minDate] or [maxDate]\n // (#24435).\n const minDateChange: OptionalType<SimpleChange> =\n changes['minDate'] && !this.dateService.areEqual(changes['minDate'].previousValue, changes['minDate'].currentValue)\n ? changes['minDate']\n : undefined;\n const maxDateChange: OptionalType<SimpleChange> =\n changes['maxDate'] && !this.dateService.areEqual(changes['maxDate'].previousValue, changes['maxDate'].currentValue)\n ? changes['maxDate']\n : undefined;\n\n const change = minDateChange || maxDateChange || changes['dateFilter'];\n\n if (change && !change.firstChange) {\n const view = this._getCurrentViewComponent();\n\n if (view) {\n // We need to `detectChanges` manually here, because the `minDate`, `maxDate` etc. are\n // passed down to the view via data bindings which won't be up-to-date when we call `_init`.\n this._changeDetectorRef.detectChanges();\n view.init();\n }\n }\n }\n\n /** Focuses the active date. */\n focusActiveCell() {\n this._getCurrentViewComponent().focusActiveCell(false);\n }\n\n /** Updates today's date after an update of the active date */\n updateTodaysDate() {\n this._getCurrentViewComponent().init();\n }\n\n /** Handles date selection in the month view. */\n _dateSelected(event: CalendarUserEventModel<OptionalType<Date>>): void {\n const date = event.value;\n\n if (this.selected instanceof DateRangeModel || (date && !this.dateService.areEqual(date, this.selected))) {\n this.selectedChange.emit(date);\n }\n\n this.userSelection.emit(event);\n }\n\n /** Handles year selection in the multiyear view. */\n _yearSelectedInMultiYearView(normalizedYear: Date) {\n this.yearSelected.emit(normalizedYear);\n }\n\n /** Handles month selection in the year view. */\n _monthSelectedInYearView(normalizedMonth: Date) {\n this.monthSelected.emit(normalizedMonth);\n }\n\n /** Handles year/month selection in the multi-year/year views. */\n _goToDateInView(date: Date, view: CalendarViewType): void {\n this.activeDate = date;\n this.currentView = view;\n }\n\n /** Called when the user starts dragging to change a date range. */\n _dragStarted(event: CalendarUserEventModel<Date>) {\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 _dragEnded(event: CalendarUserEventModel<OptionalType<DateRangeModel>>) {\n if (!this._activeDrag) {\n return;\n }\n\n if (event.value) {\n this.userDragDrop.emit(event as CalendarUserEventModel<DateRangeModel>);\n }\n\n this._activeDrag = undefined;\n }\n\n /** Returns the component instance that corresponds to the current calendar view. */\n private _getCurrentViewComponent(): CalendarMonthViewComponent | CalendarYearViewComponent | CalendarMultiYearViewComponent {\n // The return type is explicitly written as a union to ensure that the Closure compiler does\n // not optimize calls to _init(). Without the explicit return type, TypeScript narrows it to\n // only the first component type. See https://github.com/angular/components/issues/22996.\n return (this.monthView || this.yearView || this.multiYearView)!;\n }\n}\n","@switch (currentView) {\n @case ('month') {\n <upd-calendar-month-view [(activeDate)]=\"activeDate\" [isRange]=\"isRange\" [selected]=\"selected\" [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\" [minDate]=\"minDate\" [dateClass]=\"dateClass\" [comparisonStart]=\"comparisonStart\"\n [comparisonEnd]=\"comparisonEnd\" [startDateAccessibleName]=\"startDateAccessibleName\"\n [endDateAccessibleName]=\"endDateAccessibleName\" (userSelection)=\"_dateSelected($event)\" (dragStarted)=\"_dragStarted($event)\"\n (dragEnded)=\"_dragEnded($event)\" [activeDrag]=\"_activeDrag\">\n </upd-calendar-month-view>\n }\n @case ('year') {\n YEAR!\n <!-- <upd-calendar-year-view-->\n <!-- [(activeDate)]=\"activeDate\"-->\n <!-- [selected]=\"selected\"-->\n <!-- [dateFilter]=\"dateFilter\"-->\n <!-- [maxDate]=\"maxDate\"-->\n <!-- [minDate]=\"minDate\"-->\n <!-- [dateClass]=\"dateClass\"-->\n <!-- (monthSelected)=\"_monthSelectedInYearView($event)\"-->\n <!-- (selectedChange)=\"_goToDateInView($event, 'month')\"></upd-calendar-year-view>-->\n }\n @case ('multi-year') {\n MUUMUMUULTI-YEAR!\n <!-- <upd-calendar-multi-year-view-->\n <!-- [(activeDate)]=\"activeDate\"-->\n <!-- [selected]=\"selected\"-->\n <!-- [dateFilter]=\"dateFilter\"-->\n <!-- [maxDate]=\"maxDate\"-->\n <!-- [minDate]=\"minDate\"-->\n <!-- [dateClass]=\"dateClass\"-->\n <!-- (yearSelected)=\"_yearSelectedInMultiYearView($event)\"-->\n <!-- (selectedChange)=\"_goToDateInView($event, 'year')\"></upd-calendar-multi-year-view>-->\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UpdButtonModule } from '@updevs/components/button';\nimport { UpdIconsModule } from '@updevs/icons';\nimport { TranslocoService, TranslocoDirective } from '@jsverse/transloco';\n\nimport * as en from './assets/i18n/en.json';\nimport * as pt from './assets/i18n/pt.json';\nimport { CalendarHeaderComponent } from './components/calendar-header/calendar-header.component';\nimport { CalendarService } from './services/calendar.service';\nimport { CalendarSignalsService } from './services/calendar-signals.service';\nimport { CalendarMultiYearViewComponent } from './components/calendar-multi-year-view/calendar-multi-year-view.component';\nimport { CalendarYearViewComponent } from './components/calendar-year-view/calendar-year-view.component';\nimport { CalendarMonthViewComponent } from './components/calendar-month-view/calendar-month-view.component';\nimport { CalendarBodyComponent } from './components/calendar-body/calendar-body.component';\nimport { CalendarRangeStrategyService } from './services/calendar-range-strategy.service';\nimport { CalendarComponent } from './calendar.component';\n\n@NgModule({\n imports: [\n CommonModule,\n UpdButtonModule,\n TranslocoDirective,\n UpdIconsModule\n ],\n declarations: [\n CalendarHeaderComponent,\n CalendarMultiYearViewComponent,\n CalendarYearViewComponent,\n CalendarMonthViewComponent,\n CalendarBodyComponent,\n CalendarComponent\n ],\n exports: [\n CalendarComponent\n ],\n providers: [\n CalendarService,\n CalendarSignalsService,\n CalendarRangeStrategyService\n ]\n})\nexport class UpdCalendarModule {\n constructor(translocoService: TranslocoService) {\n translocoService.setFallbackLangForMissingTranslation({ fallbackLang: 'en' });\n translocoService.setTranslation(en, 'en');\n translocoService.setTranslation(pt, 'pt');\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["uniqueIdCounter","i1","i2","i1.CalendarHeaderComponent","i2.CalendarBodyComponent","i1.CalendarMonthViewComponent","en","pt"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"updevs-components-calendar.mjs","sources":["../../../../libs/components/calendar/src/models/date-range.model.ts","../../../../libs/components/calendar/src/models/enums/calendar-view.enum.ts","../../../../libs/components/calendar/src/services/calendar-range-strategy.service.ts","../../../../libs/components/calendar/src/calendar.component.ts","../../../../libs/components/calendar/src/calendar.component.html","../../../../libs/components/calendar/src/services/calendar-signals.service.ts","../../../../libs/components/calendar/src/upd-calendar.module.ts","../../../../libs/components/calendar/src/updevs-components-calendar.ts"],"sourcesContent":["/**\n * A class representing a range of dates.\n */\nexport class DateRangeModel {\n constructor(\n /**\n * The start date of the range.\n */\n readonly start?: Date,\n /**\n * The end date of the range.\n */\n readonly end?: Date\n ) {\n }\n}\n","export enum CalendarViewEnum {\n Days = 'days',\n Months = 'months',\n Years = 'years'\n}\n","import { Injectable, inject } from '@angular/core';\nimport { DateService } from '@updevs/sdk/core';\nimport { OptionalType } from '@updevs/sdk/types';\n\nimport { DateRangeModel } from '../models/date-range.model';\n\n/**\n * Provides the default date range selection behavior.\n */\n@Injectable()\nexport class CalendarRangeStrategyService {\n private readonly dateService = inject(DateService);\n\n /**\n * Called when the user has finished selecting a value.\n * @param date Date that was selected. Will be null if the user cleared the selection.\n * @param currentRange Range that is currently show in the calendar.\n */\n selectionFinished(date: OptionalType<Date>, currentRange: DateRangeModel): DateRangeModel {\n let { start, end } = currentRange;\n\n if (start === undefined) {\n start = date;\n } else if (end === undefined && date && this.dateService.compare(date, start) >= 0) {\n end = date;\n } else {\n start = date;\n end = undefined;\n }\n\n return new DateRangeModel(start, end);\n }\n\n /**\n * Called when the user has activated a new date (e.g. by hovering over\n * it or moving focus) and the calendar tries to display a date range.\n *\n * @param activeDate Date that the user has activated. Will be null if the user moved\n * focus to an element that's no a calendar cell.\n * @param currentRange Range that is currently shown in the calendar.\n */\n createPreview(activeDate: OptionalType<Date>, currentRange: DateRangeModel): DateRangeModel {\n let start: OptionalType<Date>;\n let end: OptionalType<Date>;\n\n if (!!currentRange.start && !currentRange.end && !!activeDate) {\n start = currentRange.start;\n end = activeDate;\n }\n\n return new DateRangeModel(start, end);\n }\n\n /**\n * Called when the user has dragged a date in the currently selected range to another\n * date. Returns the date updated range that should result from this interaction.\n *\n * @param dragOrigin The date the user started dragging from.\n * @param originalRange The originally selected date range.\n * @param newDate The currently targeted date in the drag operation.\n */\n createDrag(dragOrigin: Date, originalRange: DateRangeModel, newDate: Date): OptionalType<DateRangeModel> {\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 undefined;\n }\n\n const isRange = this.dateService.compare(start, end) !== 0;\n const diffYears = newDate.getFullYear() - dragOrigin.getFullYear();\n const diffMonths = newDate.getMonth() - dragOrigin.getMonth();\n const diffDays = newDate.getDate() - dragOrigin.getDate();\n\n if (isRange && this.dateService.areEqual(dragOrigin, originalRange.start)) {\n start = newDate;\n\n if (this.dateService.compare(newDate, end) > 0) {\n end = this.dateService.addYears(end, diffYears);\n end = this.dateService.addMonths(end, diffMonths);\n end = this.dateService.addDays(end, diffDays);\n }\n } else if (isRange && this.dateService.areEqual(dragOrigin, originalRange.end)) {\n end = newDate;\n\n if (this.dateService.compare(newDate, start) < 0) {\n start = this.dateService.addYears(start, diffYears);\n start = this.dateService.addMonths(start, diffMonths);\n start = this.dateService.addDays(start, diffDays);\n }\n } else {\n start = this.dateService.addYears(start, diffYears);\n start = this.dateService.addMonths(start, diffMonths);\n start = this.dateService.addDays(start, diffDays);\n end = this.dateService.addYears(end, diffYears);\n end = this.dateService.addMonths(end, diffMonths);\n end = this.dateService.addDays(end, diffDays);\n }\n\n return new DateRangeModel(start, end);\n }\n}\n","import { Component, OnInit, inject, signal, computed, input, output } from '@angular/core';\nimport { DateService } from '@updevs/sdk/core';\nimport { OptionalType } from '@updevs/sdk/types';\n\nimport { CalendarViewEnum } from './models/enums/calendar-view.enum';\nimport { CalendarDateModel } from './models/calendar-date.model';\nimport { CalendarMonthModel } from './models/calendar-month.model';\nimport { CalendarYearModel } from './models/calendar-year.model';\nimport { CalendarSelectedModel } from './models/calendar-selected.model';\n\n@Component({\n selector: 'upd-calendar',\n templateUrl: './calendar.component.html',\n styleUrls: ['./calendar.component.scss']\n})\nexport class CalendarComponent implements OnInit {\n readonly selectedDate = input<OptionalType<Date>>();\n readonly selectedStartDate = input<OptionalType<Date>>();\n readonly selectedEndDate = input<OptionalType<Date>>();\n readonly minDate = input<OptionalType<Date>>();\n readonly maxDate = input<OptionalType<Date>>();\n readonly disabledDatesFilter = input<OptionalType<(date: Date) => boolean>>();\n readonly isRange = input<boolean>(false);\n readonly shouldRemoveExternalBorder = input<boolean>(false);\n\n readonly selected = output<OptionalType<CalendarSelectedModel>>();\n readonly monthChanged = output<Date>();\n\n CalendarViewEnum = CalendarViewEnum;\n\n readonly currentView = signal<CalendarViewEnum>(CalendarViewEnum.Days);\n readonly currentDate = signal<Date>(new Date());\n readonly yearRange = signal<{ start: number; end: number }>({ start: 2020, end: 2030 });\n readonly currentYear = computed(() => this.currentDate().getFullYear());\n readonly currentMonth = computed(() => this.currentDate().getMonth());\n readonly currentMonthName = computed(() =>\n this.dateService.format(this.currentDate(), { month: 'short', year: 'numeric' }).toUpperCase()\n );\n readonly calendarDays = computed(() => this.generateCalendarDays());\n readonly calendarMonths = computed(() => this.generateCalendarMonths());\n readonly calendarYears = computed(() => this.generateCalendarYears());\n readonly weekDayNames = computed(() => this.dateService.getDayOfWeekNames('narrow'));\n\n private readonly internalSelectedDate = signal<OptionalType<Date>>(undefined);\n private readonly internalSelectedStartDate = signal<OptionalType<Date>>(undefined);\n private readonly internalSelectedEndDate = signal<OptionalType<Date>>(undefined);\n private readonly dateService = inject(DateService);\n private rangeSelectionState: 'start' | 'end' = 'start';\n\n ngOnInit(): void {\n this.syncInternalState();\n\n if (this.selectedDate()) {\n this.currentDate.set(new Date(this.selectedDate()!));\n } else if (this.selectedStartDate()) {\n this.currentDate.set(new Date(this.selectedStartDate()!));\n }\n\n this.updateYearRange();\n }\n\n onHeaderClick(): void {\n switch (this.currentView()) {\n case CalendarViewEnum.Days:\n this.currentView.set(CalendarViewEnum.Months);\n break;\n case CalendarViewEnum.Months:\n this.currentView.set(CalendarViewEnum.Years);\n break;\n }\n }\n\n onPreviousClick(): void {\n const current = this.currentDate();\n\n switch (this.currentView()) {\n case CalendarViewEnum.Days:\n this.currentDate.set(this.dateService.addMonths(current, -1));\n this.monthChanged.emit(this.currentDate());\n break;\n case CalendarViewEnum.Months:\n this.currentDate.set(this.dateService.addYears(current, -1));\n break;\n case CalendarViewEnum.Years:\n this.moveYearRange(-12);\n break;\n }\n }\n\n onNextClick(): void {\n const current = this.currentDate();\n\n switch (this.currentView()) {\n case CalendarViewEnum.Days:\n this.currentDate.set(this.dateService.addMonths(current, 1));\n this.monthChanged.emit(this.currentDate());\n break;\n case CalendarViewEnum.Months:\n this.currentDate.set(this.dateService.addYears(current, 1));\n break;\n case CalendarViewEnum.Years:\n this.moveYearRange(12);\n break;\n }\n }\n\n onDateClick(dateModel: CalendarDateModel): void {\n if (!dateModel.isCurrentMonth) {\n return;\n }\n\n if (dateModel.isDisabled) {\n return;\n }\n\n if (this.isRange()) {\n this.handleRangeSelection(dateModel.date);\n } else {\n this.internalSelectedDate.set(dateModel.date);\n this.selected.emit({ selectedDate: dateModel.date });\n }\n }\n\n onMonthClick(monthModel: CalendarMonthModel): void {\n if (monthModel.isDisabled) {\n return;\n }\n\n const newDate = new Date(this.currentYear(), monthModel.monthIndex, 1);\n\n this.currentDate.set(newDate);\n this.currentView.set(CalendarViewEnum.Days);\n this.monthChanged.emit(newDate);\n }\n\n onYearClick(yearModel: CalendarYearModel): void {\n if (yearModel.isDisabled) {\n return;\n }\n\n const newDate = new Date(yearModel.year, this.currentMonth(), 1);\n\n this.currentDate.set(newDate);\n this.currentView.set(CalendarViewEnum.Months);\n }\n\n clearSelection(): void {\n this.internalSelectedDate.set(undefined);\n this.internalSelectedStartDate.set(undefined);\n this.internalSelectedEndDate.set(undefined);\n\n this.rangeSelectionState = 'start';\n\n this.selected.emit(undefined);\n }\n\n private syncInternalState(): void {\n this.internalSelectedDate.set(this.selectedDate());\n this.internalSelectedStartDate.set(this.selectedStartDate());\n this.internalSelectedEndDate.set(this.selectedEndDate());\n }\n\n private handleRangeSelection(selectedDate: Date): void {\n if (this.rangeSelectionState === 'start' || !this.internalSelectedStartDate()) {\n this.internalSelectedStartDate.set(selectedDate);\n this.internalSelectedEndDate.set(undefined);\n this.rangeSelectionState = 'end';\n\n this.selected.emit({ startDate: selectedDate });\n } else {\n const startDate = this.internalSelectedStartDate()!;\n const endDate = selectedDate;\n\n if (this.dateService.compare(selectedDate, startDate) < 0) {\n this.internalSelectedStartDate.set(selectedDate);\n this.internalSelectedEndDate.set(startDate);\n this.selected.emit({\n startDate: selectedDate,\n endDate: startDate\n });\n } else {\n this.internalSelectedEndDate.set(endDate);\n this.selected.emit({\n startDate: startDate,\n endDate: endDate\n });\n }\n\n this.rangeSelectionState = 'start';\n }\n }\n\n private generateCalendarDays(): CalendarDateModel[] {\n const current = this.currentDate();\n const year = current.getFullYear();\n const month = current.getMonth();\n const firstDayOfMonth = new Date(year, month, 1);\n const lastDayOfMonth = new Date(year, month + 1, 0);\n const firstDayOfWeek = firstDayOfMonth.getDay();\n const days: CalendarDateModel[] = [];\n const today = new Date();\n\n if (firstDayOfWeek > 0) {\n const prevMonthLastDay = new Date(year, month, 0);\n const startDate = prevMonthLastDay.getDate() - firstDayOfWeek + 1;\n\n for (let day = startDate; day <= prevMonthLastDay.getDate(); day++) {\n const date = new Date(year, month - 1, day);\n days.push({\n date,\n isCurrentMonth: false,\n isToday: this.dateService.areEqual(date, today),\n isSelected: false,\n isDisabled: true,\n isInRange: false,\n isRangeStart: false,\n isRangeEnd: false\n });\n }\n }\n\n for (let day = 1; day <= lastDayOfMonth.getDate(); day++) {\n const date = new Date(year, month, day);\n days.push({\n date,\n isCurrentMonth: true,\n isToday: this.dateService.areEqual(date, today),\n isSelected: this.isDateSelected(date),\n isDisabled: this.isDateDisabled(date),\n isInRange: this.isDateInRange(date),\n isRangeStart: this.isDateRangeStart(date),\n isRangeEnd: this.isDateRangeEnd(date)\n });\n }\n\n const totalCells = Math.ceil(days.length / 7) * 7;\n const nextMonthDays = totalCells - days.length;\n\n for (let day = 1; day <= nextMonthDays; day++) {\n const date = new Date(year, month + 1, day);\n days.push({\n date,\n isCurrentMonth: false,\n isToday: this.dateService.areEqual(date, today),\n isSelected: false,\n isDisabled: true,\n isInRange: false,\n isRangeStart: false,\n isRangeEnd: false\n });\n }\n\n return days;\n }\n\n private generateCalendarMonths(): CalendarMonthModel[] {\n const currentYear = this.currentYear();\n const currentMonth = this.currentMonth();\n const today = new Date();\n const monthNames = this.dateService.getMonthNames('short');\n\n return monthNames.map((name, index) => ({\n monthIndex: index,\n name: name.toUpperCase(),\n isCurrentMonth: today.getFullYear() === currentYear && today.getMonth() === index,\n isSelected: currentMonth === index,\n isDisabled: this.isMonthDisabled(currentYear, index)\n }));\n }\n\n private generateCalendarYears(): CalendarYearModel[] {\n const range = this.yearRange();\n const currentYear = this.currentYear();\n const today = new Date();\n const years: CalendarYearModel[] = [];\n\n for (let year = range.start; year <= range.end; year++) {\n years.push({\n year,\n isCurrentYear: today.getFullYear() === year,\n isSelected: currentYear === year,\n isDisabled: this.isYearDisabled(year)\n });\n }\n\n return years;\n }\n\n private isDateSelected(date: Date): boolean {\n if (this.isRange()) {\n if (this.internalSelectedStartDate() && this.dateService.areEqual(date, this.internalSelectedStartDate()!)) {\n return true;\n }\n\n return !!(this.internalSelectedEndDate() && this.dateService.areEqual(date, this.internalSelectedEndDate()!));\n } else {\n return this.internalSelectedDate() ? this.dateService.areEqual(date, this.internalSelectedDate()!) : false;\n }\n }\n\n private isDateInRange(date: Date): boolean {\n if (!this.isRange() || !this.internalSelectedStartDate() || !this.internalSelectedEndDate()) {\n return false;\n }\n\n return this.dateService.compare(date, this.internalSelectedStartDate()!) > 0\n && this.dateService.compare(date, this.internalSelectedEndDate()!) < 0;\n }\n\n private isDateRangeStart(date: Date): boolean {\n return this.isRange() && this.internalSelectedStartDate()\n ? this.dateService.areEqual(date, this.internalSelectedStartDate()!)\n : false;\n }\n\n private isDateRangeEnd(date: Date): boolean {\n return this.isRange() && this.internalSelectedEndDate()\n ? this.dateService.areEqual(date, this.internalSelectedEndDate()!)\n : false;\n }\n\n private isDateDisabled(date: Date): boolean {\n if (this.minDate() && this.dateService.compare(date, this.minDate()!) < 0) {\n return true;\n }\n\n if (this.maxDate() && this.dateService.compare(date, this.maxDate()!) > 0) {\n return true;\n }\n\n const filterFn = this.disabledDatesFilter();\n\n if (!!filterFn) {\n return !filterFn(date);\n }\n\n return false;\n }\n\n private isMonthDisabled(year: number, month: number): boolean {\n const firstDayOfMonth = new Date(year, month, 1);\n const lastDayOfMonth = new Date(year, month + 1, 0);\n\n if (this.minDate() && this.dateService.compare(lastDayOfMonth, this.minDate()!) < 0) {\n return true;\n }\n\n return !!(this.maxDate() && this.dateService.compare(firstDayOfMonth, this.maxDate()!) > 0);\n }\n\n private isYearDisabled(year: number): boolean {\n const firstDayOfYear = new Date(year, 0, 1);\n const lastDayOfYear = new Date(year, 11, 31);\n\n if (this.minDate() && this.dateService.compare(lastDayOfYear, this.minDate()!) < 0) {\n return true;\n }\n\n return !!(this.maxDate() && this.dateService.compare(firstDayOfYear, this.maxDate()!) > 0);\n }\n\n private updateYearRange(): void {\n const currentYear = this.currentYear();\n this.yearRange.set({\n start: currentYear - 6,\n end: currentYear + 5\n });\n }\n\n private moveYearRange(offset: number): void {\n const current = this.yearRange();\n this.yearRange.set({\n start: current.start + offset,\n end: current.end + offset\n });\n }\n}\n","<div class=\"calendar\" [class.calendar-border]=\"!shouldRemoveExternalBorder()\">\n <div class=\"calendar-header\">\n <button type=\"button\" class=\"btn btn-sm btn-ghost-secondary\" (click)=\"onPreviousClick()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" stroke-width=\"2\"\n stroke=\"currentColor\" fill=\"none\">\n <path stroke=\"none\" d=\"m0 0h24v24H0z\" fill=\"none\" />\n <path d=\"m15 6-6 6 6 6\" />\n </svg>\n </button>\n\n <button type=\"button\" class=\"btn btn-sm btn-ghost-secondary calendar-title\" (click)=\"onHeaderClick()\">\n @switch (currentView()) {\n @case (CalendarViewEnum.Days) {\n {{ currentMonthName() }}\n }\n @case (CalendarViewEnum.Months) {\n {{ currentYear() }}\n }\n @case (CalendarViewEnum.Years) {\n {{ yearRange().start }} - {{ yearRange().end }}\n }\n }\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"icon ms-1\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" stroke-width=\"2\"\n stroke=\"currentColor\" fill=\"none\">\n <path stroke=\"none\" d=\"m0 0h24v24H0z\" fill=\"none\" />\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n <button type=\"button\" class=\"btn btn-sm btn-ghost-secondary\" (click)=\"onNextClick()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" stroke-width=\"2\"\n stroke=\"currentColor\" fill=\"none\">\n <path stroke=\"none\" d=\"m0 0h24v24H0z\" fill=\"none\" />\n <path d=\"m9 6 6 6-6 6\" />\n </svg>\n </button>\n </div>\n\n @if (currentView() === CalendarViewEnum.Days) {\n <div class=\"calendar-weekdays\">\n @for (dayName of weekDayNames(); track dayName) {\n <div class=\"calendar-weekday\">{{ dayName }}</div>\n }\n </div>\n\n <div class=\"calendar-days\">\n @for (day of calendarDays(); track day.date.getTime()) {\n <button type=\"button\" class=\"calendar-day\" [class.calendar-day-other-month]=\"!day.isCurrentMonth\"\n [class.calendar-day-today]=\"day.isToday\" [class.calendar-day-selected]=\"day.isSelected\"\n [class.calendar-day-in-range]=\"day.isInRange\" [class.calendar-day-range-start]=\"day.isRangeStart\"\n [class.calendar-day-range-end]=\"day.isRangeEnd\" [disabled]=\"day.isDisabled\" (click)=\"onDateClick(day)\">\n {{ day.date.getDate() }}\n </button>\n }\n </div>\n }\n\n @if (currentView() === CalendarViewEnum.Months) {\n <div class=\"calendar-months\">\n @for (month of calendarMonths(); track month.monthIndex) {\n <button type=\"button\" class=\"calendar-month\" [class.calendar-month-current]=\"month.isCurrentMonth\"\n [class.calendar-month-selected]=\"month.isSelected\" [disabled]=\"month.isDisabled\" (click)=\"onMonthClick(month)\">\n {{ month.name }}\n </button>\n }\n </div>\n }\n\n @if (currentView() === CalendarViewEnum.Years) {\n <div class=\"calendar-years\">\n @for (year of calendarYears(); track year.year) {\n <button type=\"button\" class=\"calendar-year\" [class.calendar-year-current]=\"year.isCurrentYear\"\n [class.calendar-year-selected]=\"year.isSelected\" [disabled]=\"year.isDisabled\" (click)=\"onYearClick(year)\">\n {{ year.year }}\n </button>\n }\n </div>\n }\n</div>\n","import { Injectable, signal, Signal } from '@angular/core';\nimport { OptionalType } from '@updevs/sdk/types';\n\nimport { CalendarViewType } from '../types/calendar-view.type';\nimport { DateRangeModel } from '../models/date-range.model';\n\n@Injectable()\nexport class CalendarSignalsService {\n get minDate(): Signal<OptionalType<Date>> {\n return this.minDateSignal.asReadonly();\n }\n set minDate(value: OptionalType<Date>) {\n this.minDateSignal.set(value);\n }\n get maxDate(): Signal<OptionalType<Date>> {\n return this.maxDateSignal.asReadonly();\n }\n set maxDate(value: OptionalType<Date>) {\n this.maxDateSignal.set(value);\n }\n get activeDate(): Signal<Date> {\n return this.activeDateSignal.asReadonly();\n }\n set activeDate(value: Date) {\n this.activeDateSignal.set(value);\n }\n get selectedDate(): Signal<DateRangeModel | OptionalType<Date>> {\n return this.selectedDateSignal.asReadonly();\n }\n set selectedDate(value: OptionalType<DateRangeModel | OptionalType<Date>>) {\n this.selectedDateSignal.set(value);\n }\n get currentView(): Signal<CalendarViewType> {\n return this.currentViewSignal.asReadonly();\n }\n set currentView(value: CalendarViewType) {\n this.currentViewSignal.set(value);\n }\n\n private readonly minDateSignal = signal<OptionalType<Date>>(undefined);\n private readonly maxDateSignal = signal<OptionalType<Date>>(undefined);\n private readonly activeDateSignal = signal<Date>(new Date());\n private readonly selectedDateSignal = signal<DateRangeModel | OptionalType<Date>>(undefined);\n private readonly currentViewSignal = signal<CalendarViewType>('month');\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UpdButtonModule } from '@updevs/components/button';\nimport { UpdIconsModule } from '@updevs/icons';\nimport { TranslocoService, TranslocoDirective } from '@jsverse/transloco';\n\nimport * as en from './assets/i18n/en.json';\nimport * as pt from './assets/i18n/pt.json';\nimport { CalendarSignalsService } from './services/calendar-signals.service';\nimport { CalendarRangeStrategyService } from './services/calendar-range-strategy.service';\nimport { CalendarComponent } from './calendar.component';\n\n@NgModule({\n imports: [\n CommonModule,\n UpdButtonModule,\n TranslocoDirective,\n UpdIconsModule\n ],\n declarations: [\n CalendarComponent\n ],\n exports: [\n CalendarComponent\n ],\n providers: [\n CalendarSignalsService,\n CalendarRangeStrategyService\n ]\n})\nexport class UpdCalendarModule {\n constructor(translocoService: TranslocoService) {\n translocoService.setFallbackLangForMissingTranslation({ fallbackLang: 'en' });\n translocoService.setTranslation(en, 'en');\n translocoService.setTranslation(pt, 'pt');\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["en","pt"],"mappings":"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"}
|
|
@@ -83,16 +83,32 @@ class DropdownComponent extends BaseComponent {
|
|
|
83
83
|
};
|
|
84
84
|
return btn;
|
|
85
85
|
}
|
|
86
|
+
trackByItemId(index, item) {
|
|
87
|
+
return item.id ?? index;
|
|
88
|
+
}
|
|
89
|
+
getButtonClasses(item) {
|
|
90
|
+
const classes = ['dropdown-item'];
|
|
91
|
+
if (item.isDisabled) {
|
|
92
|
+
classes.push('disabled');
|
|
93
|
+
}
|
|
94
|
+
if (item.isActive) {
|
|
95
|
+
classes.push('active');
|
|
96
|
+
}
|
|
97
|
+
return classes.join(' ');
|
|
98
|
+
}
|
|
86
99
|
closeOnOutsideClick() {
|
|
87
|
-
|
|
100
|
+
if (!!this.dropdownOutsideClickSub) {
|
|
101
|
+
this.dropdownOutsideClickSub.unsubscribe();
|
|
102
|
+
}
|
|
103
|
+
const excludedElements = [this.dropdownElement];
|
|
88
104
|
if (!!this.dropdownReference) {
|
|
89
105
|
excludedElements.push(this.dropdownReference.nativeElement);
|
|
90
106
|
}
|
|
91
|
-
|
|
107
|
+
this.dropdownOutsideClickSub = this.domEventsService.startOutsideClickListener(() => this.ngZone.run(() => {
|
|
92
108
|
this.updateOpenState(false);
|
|
93
|
-
this.
|
|
109
|
+
this.updateWrapperClasses();
|
|
94
110
|
}), this.dropdownElement, true, ...excludedElements);
|
|
95
|
-
this.addSubscriptions(
|
|
111
|
+
this.addSubscriptions(this.dropdownOutsideClickSub);
|
|
96
112
|
}
|
|
97
113
|
updateStyle() {
|
|
98
114
|
this.updateWrapperClasses();
|
|
@@ -144,11 +160,11 @@ class DropdownComponent extends BaseComponent {
|
|
|
144
160
|
this.renderer.setStyle(ddElement, 'top', `${result.y}px`, RendererStyleFlags2.Important);
|
|
145
161
|
}
|
|
146
162
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: DropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
147
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: DropdownComponent, selector: "upd-dropdown", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: false, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: false, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: false, isRequired: false, transformFunction: null }, shouldCloseOnOutsideClick: { classPropertyName: "shouldCloseOnOutsideClick", publicName: "shouldCloseOnOutsideClick", isSignal: false, isRequired: false, transformFunction: null }, arrowType: { classPropertyName: "arrowType", publicName: "arrowType", isSignal: false, isRequired: false, transformFunction: null }, wrapperClasses: { classPropertyName: "wrapperClasses", publicName: "wrapperClasses", isSignal: false, isRequired: false, transformFunction: null }, elementsExcludedFromOutsideClick: { classPropertyName: "elementsExcludedFromOutsideClick", publicName: "elementsExcludedFromOutsideClick", isSignal: false, isRequired: false, transformFunction: null }, minHeight: { classPropertyName: "minHeight", publicName: "minHeight", isSignal: false, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: false, isRequired: false, transformFunction: null }, minWidth: { classPropertyName: "minWidth", publicName: "minWidth", isSignal: false, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: false, isRequired: false, transformFunction: null }, dropdownReference: { classPropertyName: "dropdownReference", publicName: "dropdownReference", isSignal: false, isRequired: false, transformFunction: null }, dropdownReferencePosition: { classPropertyName: "dropdownReferencePosition", publicName: "dropdownReferencePosition", isSignal: false, isRequired: false, transformFunction: null }, textOverflowStrategy: { classPropertyName: "textOverflowStrategy", publicName: "textOverflowStrategy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpenChange: "isOpenChange", selectedItem: "selectedItem", checkboxChanged: "checkboxChanged" }, host: { properties: { "class": "this.localWrapperClasses" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (!!header) {\n <h6 class=\"dropdown-header\">{{ header }}</h6>\n}\n\n@for (item of items; track item) {\n @switch (item.type) {\n @case ('divider') {\n <div class=\"dropdown-divider\"></div>\n }\n @case ('default') {\n <upd-button [customClasses]=\"
|
|
163
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: DropdownComponent, selector: "upd-dropdown", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: false, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: false, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: false, isRequired: false, transformFunction: null }, shouldCloseOnOutsideClick: { classPropertyName: "shouldCloseOnOutsideClick", publicName: "shouldCloseOnOutsideClick", isSignal: false, isRequired: false, transformFunction: null }, arrowType: { classPropertyName: "arrowType", publicName: "arrowType", isSignal: false, isRequired: false, transformFunction: null }, wrapperClasses: { classPropertyName: "wrapperClasses", publicName: "wrapperClasses", isSignal: false, isRequired: false, transformFunction: null }, elementsExcludedFromOutsideClick: { classPropertyName: "elementsExcludedFromOutsideClick", publicName: "elementsExcludedFromOutsideClick", isSignal: false, isRequired: false, transformFunction: null }, minHeight: { classPropertyName: "minHeight", publicName: "minHeight", isSignal: false, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: false, isRequired: false, transformFunction: null }, minWidth: { classPropertyName: "minWidth", publicName: "minWidth", isSignal: false, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: false, isRequired: false, transformFunction: null }, dropdownReference: { classPropertyName: "dropdownReference", publicName: "dropdownReference", isSignal: false, isRequired: false, transformFunction: null }, dropdownReferencePosition: { classPropertyName: "dropdownReferencePosition", publicName: "dropdownReferencePosition", isSignal: false, isRequired: false, transformFunction: null }, textOverflowStrategy: { classPropertyName: "textOverflowStrategy", publicName: "textOverflowStrategy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpenChange: "isOpenChange", selectedItem: "selectedItem", checkboxChanged: "checkboxChanged" }, host: { properties: { "class": "this.localWrapperClasses" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (!!header) {\n <h6 class=\"dropdown-header\">{{ header }}</h6>\n}\n\n@for (item of items; track trackByItemId($index, item)) {\n @switch (item.type) {\n @case ('divider') {\n <div class=\"dropdown-divider\"></div>\n }\n @case ('default') {\n <upd-button [customClasses]=\"getButtonClasses(item)\"\n [shouldIgnoreBtnClass]=\"true\" (clicked)=\"onSelect(item)\">\n @if (!!item.icon) {\n <upd-icon [model]=\"item.icon\" customClasses=\"dropdown-item-icon\"></upd-icon>\n }\n\n @if (!!item.leftBoxText || !!item.leftBoxImage) {\n <span style=\"background-image: url({{item.leftBoxImage}})\"\n class=\"avatar avatar-xs rounded me-2\">{{ item.leftBoxText }}</span>\n }\n\n {{ textService.getText(item.text) }}\n\n @if (!!item.badgeColor) {\n <span class=\"badge bg-{{item.badgeColor}} ms-auto\">{{ item.badgeText }}</span>\n }\n </upd-button>\n }\n @case ('radio') {\n <upd-radio (selected)=\"onSelect(item)\" [label]=\"item.text\" [isChecked]=\"item.isChecked || false\"\n [wrapperClasses]=\"'dropdown-item' + (item.isDisabled ? ' disabled' : '') + (item.isActive ? ' active' : '')\"></upd-radio>\n }\n @case ('checkbox') {\n <upd-checkbox (changed)=\"onCheckboxChange(item, $event)\" [label]=\"item.text\" [isChecked]=\"item.isChecked || false\"\n [isSwitch]=\"item.isSwitch || false\"\n [wrapperClasses]=\"'dropdown-item' + (item.isDisabled ? ' disabled' : '') + (item.isActive ? ' active' : '')\"></upd-checkbox>\n }\n @case ('with-toolbar') {\n <div class=\"dropdown-item\" [class.disabled]=\"item.isDisabled\" [class.active]=\"item.isActive\" (click)=\"onSelect(item)\">\n @if (!!item.icon) {\n <upd-icon [model]=\"item.icon\" customClasses=\"dropdown-item-icon\"></upd-icon>\n }\n\n @if (!!item.leftBoxText || !!item.leftBoxImage) {\n <span style=\"background-image: url({{item.leftBoxImage}})\"\n class=\"avatar avatar-xs rounded me-2\">{{ item.leftBoxText }}</span>\n }\n\n <span [ngClass]=\"overflowClass\">\n {{ textService.getText(item.text) }}\n </span>\n\n @if ((item.actionButtons?.length || 0) > 0) {\n <div class=\"ms-auto d-flex\" [class.btn-group]=\"item.toolbarType === 'grouped'\"\n [class.gap-1]=\"item.toolbarType === 'spaced'\">\n @for (btn of item.actionButtons; track btn) {\n <upd-button [model]=\"adaptAction(btn, item)\"></upd-button>\n }\n </div>\n }\n\n @if (!!item.badgeColor) {\n <span class=\"badge bg-{{item.badgeColor}} ms-auto\">{{ item.badgeText }}</span>\n }\n </div>\n }\n }\n}\n\n<ng-content></ng-content>\n", styles: [".dropdown-show{display:inline-block!important;width:100%!important;position:relative;top:0!important;margin-bottom:1rem!important}.dropdown-item>.form-check{margin-bottom:0!important}.dropdown-item{cursor:pointer!important}.dropdown-overflow{overflow-y:auto!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.IconComponent, selector: "upd-icon", inputs: ["model", "wrapperClasses", "color", "colorClass", "removeDefaultClasses", "customClasses", "tablerIcon", "tablerIconWeight", "tablerIconType", "tablerIconSize", "heroIcon", "heroIconSize", "heroIconType"] }, { kind: "component", type: i3.RadioComponent, selector: "upd-radio", inputs: ["wrapperClasses", "value", "customClasses", "isChecked", "isInline"], outputs: ["selected"] }, { kind: "component", type: i4.CheckboxComponent, selector: "upd-checkbox", inputs: ["wrapperClasses", "value", "customClasses", "isChecked", "isInline", "isSwitch", "isIndeterminate"], outputs: ["changed", "isCheckedChange", "isIndeterminateChange"] }, { kind: "component", type: i5.ButtonComponent, selector: "upd-button", inputs: ["model", "text", "brandColorStyle", "customClasses", "isOutline", "isGhost", "isSquare", "isPill", "isIcon", "isLoading", "isList", "isFloating", "isAction", "isNavigationLink", "isLink", "shouldIgnoreBtnClass", "iconModel", "iconPosition", "isDisabled", "isActive", "badgeConfig", "colorStyle", "size", "title"], outputs: ["clicked"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
148
164
|
}
|
|
149
165
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: DropdownComponent, decorators: [{
|
|
150
166
|
type: Component,
|
|
151
|
-
args: [{ selector: 'upd-dropdown', encapsulation: ViewEncapsulation.None, template: "@if (!!header) {\n <h6 class=\"dropdown-header\">{{ header }}</h6>\n}\n\n@for (item of items; track item) {\n @switch (item.type) {\n @case ('divider') {\n <div class=\"dropdown-divider\"></div>\n }\n @case ('default') {\n <upd-button [customClasses]=\"
|
|
167
|
+
args: [{ selector: 'upd-dropdown', encapsulation: ViewEncapsulation.None, template: "@if (!!header) {\n <h6 class=\"dropdown-header\">{{ header }}</h6>\n}\n\n@for (item of items; track trackByItemId($index, item)) {\n @switch (item.type) {\n @case ('divider') {\n <div class=\"dropdown-divider\"></div>\n }\n @case ('default') {\n <upd-button [customClasses]=\"getButtonClasses(item)\"\n [shouldIgnoreBtnClass]=\"true\" (clicked)=\"onSelect(item)\">\n @if (!!item.icon) {\n <upd-icon [model]=\"item.icon\" customClasses=\"dropdown-item-icon\"></upd-icon>\n }\n\n @if (!!item.leftBoxText || !!item.leftBoxImage) {\n <span style=\"background-image: url({{item.leftBoxImage}})\"\n class=\"avatar avatar-xs rounded me-2\">{{ item.leftBoxText }}</span>\n }\n\n {{ textService.getText(item.text) }}\n\n @if (!!item.badgeColor) {\n <span class=\"badge bg-{{item.badgeColor}} ms-auto\">{{ item.badgeText }}</span>\n }\n </upd-button>\n }\n @case ('radio') {\n <upd-radio (selected)=\"onSelect(item)\" [label]=\"item.text\" [isChecked]=\"item.isChecked || false\"\n [wrapperClasses]=\"'dropdown-item' + (item.isDisabled ? ' disabled' : '') + (item.isActive ? ' active' : '')\"></upd-radio>\n }\n @case ('checkbox') {\n <upd-checkbox (changed)=\"onCheckboxChange(item, $event)\" [label]=\"item.text\" [isChecked]=\"item.isChecked || false\"\n [isSwitch]=\"item.isSwitch || false\"\n [wrapperClasses]=\"'dropdown-item' + (item.isDisabled ? ' disabled' : '') + (item.isActive ? ' active' : '')\"></upd-checkbox>\n }\n @case ('with-toolbar') {\n <div class=\"dropdown-item\" [class.disabled]=\"item.isDisabled\" [class.active]=\"item.isActive\" (click)=\"onSelect(item)\">\n @if (!!item.icon) {\n <upd-icon [model]=\"item.icon\" customClasses=\"dropdown-item-icon\"></upd-icon>\n }\n\n @if (!!item.leftBoxText || !!item.leftBoxImage) {\n <span style=\"background-image: url({{item.leftBoxImage}})\"\n class=\"avatar avatar-xs rounded me-2\">{{ item.leftBoxText }}</span>\n }\n\n <span [ngClass]=\"overflowClass\">\n {{ textService.getText(item.text) }}\n </span>\n\n @if ((item.actionButtons?.length || 0) > 0) {\n <div class=\"ms-auto d-flex\" [class.btn-group]=\"item.toolbarType === 'grouped'\"\n [class.gap-1]=\"item.toolbarType === 'spaced'\">\n @for (btn of item.actionButtons; track btn) {\n <upd-button [model]=\"adaptAction(btn, item)\"></upd-button>\n }\n </div>\n }\n\n @if (!!item.badgeColor) {\n <span class=\"badge bg-{{item.badgeColor}} ms-auto\">{{ item.badgeText }}</span>\n }\n </div>\n }\n }\n}\n\n<ng-content></ng-content>\n", styles: [".dropdown-show{display:inline-block!important;width:100%!important;position:relative;top:0!important;margin-bottom:1rem!important}.dropdown-item>.form-check{margin-bottom:0!important}.dropdown-item{cursor:pointer!important}.dropdown-overflow{overflow-y:auto!important}\n"] }]
|
|
152
168
|
}], ctorParameters: () => [], propDecorators: { localWrapperClasses: [{
|
|
153
169
|
type: HostBinding,
|
|
154
170
|
args: ['class']
|