From f08fcb17b49540126367f75d28499e5904e12106 Mon Sep 17 00:00:00 2001 From: Nathanael Anderson Date: Fri, 26 Feb 2021 18:23:50 -0600 Subject: [PATCH] fix(android): KeyboardType now respects numbers (#9240) --- packages/core/ui/core/properties/index.ts | 8 +++++++- .../ui/editable-text-base/editable-text-base-common.ts | 6 +++--- packages/core/ui/editable-text-base/index.android.ts | 9 +++++++-- packages/core/ui/text-field/index.android.ts | 7 +++++++ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/packages/core/ui/core/properties/index.ts b/packages/core/ui/core/properties/index.ts index 63af41eaf..c2d32f471 100644 --- a/packages/core/ui/core/properties/index.ts +++ b/packages/core/ui/core/properties/index.ts @@ -1546,12 +1546,18 @@ export function makeValidator(...values: T[]): (value: any) => value is T { return (value: any): value is T => set.has(value); } -export function makeParser(isValid: (value: any) => boolean): (value: any) => T { +export function makeParser(isValid: (value: any) => boolean, allowNumbers = false): (value: any) => T { return (value) => { const lower = value && value.toLowerCase(); if (isValid(lower)) { return lower; } else { + if (allowNumbers) { + const convNumber = +value; + if (!isNaN(convNumber)) { + return value; + } + } throw new Error('Invalid value: ' + value); } }; diff --git a/packages/core/ui/editable-text-base/editable-text-base-common.ts b/packages/core/ui/editable-text-base/editable-text-base-common.ts index ced6e9b2f..004eff613 100644 --- a/packages/core/ui/editable-text-base/editable-text-base-common.ts +++ b/packages/core/ui/editable-text-base/editable-text-base-common.ts @@ -48,12 +48,12 @@ export const placeholderColorProperty = new CssProperty({ }); placeholderColorProperty.register(Style); -const keyboardTypeConverter = makeParser(makeValidator('datetime', 'phone', 'number', 'url', 'email', 'integer')); +const keyboardTypeConverter = makeParser(makeValidator('datetime', 'phone', 'number', 'url', 'email', 'integer'), true); export const keyboardTypeProperty = new Property({ name: 'keyboardType', valueConverter: keyboardTypeConverter }); keyboardTypeProperty.register(EditableTextBase); -const returnKeyTypeConverter = makeParser(makeValidator('done', 'next', 'go', 'search', 'send')); +const returnKeyTypeConverter = makeParser(makeValidator('done', 'next', 'go', 'search', 'send'), true); export const returnKeyTypeProperty = new Property({ name: 'returnKeyType', valueConverter: returnKeyTypeConverter }); returnKeyTypeProperty.register(EditableTextBase); @@ -68,7 +68,7 @@ editableProperty.register(EditableTextBase); export const updateTextTriggerProperty = new Property({ name: 'updateTextTrigger', defaultValue: 'textChanged' }); updateTextTriggerProperty.register(EditableTextBase); -const autocapitalizationTypeConverter = makeParser(makeValidator('none', 'words', 'sentences', 'allcharacters')); +const autocapitalizationTypeConverter = makeParser(makeValidator('none', 'words', 'sentences', 'allcharacters'), true); export const autocapitalizationTypeProperty = new Property({ name: 'autocapitalizationType', diff --git a/packages/core/ui/editable-text-base/index.android.ts b/packages/core/ui/editable-text-base/index.android.ts index e9a41db03..5dc8d2488 100644 --- a/packages/core/ui/editable-text-base/index.android.ts +++ b/packages/core/ui/editable-text-base/index.android.ts @@ -216,7 +216,7 @@ export abstract class EditableTextBase extends EditableTextBaseCommon { const nativeView = this.nativeTextViewProtected; try { this._changeFromCode = true; - nativeView.setInputType(inputType); + nativeView.setInputType(parseInt(inputType, 10)); } finally { this._changeFromCode = false; } @@ -281,7 +281,12 @@ export abstract class EditableTextBase extends EditableTextBaseCommon { break; default: - newInputType = value; + const inputType = +value; + if (!isNaN(inputType)) { + newInputType = inputType; + } else { + newInputType = android.text.InputType.TYPE_CLASS_TEXT; + } break; } diff --git a/packages/core/ui/text-field/index.android.ts b/packages/core/ui/text-field/index.android.ts index b80922718..5a49187d2 100644 --- a/packages/core/ui/text-field/index.android.ts +++ b/packages/core/ui/text-field/index.android.ts @@ -27,6 +27,13 @@ export class TextField extends TextFieldBase { setSecureAndKeyboardType(): void { let inputType: number; + // Check for a passed in Number value + const value = +this.keyboardType; + if (!isNaN(value)) { + this._setInputType(value); + return; + } + // Password variations are supported only for Text and Number classes. if (this.secure) { if (this.keyboardType === 'number') {