UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

96 lines 13.2 kB
import { Directive, forwardRef, HostListener, Input } from '@angular/core'; import { KeyCode } from '@microsoft/windows-admin-center-sdk/core/data/accessibility-manager'; import { ValidationAlertSeverity } from '../validation-alert/validation-alert'; import { FormValidatorBase } from './base-validator'; import { SME_VALIDATORS } from './sme-validator'; import * as i0 from "@angular/core"; /** * Provider for the FormFieldValidatorDirective directive */ export const CAPSLOCK_VALIDATOR = { provide: SME_VALIDATORS, useExisting: forwardRef(() => CapsLockValidatorDirective), multi: true }; /** * A Directive that adds the adds a warning when the CAPSLOCK key is on. * Applies to sme-form-field[type="password] and [smeCapsLock] */ export class CapsLockValidatorDirective extends FormValidatorBase { /** * Instantiates a new instance of CapsLockValidatorDirective */ constructor() { super(); /** * Internal placeholder for warnOnCapsLock */ this.internalWarnOnCapsLock = true; /** * Indicates the state of the capslock key */ this.isCapsLockOn = false; // Microsoft Edge looks for this value to disable the automatic capslock warning. For consistency, we want to use our own behavior; document.msCapsLockWarningOff = true; } /** * Indicates that a warning should be thrown if capslock is on */ get warnOnCapsLock() { return this.internalWarnOnCapsLock; } set warnOnCapsLock(value) { // warn if value is undefined or truthy and not 'false' string this.internalWarnOnCapsLock = MsftSme.isUndefined(value) || (!!value && `${value}` !== 'false'); this.revalidate(); } /** * Implementation of Validator interface. * Validates the state of the capslock key for this form control * @param c The FormControl attached to this element * @return null when valid, otherwise returns a validation object */ validate(c) { const alerts = super.validate(c) || {}; if (this.warnOnCapsLock && this.isCapsLockOn) { const strings = MsftSme.self().Resources.strings; alerts['smeCapsLock'] = { valid: true, message: strings.MsftSmeShell.Angular.Common.Form.Validation.Capslock.message, severity: ValidationAlertSeverity.Warning }; } return this.alertsOrNull(alerts); } /** * We dont have a way to truly monitor for capslock. * The best we can do is listen to every keydown and turn the warning on if we detect that its on * @param event the event data. */ onKeydown(event) { if (event && event.getModifierState) { const oldIsCapsLockOn = this.isCapsLockOn; this.isCapsLockOn = event.getModifierState(KeyCode[KeyCode.CapsLock]); if (oldIsCapsLockOn !== this.isCapsLockOn) { this.revalidate(); } } } } /** @nocollapse */ CapsLockValidatorDirective.ɵfac = function CapsLockValidatorDirective_Factory(t) { return new (t || CapsLockValidatorDirective)(); }; /** @nocollapse */ CapsLockValidatorDirective.ɵdir = /** @pureOrBreakMyCode */ i0.ɵɵdefineDirective({ type: CapsLockValidatorDirective, selectors: [["sme-form-field", "smeCapsLock", "", "formControlName", ""], ["sme-form-field", "smeCapsLock", "", "formControl", ""], ["sme-form-field", "smeCapsLock", "", "ngModel", ""], ["sme-form-field", "type", "password", "formControlName", ""], ["sme-form-field", "type", "password", "formControl", ""], ["sme-form-field", "type", "password", "ngModel", ""]], hostBindings: function CapsLockValidatorDirective_HostBindings(rf, ctx) { if (rf & 1) { i0.ɵɵlistener("keydown", function CapsLockValidatorDirective_keydown_HostBindingHandler($event) { return ctx.onKeydown($event); }); } }, inputs: { warnOnCapsLock: ["smeCapsLock", "warnOnCapsLock"] }, features: [i0.ɵɵProvidersFeature([CAPSLOCK_VALIDATOR]), i0.ɵɵInheritDefinitionFeature] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CapsLockValidatorDirective, [{ type: Directive, args: [{ // eslint-disable-next-line max-len selector: 'sme-form-field[smeCapsLock][formControlName],sme-form-field[smeCapsLock][formControl],sme-form-field[smeCapsLock][ngModel],sme-form-field[type="password"][formControlName],sme-form-field[type="password"][formControl],sme-form-field[type="password"][ngModel]', providers: [CAPSLOCK_VALIDATOR] }] }], function () { return []; }, { warnOnCapsLock: [{ type: Input, args: ['smeCapsLock'] }], onKeydown: [{ type: HostListener, args: ['keydown', ['$event']] }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fwc2xvY2suZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZm9ybS92YWxpZGF0b3JzL2NhcHNsb2NrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUUzRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFFOUYsT0FBTyxFQUFvQix1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFFakQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBbUI7SUFDOUMsT0FBTyxFQUFFLGNBQWM7SUFDdkIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztJQUN6RCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFFRjs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsaUJBQWlCO0lBdUI3RDs7T0FFRztJQUNIO1FBQ0ksS0FBSyxFQUFFLENBQUM7UUFkWjs7V0FFRztRQUNLLDJCQUFzQixHQUFHLElBQUksQ0FBQztRQUV0Qzs7V0FFRztRQUNLLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBT3pCLG1JQUFtSTtRQUM3SCxRQUFTLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0lBQ2hELENBQUM7SUE1QkQ7O09BRUc7SUFDSCxJQUNXLGNBQWMsS0FBYyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7SUFDNUUsSUFBVyxjQUFjLENBQUMsS0FBYztRQUNwQyw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQUcsS0FBSyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDaEcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFxQkQ7Ozs7O09BS0c7SUFDSSxRQUFRLENBQUMsQ0FBYztRQUMxQixNQUFNLE1BQU0sR0FBcUIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekQsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDMUMsTUFBTSxPQUFPLEdBQVksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDMUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHO2dCQUNwQixLQUFLLEVBQUUsSUFBSTtnQkFDWCxPQUFPLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU87Z0JBQzdFLFFBQVEsRUFBRSx1QkFBdUIsQ0FBQyxPQUFPO2FBQzVDLENBQUM7U0FDTDtRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUVJLFNBQVMsQ0FBQyxLQUFvQjtRQUNqQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7WUFDakMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUMxQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDdEUsSUFBSSxlQUFlLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDdkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQ3JCO1NBQ0o7SUFDTCxDQUFDOzt1SEFqRVEsMEJBQTBCOzRHQUExQiwwQkFBMEI7aUhBQTFCLHFCQUFpQjt5R0FGZixDQUFDLGtCQUFrQixDQUFDO3VGQUV0QiwwQkFBMEI7Y0FMdEMsU0FBUztlQUFDO2dCQUNQLG1DQUFtQztnQkFDbkMsUUFBUSxFQUFFLG1RQUFtUTtnQkFDN1EsU0FBUyxFQUFFLENBQUMsa0JBQWtCLENBQUM7YUFDbEM7c0NBT2MsY0FBYztrQkFEeEIsS0FBSzttQkFBQyxhQUFhO1lBb0RiLFNBQVM7a0JBRGYsWUFBWTttQkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIGZvcndhcmRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIFN0YXRpY1Byb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBLZXlDb2RlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2FjY2Vzc2liaWxpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IFN0cmluZ3MgfSBmcm9tICcuLi8uLi8uLi9nZW5lcmF0ZWQvc3RyaW5ncyc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25BbGVydHMsIFZhbGlkYXRpb25BbGVydFNldmVyaXR5IH0gZnJvbSAnLi4vdmFsaWRhdGlvbi1hbGVydC92YWxpZGF0aW9uLWFsZXJ0JztcclxuaW1wb3J0IHsgRm9ybVZhbGlkYXRvckJhc2UgfSBmcm9tICcuL2Jhc2UtdmFsaWRhdG9yJztcclxuaW1wb3J0IHsgU01FX1ZBTElEQVRPUlMgfSBmcm9tICcuL3NtZS12YWxpZGF0b3InO1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciB0aGUgRm9ybUZpZWxkVmFsaWRhdG9yRGlyZWN0aXZlIGRpcmVjdGl2ZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IENBUFNMT0NLX1ZBTElEQVRPUjogU3RhdGljUHJvdmlkZXIgPSB7XHJcbiAgICBwcm92aWRlOiBTTUVfVkFMSURBVE9SUyxcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENhcHNMb2NrVmFsaWRhdG9yRGlyZWN0aXZlKSxcclxuICAgIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG4vKipcclxuICogQSBEaXJlY3RpdmUgdGhhdCBhZGRzIHRoZSBhZGRzIGEgd2FybmluZyB3aGVuIHRoZSBDQVBTTE9DSyBrZXkgaXMgb24uXHJcbiAqIEFwcGxpZXMgdG8gc21lLWZvcm0tZmllbGRbdHlwZT1cInBhc3N3b3JkXSBhbmQgW3NtZUNhcHNMb2NrXVxyXG4gKi9cclxuQERpcmVjdGl2ZSh7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxyXG4gICAgc2VsZWN0b3I6ICdzbWUtZm9ybS1maWVsZFtzbWVDYXBzTG9ja11bZm9ybUNvbnRyb2xOYW1lXSxzbWUtZm9ybS1maWVsZFtzbWVDYXBzTG9ja11bZm9ybUNvbnRyb2xdLHNtZS1mb3JtLWZpZWxkW3NtZUNhcHNMb2NrXVtuZ01vZGVsXSxzbWUtZm9ybS1maWVsZFt0eXBlPVwicGFzc3dvcmRcIl1bZm9ybUNvbnRyb2xOYW1lXSxzbWUtZm9ybS1maWVsZFt0eXBlPVwicGFzc3dvcmRcIl1bZm9ybUNvbnRyb2xdLHNtZS1mb3JtLWZpZWxkW3R5cGU9XCJwYXNzd29yZFwiXVtuZ01vZGVsXScsXHJcbiAgICBwcm92aWRlcnM6IFtDQVBTTE9DS19WQUxJREFUT1JdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXBzTG9ja1ZhbGlkYXRvckRpcmVjdGl2ZSBleHRlbmRzIEZvcm1WYWxpZGF0b3JCYXNlIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB0aGF0IGEgd2FybmluZyBzaG91bGQgYmUgdGhyb3duIGlmIGNhcHNsb2NrIGlzIG9uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgnc21lQ2Fwc0xvY2snKVxyXG4gICAgcHVibGljIGdldCB3YXJuT25DYXBzTG9jaygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuaW50ZXJuYWxXYXJuT25DYXBzTG9jazsgfVxyXG4gICAgcHVibGljIHNldCB3YXJuT25DYXBzTG9jayh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vIHdhcm4gaWYgdmFsdWUgaXMgdW5kZWZpbmVkIG9yIHRydXRoeSBhbmQgbm90ICdmYWxzZScgc3RyaW5nXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFdhcm5PbkNhcHNMb2NrID0gTXNmdFNtZS5pc1VuZGVmaW5lZCh2YWx1ZSkgfHwgKCEhdmFsdWUgJiYgYCR7dmFsdWV9YCAhPT0gJ2ZhbHNlJyk7XHJcbiAgICAgICAgdGhpcy5yZXZhbGlkYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBwbGFjZWhvbGRlciBmb3Igd2Fybk9uQ2Fwc0xvY2tcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFdhcm5PbkNhcHNMb2NrID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB0aGUgc3RhdGUgb2YgdGhlIGNhcHNsb2NrIGtleVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzQ2Fwc0xvY2tPbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGluc3RhbmNlIG9mIENhcHNMb2NrVmFsaWRhdG9yRGlyZWN0aXZlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgLy8gTWljcm9zb2Z0IEVkZ2UgbG9va3MgZm9yIHRoaXMgdmFsdWUgdG8gZGlzYWJsZSB0aGUgYXV0b21hdGljIGNhcHNsb2NrIHdhcm5pbmcuIEZvciBjb25zaXN0ZW5jeSwgd2Ugd2FudCB0byB1c2Ugb3VyIG93biBiZWhhdmlvcjtcclxuICAgICAgICAoPGFueT5kb2N1bWVudCkubXNDYXBzTG9ja1dhcm5pbmdPZmYgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wbGVtZW50YXRpb24gb2YgVmFsaWRhdG9yIGludGVyZmFjZS5cclxuICAgICAqIFZhbGlkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIGNhcHNsb2NrIGtleSBmb3IgdGhpcyBmb3JtIGNvbnRyb2xcclxuICAgICAqIEBwYXJhbSBjIFRoZSBGb3JtQ29udHJvbCBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnRcclxuICAgICAqIEByZXR1cm4gbnVsbCB3aGVuIHZhbGlkLCBvdGhlcndpc2UgcmV0dXJucyBhIHZhbGlkYXRpb24gb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZShjOiBGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25BbGVydHMgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBhbGVydHM6IFZhbGlkYXRpb25BbGVydHMgPSBzdXBlci52YWxpZGF0ZShjKSB8fCB7fTtcclxuICAgICAgICBpZiAodGhpcy53YXJuT25DYXBzTG9jayAmJiB0aGlzLmlzQ2Fwc0xvY2tPbikge1xyXG4gICAgICAgICAgICBjb25zdCBzdHJpbmdzID0gPFN0cmluZ3M+TXNmdFNtZS5zZWxmKCkuUmVzb3VyY2VzLnN0cmluZ3M7XHJcbiAgICAgICAgICAgIGFsZXJ0c1snc21lQ2Fwc0xvY2snXSA9IHtcclxuICAgICAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Db21tb24uRm9ybS5WYWxpZGF0aW9uLkNhcHNsb2NrLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogVmFsaWRhdGlvbkFsZXJ0U2V2ZXJpdHkuV2FybmluZ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5hbGVydHNPck51bGwoYWxlcnRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdlIGRvbnQgaGF2ZSBhIHdheSB0byB0cnVseSBtb25pdG9yIGZvciBjYXBzbG9jay5cclxuICAgICAqIFRoZSBiZXN0IHdlIGNhbiBkbyBpcyBsaXN0ZW4gdG8gZXZlcnkga2V5ZG93biBhbmQgdHVybiB0aGUgd2FybmluZyBvbiBpZiB3ZSBkZXRlY3QgdGhhdCBpdHMgb25cclxuICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgZGF0YS5cclxuICAgICAqL1xyXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgICBwdWJsaWMgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmdldE1vZGlmaWVyU3RhdGUpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2xkSXNDYXBzTG9ja09uID0gdGhpcy5pc0NhcHNMb2NrT247XHJcbiAgICAgICAgICAgIHRoaXMuaXNDYXBzTG9ja09uID0gZXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShLZXlDb2RlW0tleUNvZGUuQ2Fwc0xvY2tdKTtcclxuICAgICAgICAgICAgaWYgKG9sZElzQ2Fwc0xvY2tPbiAhPT0gdGhpcy5pc0NhcHNMb2NrT24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmV2YWxpZGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==