UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

716 lines 90.5 kB
import { __decorate, __metadata } from "tslib"; import { Component, EventEmitter, Injector, Input, Output } from '@angular/core'; import { DateType } from '@microsoft/windows-admin-center-sdk/core/base/date/date-type'; import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators'; import { Yield } from '@microsoft/windows-admin-center-sdk/core/base/decorators/yield.decorator'; import { KeyCode } from '@microsoft/windows-admin-center-sdk/core/data/accessibility-manager'; import { Globalization } from '@microsoft/windows-admin-center-sdk/core/data/globalization'; import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom'; import { DateLikeFormFieldComponent } from '../date-like/date-like-form-field.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../../../tooltip/tooltip.directive"; import * as i3 from "../../validation-alert/validation-alert.component"; import * as i4 from "../../form-field-layout/form-field-layout.component"; const _c0 = ["type", "clock"]; function ClockFormFieldComponent_button_6_Template(rf, ctx) { if (rf & 1) { const _r7 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 10); i0.ɵɵlistener("click", function ClockFormFieldComponent_button_6_Template_button_click_0_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r7); const hour_r5 = restoredCtx.$implicit; const ctx_r6 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r6.onHourClicked($event, hour_r5)); })("keydown", function ClockFormFieldComponent_button_6_Template_button_keydown_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r8 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r8.onHourKeydown($event)); }); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const hour_r5 = ctx.$implicit; const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵclassProp("sme-selected", hour_r5.isSelected); i0.ɵɵproperty("tabindex", hour_r5.isSelected ? 0 : -1); i0.ɵɵattribute("aria-label", ctx_r0.strings.MsftSmeShell.Angular.Clock.Headings.hour + hour_r5.display); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(hour_r5.display); } } function ClockFormFieldComponent_button_10_Template(rf, ctx) { if (rf & 1) { const _r11 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 10); i0.ɵɵlistener("click", function ClockFormFieldComponent_button_10_Template_button_click_0_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r11); const minute_r9 = restoredCtx.$implicit; const ctx_r10 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r10.onMinuteClicked($event, minute_r9)); })("keydown", function ClockFormFieldComponent_button_10_Template_button_keydown_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r12 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r12.onMinuteKeydown($event)); }); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const minute_r9 = ctx.$implicit; const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵclassProp("sme-selected", minute_r9.isSelected); i0.ɵɵproperty("tabindex", minute_r9.isSelected ? 0 : -1); i0.ɵɵattribute("aria-label", ctx_r1.strings.MsftSmeShell.Angular.Clock.Headings.minute + minute_r9.display); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(minute_r9.display); } } function ClockFormFieldComponent_div_11_button_3_Template(rf, ctx) { if (rf & 1) { const _r16 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 10); i0.ɵɵlistener("click", function ClockFormFieldComponent_div_11_button_3_Template_button_click_0_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r16); const meridiem_r14 = restoredCtx.$implicit; const ctx_r15 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r15.onMeridiemClicked($event, meridiem_r14.value)); })("keydown", function ClockFormFieldComponent_div_11_button_3_Template_button_keydown_0_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r17 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r17.onMeridiemKeydown($event)); }); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const meridiem_r14 = ctx.$implicit; i0.ɵɵclassMapInterpolate1("sme-clock-meridiem-", meridiem_r14.value, ""); i0.ɵɵclassProp("sme-selected", meridiem_r14.isSelected); i0.ɵɵproperty("tabindex", meridiem_r14.isSelected ? 0 : -1); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(meridiem_r14.display); } } function ClockFormFieldComponent_div_11_Template(rf, ctx) { if (rf & 1) { const _r19 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 11); i0.ɵɵlistener("wheel", function ClockFormFieldComponent_div_11_Template_div_wheel_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r18 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r18.onMeridiemWheel($event)); })("scroll", function ClockFormFieldComponent_div_11_Template_div_scroll_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r20 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r20.onColumnScroll($event)); }); i0.ɵɵelementStart(1, "div", 4); i0.ɵɵtext(2); i0.ɵɵelementEnd(); i0.ɵɵtemplate(3, ClockFormFieldComponent_div_11_button_3_Template, 2, 7, "button", 12); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(ctx_r2.strings.MsftSmeShell.Angular.Clock.Headings.meridiem); i0.ɵɵadvance(1); i0.ɵɵproperty("ngForOf", ctx_r2.meridiems); } } function ClockFormFieldComponent_div_12_Template(rf, ctx) { if (rf & 1) { const _r22 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 13)(1, "button", 14); i0.ɵɵlistener("click", function ClockFormFieldComponent_div_12_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r22); const ctx_r21 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r21.onAcceptClicked($event)); }); i0.ɵɵelement(2, "span", 15); i0.ɵɵelementEnd(); i0.ɵɵelementStart(3, "button", 14); i0.ɵɵlistener("click", function ClockFormFieldComponent_div_12_Template_button_click_3_listener($event) { i0.ɵɵrestoreView(_r22); const ctx_r23 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r23.cleared.emit($event)); }); i0.ɵɵelement(4, "span", 16); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵproperty("title", ctx_r3.strings.MsftSmeShell.Angular.Common.apply); i0.ɵɵattribute("aria-label", ctx_r3.strings.MsftSmeShell.Angular.Common.apply); i0.ɵɵadvance(2); i0.ɵɵproperty("title", ctx_r3.strings.MsftSmeShell.Angular.Common.clear); i0.ɵɵattribute("aria-label", ctx_r3.strings.MsftSmeShell.Angular.Common.clear); } } function ClockFormFieldComponent_sme_validation_alert_13_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-validation-alert", 17); } if (rf & 2) { const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵproperty("alert", ctx_r4.alert); } } export var Meridiem; (function (Meridiem) { Meridiem["AM"] = "am"; Meridiem["PM"] = "pm"; })(Meridiem || (Meridiem = {})); /** * Clock Form Field Component */ export class ClockFormFieldComponent extends DateLikeFormFieldComponent { /** * Initializes a new instance of the @see ClockFormFieldComponent class. * @param injector The angular injection service. required by @see SmeInjectableBase decorator in the @see BaseComponent class */ constructor(injector) { super(injector); /** * Return the maximum number of minutes in an hour */ this.maxMinutes = 60; this.showConfirmation = false; this.accepted = new EventEmitter(); this.cleared = new EventEmitter(); /** * Current spun hour and the pivot point */ this.spinHour = { value: null, pivot: null }; /** * Current spun minute and the pivot point */ this.spinMinute = { value: null, pivot: null }; /** * Answers, is user currently scrolling down? */ this.isScrollDown = false; this.hours = []; this.minutes = []; this.localeDateFormat = Intl.DateTimeFormat(Globalization.localeId); this.localeDateFormatOptions = this.localeDateFormat.resolvedOptions(); } /** * Const getter for The visible number of rows for the clock component. */ static get visibleRowCount() { // Change this to change how many rows show in the UX return 7; } /** * Returns maximum number of hours depending of the hour format */ get maxHours() { return this.use12HourFormat ? 12 : 24; } /** * The source name to use for logging */ get logSourceName() { return 'ClockFormFieldComponent'; } /** * Gets the selected hours */ get viewportHour() { return this.viewportTime ? this.getParsedHour(this.viewportTime.getHours()) : null; } /** * Gets the selected minutes */ get viewportMinute() { return this.viewportTime ? this.viewportTime.getMinutes() : null; } /** * indicates the meridiem of the current time */ get viewportMeridiem() { if (!this.use12HourFormat) { return null; } // 00 to 11 is am, 12 to 23 is pm return this.viewportTime ? this.viewportTime.getHours() >= 12 ? Meridiem.PM : Meridiem.AM : null; } get use12HourFormat() { // this is left null in some 12 hour format locales in chrome, explicitly check for false return this.localeDateFormatOptions.hour12 !== false; } /** * A workaround to have Screen reader know this is a required "input" field. */ get ariaLabel() { if (this.required) { return this.strings.MsftSmeShell.Angular.Clock.AriaLabel.Required.format(this.label); } return this.label; } /** * Implementation of angular OnInit interface */ ngOnInit() { super.ngOnInit(); // Default time on clock is the current time this.viewportTime = new Date(); this.generateTimeColumns(); } /** * Indicates if a given day is selected */ isMeridiemSelected(value) { return this.viewportMeridiem === value; } /** * Occurs when an hour is clicked */ onHourClicked(event, hour) { this.setHour(this.convertTo24Hours(hour.value, this.viewportMeridiem)); event.preventDefault(); event.stopPropagation(); } /** * Occurs when a key is pressed down on a hour block */ onHourKeydown(event) { switch (event.keyCode) { case KeyCode.UpArrow: { this.isScrollDown = false; this.goToPreviousHour(); break; } case KeyCode.DownArrow: { this.isScrollDown = true; this.goToNextHour(); break; } case KeyCode.Enter: { this.focusOnHostElement(); return; } default: { return; } } event.preventDefault(); event.stopPropagation(); } /** * Occurs when the mouse wheel is moved on the hour column */ onHourWheel(event) { this.handleWheelSpin(event, this.hours, this.maxHours, hour => { this.spinHour = hour; }); event.preventDefault(); event.stopPropagation(); } /** * Occurs when any column is scrolled */ onColumnScroll(event) { event.preventDefault(); event.stopPropagation(); } /** * Selected the previous hour block from the current one */ goToPreviousHour() { const previousHour = this.getPreviousValue(this.viewportHour, 1, this.maxHours); this.setHour(this.convertTo24Hours(previousHour, this.viewportMeridiem)); } /** * Selected the next hour block from the current one */ goToNextHour() { const nextHour = this.getNextValue(this.viewportHour, 1, this.maxHours); this.setHour(this.convertTo24Hours(nextHour, this.viewportMeridiem)); } /** * Sets the hour from a time block */ setHour(hour) { const valueTime = this.viewportTime; valueTime.setHours(hour); this.spinHour = { value: null, pivot: null }; this.updateValueOrViewPortTime(valueTime, this.showConfirmation); } /** * Occurs when an minute is clicked */ onMinuteClicked(event, minute) { this.setMinute(minute.value); event.preventDefault(); event.stopPropagation(); } /** * Occurs when a key is pressed down on a minute block */ onMinuteKeydown(event) { switch (event.keyCode) { case KeyCode.UpArrow: { this.isScrollDown = false; this.goToPreviousMinute(); break; } case KeyCode.DownArrow: { this.isScrollDown = true; this.goToNextMinute(); break; } case KeyCode.Enter: { this.focusOnHostElement(); return; } default: { return; } } event.preventDefault(); event.stopPropagation(); } /** * Occurs when the mouse wheel is moved on the minute column */ onMinuteWheel(event) { this.handleWheelSpin(event, this.minutes, this.maxMinutes, minute => { this.spinMinute = minute; }); event.preventDefault(); event.stopPropagation(); } /** * Selected the previous minute block from the current one */ goToPreviousMinute() { const previousMinute = this.getPreviousValue(this.viewportMinute, 1, this.maxMinutes); this.setMinute(previousMinute); } /** * Selected the next minute block from the current one */ goToNextMinute() { const nextMinute = this.getNextValue(this.viewportMinute, 1, this.maxMinutes); this.setMinute(nextMinute); } /** * Sets the minute from a time block */ setMinute(minute) { const valueTime = this.viewportTime; valueTime.setMinutes(minute); this.spinMinute = { value: null, pivot: null }; this.updateValueOrViewPortTime(valueTime, this.showConfirmation); } /** * Parse an hour depending on the current format */ getParsedHour(value) { return this.use12HourFormat ? value % 12 : value; } /** * Convert a 12 hour system value to twenty four hour */ convertTo24Hours(hour, meridiem) { if (meridiem === Meridiem.PM) { return hour + 12; } return hour; } /** * Occurs when an meridiem is clicked */ onMeridiemClicked(event, meridiem) { this.setMeridiem(meridiem); event.preventDefault(); event.stopPropagation(); } /** * Occurs when a key is pressed down on a meridiem block */ onMeridiemKeydown(event) { switch (event.keyCode) { case KeyCode.UpArrow: case KeyCode.DownArrow: { this.toggleMeridiem(); break; } case KeyCode.Enter: { this.focusOnHostElement(); return; } default: { return; } } event.preventDefault(); event.stopPropagation(); } /** * Occurs when the mouse wheel is moved on the meridiem column */ onMeridiemWheel(event) { event.preventDefault(); event.stopPropagation(); } /** * Toggles the meridiem between AM and PM. No-Op if meridiem is not valid in the current locale */ toggleMeridiem(meridiem) { if (!this.use12HourFormat) { return; } if (!meridiem) { meridiem = this.isMeridiemSelected(Meridiem.AM) ? Meridiem.PM : Meridiem.AM; } this.setMeridiem(meridiem); } /** * Sets the meridiem to either AM or PM. No-Op if meridiem is not valid in the current locale */ setMeridiem(meridiem) { if (!this.use12HourFormat) { return; } const valueTime = this.viewportTime; valueTime.setHours(this.convertTo24Hours(this.viewportHour, meridiem)); this.updateValueOrViewPortTime(valueTime, this.showConfirmation); } /** * Called when accept button is clicked to commit changes */ onAcceptClicked(event) { this.value = DateType.convert(this.viewportTime, MsftSme.isNullOrUndefined(this.dateType) ? this.detectedDateType : this.dateType); this.accepted.emit(event); } /** * Updates either the form value or the viewport value depending on whether the value should be persisted */ updateValueOrViewPortTime(value, setViewPort) { if (!setViewPort) { this.value = DateType.convert(value, MsftSme.isNullOrUndefined(this.dateType) ? this.detectedDateType : this.dateType); return; } this.viewportTime = value; this.generateTimeColumns(); } /** * Occurs every time the value of the control changes, in the UI or programmatically. * @param value the value of the form control */ onValueChanged(value) { super.onValueChanged(value); const valueAsDate = DateType.convert(value, DateType.Date); if (value) { this.viewportTime = valueAsDate; } if (value) { this.generateTimeColumns(); } } /** * Performs validation that is internal to this control * @param c The form control attached to this instance */ validate(c) { return this.validateAsTime(c) || super.validate(c); } /** * Handles the wheel spin on columns. No value selection is made mimicking the behavior in Chromium Edge */ handleWheelSpin(event, column, max, setSpinValue) { const isScrollUp = event.deltaY < 0; const newSpinValue = isScrollUp ? this.getNextValue(column[column.length - 1].value, 1, max) : this.getPreviousValue(column[0].value, 1, max); setSpinValue({ value: newSpinValue, pivot: isScrollUp ? column.length - 1 : 0 }); this.generateTimeColumns(); } /** * Applies the focus to a the hours column */ focusOnHours() { this.focusOnColumn('.sme-clock-column-hours'); } /** * Applies the focus to a the minutes column */ focusOnMinute() { this.focusOnColumn('.sme-clock-column-minutes'); } /** * Applies the focus to a the meridiem column */ focusOnMeridiem() { this.focusOnColumn('.sme-clock-column-meridiem'); } /** * Applies the focus to a column */ focusOnColumn(columnClass) { const element = this.hostElement.nativeElement.querySelector(columnClass); if (element) { const focusElement = Dom.getFirstFocusableDescendent(element); if (focusElement) { focusElement.focus(); } } return element; } /** * Applies the focus to the current element */ focus() { this.focusOnHours(); } /** * Applies the focus to the host element when the clock retracts */ focusOnHostElement() { const focusElement = Dom.getNextFocusableElement(this.hostElement.nativeElement); if (focusElement) { focusElement.focus(); } } /** * Generates the current view */ generateTimeColumns() { if (!this.viewportTime) { this.hours = []; this.minutes = []; return; } // check if focus exists in our control so we can restore it when we are done. const columnToFocus = MsftSme.find([ { name: 'hours', focus: () => this.focusOnHours() }, { name: 'minutes', focus: () => this.focusOnMinute() }, { name: 'meridiem', focus: () => this.focusOnMeridiem() } ], column => { const element = this.hostElement.nativeElement.querySelector(`.sme-clock-column-${column.name} .sme-selected`); return document.activeElement === element; }); if (!this.initialMeridiem) { this.initialMeridiem = this.viewportMeridiem; } const altMeridiem = Meridiem.AM === this.initialMeridiem ? Meridiem.PM : Meridiem.AM; const amLabel = this.strings.MsftSmeShell.Angular.Clock.Meridiem.AM.label; const pmLabel = this.strings.MsftSmeShell.Angular.Clock.Meridiem.PM.label; let initialMeridiemLabel; let altMeridiemLabel; if (Meridiem.AM === this.initialMeridiem) { initialMeridiemLabel = amLabel; altMeridiemLabel = pmLabel; } else { initialMeridiemLabel = pmLabel; altMeridiemLabel = amLabel; } this.meridiems = [ { display: initialMeridiemLabel, value: this.initialMeridiem, isSelected: this.isMeridiemSelected(this.initialMeridiem) }, { display: altMeridiemLabel, value: altMeridiem, isSelected: this.isMeridiemSelected(altMeridiem) } ]; const selectedHour = this.viewportHour; const currentHour = MsftSme.isNullOrUndefined(this.spinHour.value) ? selectedHour : this.spinHour.value; this.hours = this.generateTimeWindow(currentHour, this.maxHours, this.hours.findIndex((hour) => hour.value === selectedHour), this.spinHour.pivot).map(hour => { // display value is padded to 2 digits let displayValue = `0${hour}`.slice(-2); if (this.use12HourFormat) { if (hour === 0) { displayValue = '12'; } } const block = { display: displayValue, value: hour, isSelected: hour === selectedHour }; return block; }); const currentMinute = MsftSme.isNullOrUndefined(this.spinMinute.value) ? this.viewportMinute : this.spinMinute.value; this.minutes = this.generateTimeWindow(currentMinute, this.maxMinutes, this.minutes.findIndex((minute) => minute.value === this.viewportMinute), this.spinMinute.pivot).map(minute => ({ // display value is padded to 2 digits display: `0${minute}`.slice(-2), value: minute, isSelected: minute === this.viewportMinute })); if (columnToFocus) { window.requestAnimationFrame(() => { columnToFocus.focus(); }); } } /** * Returns the next value after a given step in a cycle * @param currentValue current value in the cycle * @param step value of steps to move * @param maxValue max value in the cycle */ getNextValue(currentValue, step, maxValue) { const nextValue = currentValue + step; if (nextValue >= maxValue) { return nextValue % maxValue; } return nextValue; } /** * Returns the previous value after a given step in a cycle * @param currentValue current value in the cycle * @param step value of steps to move * @param maxValue max value in the cycle */ getPreviousValue(currentValue, step, maxValue) { const prevValue = currentValue - step; if (prevValue < 0) { return maxValue + prevValue; } return prevValue; } /** * Generates a series of numbers representing a cyclic window in time given a center (current value) and max value */ generateTimeWindow(currentValue, max, currentValueIndex, spinPivot) { // generate window based on 0 if value is invalid (occurs when form field value is null or undefined) if (isNaN(currentValue) || MsftSme.isNullOrUndefined(currentValue)) { currentValue = 0; } const visibleRows = ClockFormFieldComponent.visibleRowCount; const minIndex = 0; const maxIndex = visibleRows - 1; let pivotPoint = this.isScrollDown ? maxIndex : minIndex; if (currentValueIndex !== -1) { // if current value still in the window pivotPoint = currentValueIndex; } if (!MsftSme.isNullOrUndefined(spinPivot)) { // if wheel spinning pivotPoint = spinPivot; } const timeWindow = new Array(visibleRows).fill(null).map((_, i) => { if (i === pivotPoint) { return currentValue; } else if (i < pivotPoint) { const steps = pivotPoint - i; return this.getPreviousValue(currentValue, steps, max); } else { const steps = i - pivotPoint; return this.getNextValue(currentValue, steps, max); } }); return timeWindow; } } /** @nocollapse */ ClockFormFieldComponent.ɵfac = function ClockFormFieldComponent_Factory(t) { return new (t || ClockFormFieldComponent)(i0.ɵɵdirectiveInject(i0.Injector)); }; /** @nocollapse */ ClockFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: ClockFormFieldComponent, selectors: [["sme-form-field", "type", "clock"]], inputs: { showConfirmation: "showConfirmation" }, outputs: { accepted: "accepted", cleared: "cleared" }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c0, decls: 14, vars: 9, consts: [["role", "region", 3, "formField"], [1, "sme-clock", "sme-focus-zone", "sme-form-field-editor"], [1, "sme-clock-main-content"], [1, "sme-clock-column", "sme-clock-column-hours", 3, "wheel", "scroll"], [1, "sme-clock-column-header"], ["type", "button", 3, "sme-selected", "tabindex", "click", "keydown", 4, "ngFor", "ngForOf"], [1, "sme-clock-column", "sme-clock-column-minutes", 3, "wheel", "scroll"], ["class", "sme-clock-column sme-clock-column-meridiem", 3, "wheel", "scroll", 4, "ngIf"], ["class", "sme-clock-confirmation", 4, "ngIf"], [3, "alert", 4, "ngIf"], ["type", "button", 3, "tabindex", "click", "keydown"], [1, "sme-clock-column", "sme-clock-column-meridiem", 3, "wheel", "scroll"], ["type", "button", 3, "class", "sme-selected", "tabindex", "click", "keydown", 4, "ngFor", "ngForOf"], [1, "sme-clock-confirmation"], ["type", "button", "tabindex", "0", 3, "title", "click"], [1, "sme-icon", "sme-icon-size-xxs", "sme-icon-accept"], [1, "sme-icon", "sme-icon-size-xxs", "sme-icon-clear"], [3, "alert"]], template: function ClockFormFieldComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "sme-form-field-layout", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3); i0.ɵɵlistener("wheel", function ClockFormFieldComponent_Template_div_wheel_3_listener($event) { return ctx.onHourWheel($event); })("scroll", function ClockFormFieldComponent_Template_div_scroll_3_listener($event) { return ctx.onColumnScroll($event); }); i0.ɵɵelementStart(4, "div", 4); i0.ɵɵtext(5); i0.ɵɵelementEnd(); i0.ɵɵtemplate(6, ClockFormFieldComponent_button_6_Template, 2, 5, "button", 5); i0.ɵɵelementEnd(); i0.ɵɵelementStart(7, "div", 6); i0.ɵɵlistener("wheel", function ClockFormFieldComponent_Template_div_wheel_7_listener($event) { return ctx.onMinuteWheel($event); })("scroll", function ClockFormFieldComponent_Template_div_scroll_7_listener($event) { return ctx.onColumnScroll($event); }); i0.ɵɵelementStart(8, "div", 4); i0.ɵɵtext(9); i0.ɵɵelementEnd(); i0.ɵɵtemplate(10, ClockFormFieldComponent_button_10_Template, 2, 5, "button", 5); i0.ɵɵelementEnd(); i0.ɵɵtemplate(11, ClockFormFieldComponent_div_11_Template, 4, 2, "div", 7); i0.ɵɵelementEnd(); i0.ɵɵtemplate(12, ClockFormFieldComponent_div_12_Template, 5, 4, "div", 8); i0.ɵɵelementEnd(); i0.ɵɵtemplate(13, ClockFormFieldComponent_sme_validation_alert_13_Template, 1, 1, "sme-validation-alert", 9); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵproperty("formField", ctx); i0.ɵɵattribute("aria-label", ctx.ariaLabel); i0.ɵɵadvance(5); i0.ɵɵtextInterpolate(ctx.strings.MsftSmeShell.Angular.Clock.Headings.hour); i0.ɵɵadvance(1); i0.ɵɵproperty("ngForOf", ctx.hours); i0.ɵɵadvance(3); i0.ɵɵtextInterpolate(ctx.strings.MsftSmeShell.Angular.Clock.Headings.minute); i0.ɵɵadvance(1); i0.ɵɵproperty("ngForOf", ctx.minutes); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !!ctx.viewportMeridiem); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.showConfirmation); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !ctx.compact); } }, dependencies: [i1.NgForOf, i1.NgIf, i2.TooltipDirective, i3.ValidationAlertComponent, i4.FormFieldLayoutComponent], encapsulation: 2 }); __decorate([ Debounce(10), __metadata("design:type", Function), __metadata("design:paramtypes", [WheelEvent, Array, Number, Function]), __metadata("design:returntype", void 0) ], ClockFormFieldComponent.prototype, "handleWheelSpin", null); __decorate([ Yield(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], ClockFormFieldComponent.prototype, "focusOnHostElement", null); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ClockFormFieldComponent, [{ type: Component, args: [{ selector: 'sme-form-field[type="clock"]', template: "<sme-form-field-layout [formField]=\"this\" role=\"region\" [attr.aria-label]=\"ariaLabel\">\r\n <div class=\"sme-clock sme-focus-zone sme-form-field-editor \">\r\n <div class=\"sme-clock-main-content\">\r\n <div class=\"sme-clock-column sme-clock-column-hours\" (wheel)=\"onHourWheel($event)\"\r\n (scroll)=\"onColumnScroll($event)\">\r\n <div class=\"sme-clock-column-header\">{{this.strings.MsftSmeShell.Angular.Clock.Headings.hour}}</div>\r\n <button type=\"button\" *ngFor=\"let hour of hours\" [class.sme-selected]=\"hour.isSelected\" [tabindex]=\"hour.isSelected ? 0 : -1\"\r\n (click)=\"onHourClicked($event, hour)\" (keydown)=\"onHourKeydown($event)\" [attr.aria-label]=\"strings.MsftSmeShell.Angular.Clock.Headings.hour + hour.display\">{{hour.display}}</button>\r\n </div>\r\n <div class=\"sme-clock-column sme-clock-column-minutes\" (wheel)=\"onMinuteWheel($event)\"\r\n (scroll)=\"onColumnScroll($event)\">\r\n <div class=\"sme-clock-column-header\">{{this.strings.MsftSmeShell.Angular.Clock.Headings.minute}}</div>\r\n <button type=\"button\" *ngFor=\"let minute of minutes\" [class.sme-selected]=\"minute.isSelected\"\r\n [tabindex]=\"minute.isSelected ? 0 : -1\" (click)=\"onMinuteClicked($event, minute)\"\r\n (keydown)=\"onMinuteKeydown($event)\" [attr.aria-label]=\"strings.MsftSmeShell.Angular.Clock.Headings.minute + minute.display\">{{minute.display}}</button>\r\n </div>\r\n <div *ngIf=\"!!viewportMeridiem\" class=\"sme-clock-column sme-clock-column-meridiem\"\r\n (wheel)=\"onMeridiemWheel($event)\" (scroll)=\"onColumnScroll($event)\">\r\n <div class=\"sme-clock-column-header\">{{this.strings.MsftSmeShell.Angular.Clock.Headings.meridiem}}</div>\r\n <button type=\"button\" *ngFor=\"let meridiem of meridiems\" class=\"sme-clock-meridiem-{{meridiem.value}}\"\r\n [class.sme-selected]=\"meridiem.isSelected\" [tabindex]=\"meridiem.isSelected ? 0 : -1\"\r\n (click)=\"onMeridiemClicked($event, meridiem.value)\"\r\n (keydown)=\"onMeridiemKeydown($event)\">{{meridiem.display}}</button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"showConfirmation\" class=\"sme-clock-confirmation\">\r\n <button type=\"button\" [title]=\"this.strings.MsftSmeShell.Angular.Common.apply\"\r\n [attr.aria-label]=\"this.strings.MsftSmeShell.Angular.Common.apply\" tabindex=\"0\"\r\n (click)=\"onAcceptClicked($event)\">\r\n <span class=\"sme-icon sme-icon-size-xxs sme-icon-accept\"></span>\r\n </button>\r\n <button type=\"button\" [title]=\"this.strings.MsftSmeShell.Angular.Common.clear\"\r\n [attr.aria-label]=\"this.strings.MsftSmeShell.Angular.Common.clear\" tabindex=\"0\"\r\n (click)=\"cleared.emit($event)\">\r\n <span class=\"sme-icon sme-icon-size-xxs sme-icon-clear\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n <sme-validation-alert *ngIf=\"!compact\" [alert]=\"alert\"></sme-validation-alert>\r\n</sme-form-field-layout>\r\n" }] }], function () { return [{ type: i0.Injector }]; }, { showConfirmation: [{ type: Input }], accepted: [{ type: Output }], cleared: [{ type: Output }], handleWheelSpin: [], focusOnHostElement: [] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvY2stZm9ybS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvY2xvY2svY2xvY2stZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvY2xvY2svY2xvY2stZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFDakcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUM1RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFFdkUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7Ozs7Ozs7OztJQ0hqRixrQ0FDb0s7SUFBNUosd09BQVMsZUFBQSxxQ0FBMkIsQ0FBQSxJQUFDLG9LQUFZLGVBQUEsNEJBQXFCLENBQUEsSUFBakM7SUFBdUgsWUFBZ0I7SUFBQSxpQkFBUzs7OztJQUQ1SSxrREFBc0M7SUFBQyxzREFBcUM7SUFDN0MsdUdBQW1GO0lBQUMsZUFBZ0I7SUFBaEIscUNBQWdCOzs7O0lBS3BMLGtDQUVvSTtJQURwRiw2T0FBUyxl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