blob: a3b46ee6db3e33cfaa9e5d0727b523a954a374f8 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
part of engine;
/// Various types of inputs used in text fields.
///
/// These types are coming from Flutter's [TextInputType]. Currently, we don't
/// support all the types. We fallback to [EngineInputType.text] when Flutter
/// sends a type that isn't supported.
// TODO(flutter_web): Support more types.
abstract class EngineInputType {
const EngineInputType();
static EngineInputType fromName(String name) {
switch (name) {
case 'TextInputType.number':
return number;
case 'TextInputType.phone':
return phone;
case 'TextInputType.emailAddress':
return emailAddress;
case 'TextInputType.url':
return url;
case 'TextInputType.multiline':
return multiline;
case 'TextInputType.text':
default:
return text;
}
}
/// Single-line text input type.
static const TextInputType text = TextInputType();
/// Numeric input type.
static const NumberInputType number = NumberInputType();
/// Phone number input type.
static const PhoneInputType phone = PhoneInputType();
/// Email address input type.
static const EmailInputType emailAddress = EmailInputType();
/// URL input type.
static const UrlInputType url = UrlInputType();
/// Multi-line text input type.
static const MultilineInputType multiline = MultilineInputType();
/// The HTML `inputmode` attribute to be set on the DOM element.
///
/// This HTML attribute helps the browser decide what kind of keyboard works
/// best for this text field.
///
/// For various `inputmode` values supported by browsers, see:
/// <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inputmode>.
String get inputmodeAttribute;
/// Whether this input type allows the "Enter" key to submit the input action.
bool get submitActionOnEnter => true;
/// Create the appropriate DOM element for this input type.
html.HtmlElement createDomElement() => html.InputElement();
/// Given a [domElement], set attributes that are specific to this input type.
void configureInputMode(html.HtmlElement domElement) {
if (inputmodeAttribute == null) {
return;
}
// Only apply `inputmode` in mobile browsers so that the right virtual
// keyboard shows up.
if (operatingSystem == OperatingSystem.iOs ||
operatingSystem == OperatingSystem.android) {
domElement.setAttribute('inputmode', inputmodeAttribute);
}
}
}
/// Single-line text input type.
class TextInputType extends EngineInputType {
const TextInputType();
@override
final String inputmodeAttribute = 'text';
}
/// Numeric input type.
class NumberInputType extends EngineInputType {
const NumberInputType();
@override
final String inputmodeAttribute = 'numeric';
}
/// Phone number input type.
class PhoneInputType extends EngineInputType {
const PhoneInputType();
@override
final String inputmodeAttribute = 'tel';
}
/// Email address input type.
class EmailInputType extends EngineInputType {
const EmailInputType();
@override
final String inputmodeAttribute = 'email';
}
/// URL input type.
class UrlInputType extends EngineInputType {
const UrlInputType();
@override
final String inputmodeAttribute = 'url';
}
/// Multi-line text input type.
class MultilineInputType extends EngineInputType {
const MultilineInputType();
@override
final String inputmodeAttribute = null;
@override
bool get submitActionOnEnter => false;
@override
html.HtmlElement createDomElement() => html.TextAreaElement();
}