@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
540 lines • 82.8 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, ContentChildren, ElementRef, EventEmitter, Injector, Input, Output, QueryList, ViewChild } from '@angular/core';
import { DateRange } from '@microsoft/windows-admin-center-sdk/core/base/date/date-range';
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 { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom';
import { DropdownComponent } from '../../../dropdown/dropdown.component';
import { DropdownService } from '../../../dropdown/dropdown.service';
import { ValidationAlertSeverity } from '../../validation-alert/validation-alert';
import { DateTimeFormFieldComponent } from '../datetime/datetime-form-field.component';
import { SmeInternalFormFieldComponent } from '../form-field.component';
import { DateTimeRangeOptionComponent } from './datetime-range-option.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "../../../dropdown/dropdown.component";
import * as i4 from "../datetime/datetime-form-field.component";
import * as i5 from "../../validation-alert/validation-alert.component";
import * as i6 from "../form-field-accessor.directive";
import * as i7 from "../form-field-validator.directive";
import * as i8 from "../../fieldset/fieldset.directive";
import * as i9 from "../../form-field-layout/form-field-layout.component";
const _c0 = ["listbox"];
const _c1 = ["dropDown"];
const _c2 = ["startFormField"];
const _c3 = ["endFormField"];
const _c4 = ["type", "datetimerange"];
function DateTimeRangeFormFieldComponent_ng_container_11_ng_container_1_Template(rf, ctx) { if (rf & 1) {
const _r11 = i0.ɵɵgetCurrentView();
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "div", 16)(2, "label")(3, "input", 17);
i0.ɵɵlistener("click", function DateTimeRangeFormFieldComponent_ng_container_11_ng_container_1_Template_input_click_3_listener() { const restoredCtx = i0.ɵɵrestoreView(_r11); const option_r8 = restoredCtx.$implicit; const ctx_r10 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r10.updateValue(option_r8.dateRange)); })("keydown", function DateTimeRangeFormFieldComponent_ng_container_11_ng_container_1_Template_input_keydown_3_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r12 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r12.onRadioGroupOptionKeydown($event)); });
i0.ɵɵelementEnd();
i0.ɵɵelementStart(4, "span", 18);
i0.ɵɵtext(5);
i0.ɵɵelementEnd()()();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const option_r8 = ctx.$implicit;
const ctx_r7 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(3);
i0.ɵɵproperty("checked", ctx_r7.isSelected(option_r8.dateRange))("name", ctx_r7.idBag.groupName)("disabled", ctx_r7.loadingOrDisabled);
i0.ɵɵattribute("aria-label", option_r8.label)("name", ctx_r7.idBag.groupName)("aria-checked", ctx_r7.isSelected(option_r8.dateRange))("aria-required", ctx_r7.required);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(option_r8.label);
} }
function DateTimeRangeFormFieldComponent_ng_container_11_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, DateTimeRangeFormFieldComponent_ng_container_11_ng_container_1_Template, 6, 8, "ng-container", 15);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngForOf", ctx_r4.options);
} }
function DateTimeRangeFormFieldComponent_div_12_Template(rf, ctx) { if (rf & 1) {
const _r14 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "div", 19)(1, "label")(2, "input", 20);
i0.ɵɵlistener("click", function DateTimeRangeFormFieldComponent_div_12_Template_input_click_2_listener() { i0.ɵɵrestoreView(_r14); const ctx_r13 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r13.updateValue(ctx_r13.customDateRange)); })("keydown", function DateTimeRangeFormFieldComponent_div_12_Template_input_keydown_2_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r15 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r15.onRadioGroupOptionKeydown($event)); });
i0.ɵɵelementEnd();
i0.ɵɵelementStart(3, "span", 18);
i0.ɵɵtext(4);
i0.ɵɵelementEnd()()();
} if (rf & 2) {
const ctx_r5 = i0.ɵɵnextContext();
i0.ɵɵadvance(2);
i0.ɵɵproperty("name", ctx_r5.idBag.groupName)("checked", ctx_r5.isSelected(ctx_r5.customDateRange))("disabled", ctx_r5.loadingOrDisabled);
i0.ɵɵattribute("aria-label", ctx_r5.customText)("aria-checked", ctx_r5.isSelected(ctx_r5.customDateRange))("name", ctx_r5.idBag.groupName)("aria-required", ctx_r5.required);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx_r5.customText);
} }
const _c5 = function () { return { standalone: true }; };
function DateTimeRangeFormFieldComponent_fieldset_13_sme_form_field_1_Template(rf, ctx) { if (rf & 1) {
const _r20 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "sme-form-field", 23, 24);
i0.ɵɵlistener("ngModelChange", function DateTimeRangeFormFieldComponent_fieldset_13_sme_form_field_1_Template_sme_form_field_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r19 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r19.onCustomDateRangeChanged("start", $event)); })("customValidate", function DateTimeRangeFormFieldComponent_fieldset_13_sme_form_field_1_Template_sme_form_field_customValidate_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r21 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r21.onCustomValidate($event, "start")); })("keydown", function DateTimeRangeFormFieldComponent_fieldset_13_sme_form_field_1_Template_sme_form_field_keydown_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r22 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r22.onDatePickerKeydown($event, "start")); });
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r16 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("label", ctx_r16.startTimeText)("ngModelOptions", i0.ɵɵpureFunction0(4, _c5))("ngModel", ctx_r16.customDateRangeStart)("id", ctx_r16.idBag.startTimeInput);
} }
function DateTimeRangeFormFieldComponent_fieldset_13_sme_form_field_2_Template(rf, ctx) { if (rf & 1) {
const _r25 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "sme-form-field", 23, 25);
i0.ɵɵlistener("ngModelChange", function DateTimeRangeFormFieldComponent_fieldset_13_sme_form_field_2_Template_sme_form_field_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r24 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r24.onCustomDateRangeChanged("end", $event)); })("customValidate", function DateTimeRangeFormFieldComponent_fieldset_13_sme_form_field_2_Template_sme_form_field_customValidate_0_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r26 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r26.onCustomValidate($event, "end")); })("keydown", function DateTimeRangeFormFieldComponent_fieldset_13_sme_form_field_2_Template_sme_form_field_keydown_0_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r27 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r27.onDatePickerKeydown($event, "end")); });
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r17 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("label", ctx_r17.endTimeText)("ngModelOptions", i0.ɵɵpureFunction0(4, _c5))("ngModel", ctx_r17.customDateRangeEnd)("id", ctx_r17.idBag.endTimeInput);
} }
function DateTimeRangeFormFieldComponent_fieldset_13_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "fieldset", 21);
i0.ɵɵtemplate(1, DateTimeRangeFormFieldComponent_fieldset_13_sme_form_field_1_Template, 2, 5, "sme-form-field", 22);
i0.ɵɵtemplate(2, DateTimeRangeFormFieldComponent_fieldset_13_sme_form_field_2_Template, 2, 5, "sme-form-field", 22);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r6 = i0.ɵɵnextContext();
i0.ɵɵclassProp("sme-subform-indent-none", !ctx_r6.options || ctx_r6.options.length === 0);
i0.ɵɵproperty("disabled", ctx_r6.loadingOrDisabled);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r6.customDateRange && ctx_r6.customDateRange.start);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r6.customDateRange && ctx_r6.customDateRange.end);
} }
const _c6 = function (a0) { return { "max-width.px": a0 }; };
const _c7 = function () { return { "max-width": "initial" }; };
export class DateTimeRangeFormFieldComponent extends SmeInternalFormFieldComponent {
constructor(injector) {
super(injector);
this.customText = this.strings.MsftSmeShell.Angular.Form.DateTimeRange.Custom.label;
this.startTimeText = this.strings.MsftSmeShell.Angular.Form.DateTimeRange.StartTime.label;
this.endTimeText = this.strings.MsftSmeShell.Angular.Form.DateTimeRange.EndTime.label;
this.invalidStartTimeText = this.strings.MsftSmeShell.Angular.Form.DateTimeRange.Invalid.StartTime;
this.invalidEndTimeText = this.strings.MsftSmeShell.Angular.Form.DateTimeRange.Invalid.EndTime;
this.showCustomDisplayText = true;
this.customLabelEmitter = new EventEmitter();
// Deal with scalability
// Do not need to call duplicated function again and again
// Pool size for now set at 100
this.timeISOHistory = [];
this.dropdownService = injector.get(DropdownService);
this.dropdownApplyFormFieldOffsetWidth = true;
this.showCustomOption = true;
const now = Date.now();
this.customDateRange = new DateRange(now, now + (60 * 60 * 1000)); // now to now + 1 hour
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'DateTimeRangeFormFieldComponent';
}
// TODO: need to update the date picker to deal with timezone
get customDateRangeStart() {
return this.timeISOTranslator(this.customDateRange.start);
}
get customDateRangeEnd() {
return this.timeISOTranslator(this.customDateRange.end);
}
getTimeHistory(input) {
let res = '';
const history = this.timeISOHistory.filter((item) => {
if (item.key === input.getTime().toString()) {
return item;
}
})[0];
if (history) {
res = history.value;
}
return res;
}
setTimeHistory(key, value) {
const history = this.timeISOHistory.filter((item) => {
if (item.key === key.getTime().toString()) {
return item;
}
})[0];
if (!history) {
if (this.timeISOHistory
&& this.timeISOHistory.length >= DateTimeRangeFormFieldComponent.timeISOHistoryLength) {
this.timeISOHistory.unshift();
}
this.timeISOHistory.push({
key: key.getTime().toString(),
value: value
});
}
}
// TODO: need support for 24 hours vs 12 hours with am/pm.
timeISOTranslator(input) {
let res = this.getTimeHistory(input);
if (res) {
return res;
}
const rawYear = input.getFullYear();
const rawMonth = input.getMonth() + 1;
const month = rawMonth < 10 ? DateTimeRangeFormFieldComponent.twoDigitPattern.format(rawMonth) : rawMonth;
const rawDay = input.getDate();
const day = rawDay < 10 ? DateTimeRangeFormFieldComponent.twoDigitPattern.format(rawDay) : rawDay;
const rawHour = input.getHours();
const hour = rawHour < 10 ? DateTimeRangeFormFieldComponent.twoDigitPattern.format(rawHour) : rawHour;
const rawMinute = input.getMinutes();
const minute = rawMinute < 10 ? DateTimeRangeFormFieldComponent.twoDigitPattern.format(rawMinute) : rawMinute;
const rawSecond = input.getSeconds();
const second = rawSecond < 10 ? DateTimeRangeFormFieldComponent.twoDigitPattern.format(rawSecond) : rawSecond;
res = DateTimeRangeFormFieldComponent.timeISOPattern.format(rawYear, month, day, hour, minute, second);
this.setTimeHistory(input, res);
return res;
}
get displayValue() {
if (this.showCustomDisplayText && (this.isSelected(this.customDateRange) || !this.options.length)) {
return this.customText;
}
const selectedOption = this.options.find(option => this.isSelected(option.dateRange));
if (selectedOption) {
return selectedOption.label;
}
else if (this.showCustomDisplayText) {
return this.customText;
}
return this.value ? this.value.toString() : '';
}
isSelected(dateRange) {
if (!this.options || !this.options.length) {
return true;
}
if (dateRange && dateRange.start && dateRange.end) {
return dateRange.isEqualTo(this.value);
}
else {
return false;
}
}
updateValue(value) {
this.value = value;
this.updateDropdownPosition();
}
ngAfterContentInit() {
this.subscriptions.push(this.options.changes.subscribe(val => {
if (this.options.length === 0) {
this.value = this.customDateRange;
}
}));
if (this.options.length === 0) {
this.value = this.customDateRange;
}
}
onCustomDateRangeChanged(fieldName, value) {
switch (fieldName) {
case DateTimeRangeFormFieldComponent.startProperty: {
this.customDateRange.start = new Date(value);
break;
}
case DateTimeRangeFormFieldComponent.endProperty: {
this.customDateRange.end = new Date(value);
break;
}
}
// Always notify the change to the parent
this.value = this.customDateRange;
}
updateDropdownPosition() {
this.dropdownService.updatePosition(this.dropDown);
}
onValueChanged(value) {
if (!this.options) {
return;
}
if (value && !this.options.some(option => option.dateRange.isEqualTo(value))) {
this.customDateRange.start = value.start;
this.customDateRange.end = value.end;
}
const selectedOption = this.options.find((item) => {
return item.dateRange.isEqualTo(value);
});
if (selectedOption) {
this.customLabelEmitter.emit(selectedOption.label);
}
else {
this.customLabelEmitter.emit(this.customText);
}
super.onValueChanged(value);
}
/**
* Creates the idBag used by this component to store unique element ids.
* id values will be assigned be the @see BaseComponent super class.
*/
createIdBag() {
return {
detailsSpan: '',
groupName: '',
dropDownContent: '',
startTimeInput: '',
endTimeInput: ''
};
}
/**
* Performs validation that is internal to this control
* @param c The form control attached to this instance
*/
validate(c) {
if (this.required) {
if (MsftSme.isNullOrUndefined(this.value)) {
return { required: true };
}
}
if (this.value && this.value.isValid()) {
let alert = this.validateStartDate();
if (alert) {
return { invalidTimerange: alert };
}
alert = this.validateEndDate();
if (alert) {
return { invalidTimerange: alert };
}
}
return super.validate(c);
}
onCustomValidate(event, name, value) {
const alerts = {};
if (name === DateTimeRangeFormFieldComponent.startProperty) {
const alert = this.validateStartDate(new Date(event.formControl.value));
if (alert) {
alerts['invalidDateRange'] = alert;
}
else {
if ((this.endFormField && !this.endFormField.ngModel.valid) &&
(this.startFormField && this.startFormField.ngModel.control.errors)) {
this.endFormField.ngModel.control.setErrors(null);
}
}
}
else if (name === DateTimeRangeFormFieldComponent.endProperty) {
const alert = this.validateEndDate(new Date(event.formControl.value));
if (alert) {
alerts['invalidDateRange'] = alert;
}
else {
if (this.startFormField && !this.startFormField.ngModel.valid && this.startFormField.ngModel.control.errors) {
this.startFormField.ngModel.control.setErrors(null);
}
}
}
MsftSme.deepAssign(event.alerts, alerts);
}
validateStartDate(startDate) {
if (!this.value || MsftSme.isNullOrUndefined(this.value.start)) {
return null;
}
let startTime = this.value.start;
if (startDate) {
startTime = startDate;
}
if (startTime && this.value.end && startTime.valueOf() > this.value.end.valueOf()) {
return {
valid: false,
message: this.invalidStartTimeText,
severity: ValidationAlertSeverity.Error
};
}
return null;
}
validateEndDate(endDate) {
if (!this.value || MsftSme.isNullOrUndefined(this.value.end)) {
return null;
}
let endTime = this.value.end;
if (endDate) {
endTime = endDate;
}
if (this.value.start && endTime && this.value.start.valueOf() > endTime.valueOf()) {
return {
valid: false,
message: this.invalidEndTimeText,
severity: ValidationAlertSeverity.Error
};
}
return null;
}
// accessibility
onToggleKeydown(event) {
switch (event.keyCode) {
case KeyCode.Enter:
case KeyCode.Space: {
this.dropDown.onToggleClick(event, true);
break;
}
case KeyCode.DownArrow: {
if (event.altKey) {
this.dropDown.onToggleClick(event, true);
}
return;
}
default: {
return;
}
}
// handle all keys
event.stopImmediatePropagation();
event.stopPropagation();
event.preventDefault();
}
onRadioGroupOptionKeydown(event) {
switch (event.keyCode) {
// overrides the tab function
case KeyCode.Tab: {
// prevent focus on the next element in the parent trap
if (!this.canFocusOnStartTimeRangePicker()) {
event.preventDefault();
}
event.stopImmediatePropagation();
event.stopPropagation();
break;
}
default: {
return;
}
}
}
onDatePickerKeydown(event, input) {
// allow escape and alt arrow up to retract the datetime range fields as well. Only remove if the datetime controls are not open.
if ((event.keyCode === KeyCode.Escape) || (event.keyCode === KeyCode.UpArrow && event.altKey)) {
if (!this.startFormField.dropDown.isOpen && !this.endFormField.dropDown.isOpen) {
if (this.dropDown && this.dropDown.contentElement) {
const nextElement = Dom.getNextFocusableElement(this.dropDown.contentElement.nativeElement);
if (nextElement) {
nextElement.focus();
}
}
this.dropDown.onToggleClick(event, true);
}
}
// allow shift+tab to take focus back to startFormField while at endFormField
if (event.shiftKey && event.keyCode === KeyCode.Tab || event.keyCode !== KeyCode.Tab) {
return;
}
else {
// prevent focus on the next element in the parent trap
if (this.checkIsLastElementInDataRangePickerTrap()) {
event.preventDefault();
}
event.stopImmediatePropagation();
}
}
checkIsLastElementInDataRangePickerTrap() {
const dom = Dom;
const currentFocus = document.activeElement;
const nextElement = dom.getNextFocusableElementInTrap(currentFocus);
// The last item inside of the dropdown, expected to stay at the last item
if (currentFocus === nextElement) {
return true;
}
return false;
}
canFocusOnStartTimeRangePicker() {
if (this.startFormField && this.endFormField) {
return true;
}
return false;
}
}
DateTimeRangeFormFieldComponent.timeISOPattern = `{0}-{1}-{2}T{3}:{4}:{5}`;
DateTimeRangeFormFieldComponent.twoDigitPattern = `0{0}`;
DateTimeRangeFormFieldComponent.timeISOHistoryLength = 100;
DateTimeRangeFormFieldComponent.startProperty = 'start';
DateTimeRangeFormFieldComponent.endProperty = 'end';
/** @nocollapse */ DateTimeRangeFormFieldComponent.ɵfac = function DateTimeRangeFormFieldComponent_Factory(t) { return new (t || DateTimeRangeFormFieldComponent)(i0.ɵɵdirectiveInject(i0.Injector)); };
/** @nocollapse */ DateTimeRangeFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DateTimeRangeFormFieldComponent, selectors: [["sme-form-field", "type", "datetimerange"]], contentQueries: function DateTimeRangeFormFieldComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
i0.ɵɵcontentQuery(dirIndex, DateTimeRangeOptionComponent, 4);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.options = _t);
} }, viewQuery: function DateTimeRangeFormFieldComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
i0.ɵɵviewQuery(_c1, 5);
i0.ɵɵviewQuery(_c2, 5);
i0.ɵɵviewQuery(_c3, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.listboxElement = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dropDown = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.startFormField = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.endFormField = _t.first);
} }, inputs: { dropdownApplyFormFieldOffsetWidth: "dropdownApplyFormFieldOffsetWidth", showCustomOption: "showCustomOption", customDateRange: "customDateRange", showCustomDisplayText: "showCustomDisplayText" }, outputs: { customLabelEmitter: "customLabelEmitter" }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c4, decls: 15, vars: 26, consts: [[3, "formField"], [1, "sme-combobox", "sme-focus-zone", 3, "autoToggle", "disabled", "dropdownApplyFormFieldOffsetWidth"], ["dropDown", ""], [1, "sme-combobox-header", "sme-dropdown-toggle", 3, "keydown"], ["dropdownHeader", ""], ["type", "text", "role", "combobox", "readonly", "", "spellcheck", "false", "autocapitalize", "off", "autocomplete", "off", 3, "value", "placeholder", "click"], ["textInput", ""], ["type", "button", "tabindex", "-1", "role", "presentation", "aria-hidden", "true", 1, "sme-button-trigger", "sme-button-auto-width", 3, "click"], [1, "sme-icon", "sme-icon-chevronDown"], ["role", "listbox", 1, "sme-dropdown-content", "sme-dropdown-interaction-enabled", "sme-padding-squish-v-sm", 3, "ngStyle", "id"], ["listbox", ""], [4, "ngIf"], ["class", "sme-radio sme-dropdown-interaction-enabled", 4, "ngIf"], ["class", "sme-focus-trap", 3, "sme-subform-indent-none", "disabled", 4, "ngIf"], [3, "alert"], [4, "ngFor", "ngForOf"], [1, "sme-radio"], ["type", "radio", 3, "checked", "name", "disabled", "click", "keydown"], ["aria-hidden", "true"], [1, "sme-radio", "sme-dropdown-interaction-enabled"], ["type", "radio", 3, "name", "checked", "disabled", "click", "keydown"], [1, "sme-focus-trap", 3, "disabled"], ["class", "sme-dropdown-interaction-enabled", "type", "datetime", 3, "label", "ngModelOptions", "ngModel", "id", "ngModelChange", "customValidate", "keydown", 4, "ngIf"], ["type", "datetime", 1, "sme-dropdown-interaction-enabled", 3, "label", "ngModelOptions", "ngModel", "id", "ngModelChange", "customValidate", "keydown"], ["startFormField", ""], ["endFormField", ""]], template: function DateTimeRangeFormFieldComponent_Template(rf, ctx) { if (rf & 1) {
const _r28 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "sme-form-field-layout", 0)(1, "sme-dropdown", 1, 2)(3, "div", 3, 4);
i0.ɵɵlistener("keydown", function DateTimeRangeFormFieldComponent_Template_div_keydown_3_listener($event) { return ctx.onToggleKeydown($event); });
i0.ɵɵelementStart(5, "input", 5, 6);
i0.ɵɵlistener("click", function DateTimeRangeFormFieldComponent_Template_input_click_5_listener($event) { i0.ɵɵrestoreView(_r28); const _r0 = i0.ɵɵreference(2); return i0.ɵɵresetView(_r0.onToggleClick($event, true)); });
i0.ɵɵelementEnd();
i0.ɵɵelementStart(7, "button", 7);
i0.ɵɵlistener("click", function DateTimeRangeFormFieldComponent_Template_button_click_7_listener($event) { i0.ɵɵrestoreView(_r28); const _r0 = i0.ɵɵreference(2); return i0.ɵɵresetView(_r0.onToggleClick($event, true)); });
i0.ɵɵelement(8, "span", 8);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(9, "div", 9, 10);
i0.ɵɵtemplate(11, DateTimeRangeFormFieldComponent_ng_container_11_Template, 2, 1, "ng-container", 11);
i0.ɵɵtemplate(12, DateTimeRangeFormFieldComponent_div_12_Template, 5, 8, "div", 12);
i0.ɵɵtemplate(13, DateTimeRangeFormFieldComponent_fieldset_13_Template, 3, 5, "fieldset", 13);
i0.ɵɵelementEnd()();
i0.ɵɵelement(14, "sme-validation-alert", 14);
i0.ɵɵelementEnd();
} if (rf & 2) {
const _r0 = i0.ɵɵreference(2);
const _r1 = i0.ɵɵreference(4);
i0.ɵɵproperty("formField", ctx);
i0.ɵɵadvance(1);
i0.ɵɵproperty("autoToggle", false)("disabled", ctx.loadingOrDisabled)("dropdownApplyFormFieldOffsetWidth", ctx.dropdownApplyFormFieldOffsetWidth);
i0.ɵɵadvance(4);
i0.ɵɵproperty("value", ctx.displayValue)("placeholder", ctx.placeholder);
i0.ɵɵattribute("aria-controls", ctx.idBag.dropDownContent)("aria-label", ctx.label)("aria-required", ctx.required)("disabled", ctx.loadingOrDisabled ? true : null)("aria-owns", ctx.idBag.dropDownContent)("aria-expanded", _r0.isOpen)("aria-autocomplete", "none");
i0.ɵɵadvance(2);
i0.ɵɵclassProp("sme-toggled", _r0.isOpen);
i0.ɵɵattribute("disabled", ctx.loadingOrDisabled ? true : null)("aria-pressed", _r0.isOpen);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngStyle", ctx.dropdownApplyFormFieldOffsetWidth && i0.ɵɵpureFunction1(23, _c6, _r1.offsetWidth > 220 ? _r1.offsetWidth : 220) || !ctx.dropdownApplyFormFieldOffsetWidth && i0.ɵɵpureFunction0(25, _c7))("id", ctx.idBag.dropDownContent);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx.options && ctx.options.length);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.showCustomOption && ctx.options && ctx.options.length > 0);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.isSelected(ctx.customDateRange) || !ctx.options || ctx.options.length === 0);
i0.ɵɵadvance(1);
i0.ɵɵproperty("alert", ctx.alert);
} }, dependencies: [i1.NgForOf, i1.NgIf, i1.NgStyle, i2.NgControlStatus, i2.NgModel, i3.DropdownComponent, i4.DateTimeFormFieldComponent, i5.ValidationAlertComponent, i6.FormFieldAccessorDirective, i7.FormFieldValidatorDirective, i8.FieldsetDirective, i9.FormFieldLayoutComponent], encapsulation: 2 });
__decorate([
Yield(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], DateTimeRangeFormFieldComponent.prototype, "updateDropdownPosition", null);
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DateTimeRangeFormFieldComponent, [{
type: Component,
args: [{ selector: 'sme-form-field[type="datetimerange"]', template: "<sme-form-field-layout [formField]=\"this\">\r\n <sme-dropdown #dropDown [autoToggle]=\"false\" class=\"sme-combobox sme-focus-zone\" [disabled]=\"loadingOrDisabled\"\r\n [dropdownApplyFormFieldOffsetWidth]=\"dropdownApplyFormFieldOffsetWidth\">\r\n <div #dropdownHeader class=\"sme-combobox-header sme-dropdown-toggle\" (keydown)=\"onToggleKeydown($event)\">\r\n <input #textInput type=\"text\" role=\"combobox\" [value]=\"displayValue\" readonly\r\n [attr.aria-controls]=\"idBag.dropDownContent\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-required]='required'\r\n [attr.disabled]=\"loadingOrDisabled ? true : null\" \r\n [attr.aria-owns]=\"idBag.dropDownContent\" [attr.aria-expanded]=\"dropDown.isOpen\"\r\n [attr.aria-autocomplete]=\"'none'\" (click)=\"dropDown.onToggleClick($event, true)\" spellcheck=\"false\"\r\n autocapitalize=\"off\" autocomplete=\"off\" [placeholder]=\"placeholder\" />\r\n <button type=\"button\" [attr.disabled]=\"loadingOrDisabled ? true : null\" tabindex=\"-1\" role=\"presentation\"\r\n aria-hidden=\"true\" [attr.aria-pressed]=\"dropDown.isOpen\" [class.sme-toggled]=\"dropDown.isOpen\"\r\n class=\"sme-button-trigger sme-button-auto-width\" (click)=\"dropDown.onToggleClick($event, true)\">\r\n <span class=\"sme-icon sme-icon-chevronDown\"></span>\r\n </button>\r\n </div>\r\n <!-- The minimum of width that a dropdown can be is set at 220px -->\r\n <!-- Guarantee dropdown content width can not go below this value no matter how small the window is set at -->\r\n <!-- Otherwise will display gray margin to the right of the dropdown content on small window -->\r\n <div #listbox role=\"listbox\" class=\"sme-dropdown-content sme-dropdown-interaction-enabled sme-padding-squish-v-sm\"\r\n [ngStyle]=\"dropdownApplyFormFieldOffsetWidth && { 'max-width.px': dropdownHeader.offsetWidth > 220 ? dropdownHeader.offsetWidth : 220} || !dropdownApplyFormFieldOffsetWidth && { 'max-width': 'initial' }\"\r\n [id]=\"idBag.dropDownContent\">\r\n <ng-container *ngIf=\"options && options.length\">\r\n <ng-container *ngFor=\"let option of options; let optionIndex = index\">\r\n <div class=\"sme-radio\">\r\n <label>\r\n <input type=\"radio\" [attr.aria-label]=\"option.label\" [attr.name]=\"idBag.groupName\"\r\n [checked]=\"isSelected(option.dateRange)\" (click)=\"updateValue(option.dateRange)\"\r\n [attr.aria-checked]=\"isSelected(option.dateRange)\" [name]=\"idBag.groupName\"\r\n [attr.aria-required]=\"required\" [disabled]=\"loadingOrDisabled\"\r\n (keydown)=\"onRadioGroupOptionKeydown($event)\">\r\n <span aria-hidden=\"true\">{{option.label}}</span>\r\n </label>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <div class=\"sme-radio sme-dropdown-interaction-enabled\" *ngIf=\"showCustomOption && options && options.length > 0\">\r\n <label>\r\n <input type=\"radio\" [attr.aria-label]=\"customText\" [attr.aria-checked]=\"isSelected(customDateRange)\"\r\n [attr.name]=\"idBag.groupName\" [name]=\"idBag.groupName\" [checked]=\"isSelected(customDateRange)\"\r\n (click)=\"updateValue(customDateRange)\" [attr.aria-required]=\"required\" [disabled]=\"loadingOrDisabled\"\r\n (keydown)=\"onRadioGroupOptionKeydown($event)\">\r\n <span aria-hidden=\"true\">{{this.customText}}</span>\r\n </label>\r\n </div>\r\n\r\n <fieldset *ngIf=\"isSelected(customDateRange) || !options || options.length === 0\" class=\"sme-focus-trap\"\r\n [class.sme-subform-indent-none]=\"!options || options.length === 0\" [disabled]=\"loadingOrDisabled\">\r\n <sme-form-field #startFormField *ngIf=\"customDateRange && customDateRange.start\"\r\n class=\"sme-dropdown-interaction-enabled\" type=\"datetime\" [label]=\"startTimeText\"\r\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"customDateRangeStart\"\r\n (ngModelChange)=\"onCustomDateRangeChanged('start', $event)\" [id]=\"idBag.startTimeInput\"\r\n (customValidate)=\"onCustomValidate($event, 'start')\" (keydown)=\"onDatePickerKeydown($event, 'start')\">\r\n </sme-form-field>\r\n <sme-form-field #endFormField *ngIf=\"customDateRange && customDateRange.end\"\r\n class=\"sme-dropdown-interaction-enabled\" type=\"datetime\" [label]=\"endTimeText\"\r\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"customDateRangeEnd\"\r\n (ngModelChange)=\"onCustomDateRangeChanged('end', $event)\" [id]=\"idBag.endTimeInput\"\r\n (customValidate)=\"onCustomValidate($event, 'end')\" (keydown)=\"onDatePickerKeydown($event, 'end')\">\r\n </sme-form-field>\r\n </fieldset>\r\n </div>\r\n </sme-dropdown>\r\n <sme-validation-alert [alert]=\"alert\"></sme-validation-alert>\r\n</sme-form-field-layout>\r\n" }]
}], function () { return [{ type: i0.Injector }]; }, { listboxElement: [{
type: ViewChild,
args: ['listbox']
}], dropDown: [{
type: ViewChild,
args: ['dropDown']
}], startFormField: [{
type: ViewChild,
args: ['startFormField']
}], endFormField: [{
type: ViewChild,
args: ['endFormField']
}], options: [{
type: ContentChildren,
args: [DateTimeRangeOptionComponent]
}], dropdownApplyFormFieldOffsetWidth: [{
type: Input
}], showCustomOption: [{
type: Input
}], customDateRange: [{
type: Input
}], showCustomDisplayText: [{
type: Input
}], customLabelEmitter: [{
type: Output
}], updateDropdownPosition: [] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUtcmFuZ2UtZm9ybS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvZGF0ZXRpbWUtcmFuZ2UvZGF0ZXRpbWUtcmFuZ2UtZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvZGF0ZXRpbWUtcmFuZ2UvZGF0ZXRpbWUtcmFuZ2UtZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUMxRixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFDakcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFxQyx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3JILE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRXZGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSw0QkFBNEIs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