@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
716 lines • 90.5 kB
JavaScript
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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