feat:Input add password property
This commit is contained in:
parent
521ce19c1c
commit
07c701ef23
@ -24,6 +24,7 @@ import android.text.TextWatcher;
|
|||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.inputmethod.EditorInfo;
|
||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
|
||||||
@ -123,23 +124,68 @@ public class InputNode extends ViewNode<EditText> implements TextWatcher, View.O
|
|||||||
break;
|
break;
|
||||||
case "inputType":
|
case "inputType":
|
||||||
if (prop.isNumber()) {
|
if (prop.isNumber()) {
|
||||||
|
final int variation =
|
||||||
|
mView.getInputType() & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION);
|
||||||
|
boolean isPassword = variation
|
||||||
|
== (EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD)
|
||||||
|
|| variation
|
||||||
|
== (EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_WEB_PASSWORD)
|
||||||
|
|| variation
|
||||||
|
== (EditorInfo.TYPE_CLASS_NUMBER | EditorInfo.TYPE_NUMBER_VARIATION_PASSWORD);
|
||||||
|
int inputType;
|
||||||
switch (prop.asNumber().toInt()) {
|
switch (prop.asNumber().toInt()) {
|
||||||
case 1:
|
case 1:
|
||||||
mView.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL);
|
inputType = InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL;
|
||||||
|
if (isPassword) {
|
||||||
|
inputType = inputType | InputType.TYPE_NUMBER_VARIATION_PASSWORD;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
mView.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
|
inputType = InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL;
|
||||||
|
if (isPassword) {
|
||||||
|
inputType = inputType | InputType.TYPE_NUMBER_VARIATION_PASSWORD;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
mView.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
|
inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
|
||||||
|
if (isPassword) {
|
||||||
|
inputType = inputType | InputType.TYPE_TEXT_VARIATION_PASSWORD;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
mView.setInputType(InputType.TYPE_CLASS_PHONE);
|
inputType = InputType.TYPE_CLASS_PHONE;
|
||||||
|
if (isPassword) {
|
||||||
|
inputType = inputType | InputType.TYPE_NUMBER_VARIATION_PASSWORD;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
mView.setInputType(InputType.TYPE_CLASS_TEXT);
|
inputType = InputType.TYPE_CLASS_TEXT;
|
||||||
|
if (isPassword) {
|
||||||
|
inputType = inputType | InputType.TYPE_TEXT_VARIATION_PASSWORD;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
mView.setInputType(inputType);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "password":
|
||||||
|
if (prop.isBoolean()) {
|
||||||
|
final int variation =
|
||||||
|
mView.getInputType() & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION);
|
||||||
|
if ((variation & EditorInfo.TYPE_CLASS_NUMBER) == EditorInfo.TYPE_CLASS_NUMBER) {
|
||||||
|
if (prop.asBoolean().value()) {
|
||||||
|
mView.setInputType(mView.getInputType() | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
|
||||||
|
} else {
|
||||||
|
mView.setInputType(mView.getInputType() & (~InputType.TYPE_NUMBER_VARIATION_PASSWORD));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (prop.asBoolean().value()) {
|
||||||
|
mView.setInputType(mView.getInputType() | InputType.TYPE_TEXT_VARIATION_PASSWORD);
|
||||||
|
} else {
|
||||||
|
mView.setInputType(mView.getInputType() & (~InputType.TYPE_TEXT_VARIATION_PASSWORD));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1,33 +1,45 @@
|
|||||||
import { Panel, Group, scroller, vlayout, layoutConfig, LayoutSpec, Input, Gravity, log, Color, input, text, InputType } from "doric";
|
import {
|
||||||
|
Panel,
|
||||||
|
Group,
|
||||||
|
scroller,
|
||||||
|
vlayout,
|
||||||
|
layoutConfig,
|
||||||
|
LayoutSpec,
|
||||||
|
Input,
|
||||||
|
Gravity,
|
||||||
|
log,
|
||||||
|
Color,
|
||||||
|
input,
|
||||||
|
text,
|
||||||
|
InputType,
|
||||||
|
} from "doric";
|
||||||
import { title, colors } from "./utils";
|
import { title, colors } from "./utils";
|
||||||
|
|
||||||
|
|
||||||
function getInput(c: Partial<Input>) {
|
function getInput(c: Partial<Input>) {
|
||||||
const inputView = input(c)
|
const inputView = input(c);
|
||||||
const isFocused = text({
|
const isFocused = text({
|
||||||
layoutConfig: {
|
layoutConfig: {
|
||||||
widthSpec: LayoutSpec.MOST,
|
widthSpec: LayoutSpec.MOST,
|
||||||
heightSpec: LayoutSpec.JUST,
|
heightSpec: LayoutSpec.JUST,
|
||||||
},
|
},
|
||||||
height: 50,
|
height: 50,
|
||||||
})
|
});
|
||||||
const inputed = text({
|
const inputed = text({
|
||||||
layoutConfig: {
|
layoutConfig: {
|
||||||
widthSpec: LayoutSpec.MOST,
|
widthSpec: LayoutSpec.MOST,
|
||||||
heightSpec: LayoutSpec.JUST,
|
heightSpec: LayoutSpec.JUST,
|
||||||
},
|
},
|
||||||
height: 50,
|
height: 50,
|
||||||
})
|
});
|
||||||
inputView.onFocusChange = (onFocusChange) => {
|
inputView.onFocusChange = (onFocusChange) => {
|
||||||
isFocused.text = onFocusChange ? `Focused` : `Unfocused`
|
isFocused.text = onFocusChange ? `Focused` : `Unfocused`;
|
||||||
}
|
};
|
||||||
inputView.onTextChange = (text) => {
|
inputView.onTextChange = (text) => {
|
||||||
inputed.text = `Inputed:${text}`
|
inputed.text = `Inputed:${text}`;
|
||||||
}
|
};
|
||||||
return [inputView, isFocused, inputed]
|
return [inputView, isFocused, inputed];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Entry
|
@Entry
|
||||||
class InputDemo extends Panel {
|
class InputDemo extends Panel {
|
||||||
build(root: Group) {
|
build(root: Group) {
|
||||||
@ -45,12 +57,12 @@ class InputDemo extends Panel {
|
|||||||
textSize: 20,
|
textSize: 20,
|
||||||
maxLength: 20,
|
maxLength: 20,
|
||||||
padding: { top: 10, bottom: 11 },
|
padding: { top: 10, bottom: 11 },
|
||||||
inputType: InputType.Decimal
|
inputType: InputType.Decimal,
|
||||||
|
password: true,
|
||||||
});
|
});
|
||||||
scroller(
|
scroller(
|
||||||
vlayout(
|
vlayout(
|
||||||
[
|
[
|
||||||
|
|
||||||
title("Demo"),
|
title("Demo"),
|
||||||
// ...getInput({
|
// ...getInput({
|
||||||
// layoutConfig: {
|
// layoutConfig: {
|
||||||
@ -74,13 +86,12 @@ class InputDemo extends Panel {
|
|||||||
layoutConfig: layoutConfig().most().configHeight(LayoutSpec.MOST),
|
layoutConfig: layoutConfig().most().configHeight(LayoutSpec.MOST),
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
(inputView as Input).releaseFocus(context);
|
(inputView as Input).releaseFocus(context);
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
{
|
{
|
||||||
layoutConfig: layoutConfig().most()
|
layoutConfig: layoutConfig().most(),
|
||||||
}
|
}
|
||||||
).in(root)
|
).in(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -104,8 +104,8 @@ - (void)blendView:(DoricInputView *)view forPropName:(NSString *)name propValue:
|
|||||||
}
|
}
|
||||||
view.textAlignment = alignment;
|
view.textAlignment = alignment;
|
||||||
} else if ([name isEqualToString:@"multiline"]) {
|
} else if ([name isEqualToString:@"multiline"]) {
|
||||||
BOOL mutilin = [(NSNumber *) prop boolValue];
|
BOOL value = [(NSNumber *) prop boolValue];
|
||||||
if (!mutilin) {
|
if (!value) {
|
||||||
view.textContainer.maximumNumberOfLines = 1;
|
view.textContainer.maximumNumberOfLines = 1;
|
||||||
} else {
|
} else {
|
||||||
view.textContainer.maximumNumberOfLines = 0;
|
view.textContainer.maximumNumberOfLines = 0;
|
||||||
@ -156,6 +156,8 @@ - (void)blendView:(DoricInputView *)view forPropName:(NSString *)name propValue:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if ([name isEqualToString:@"password"]) {
|
||||||
|
self.view.secureTextEntry = [(NSNumber *) prop boolValue];
|
||||||
} else {
|
} else {
|
||||||
[super blendView:view forPropName:name propValue:prop];
|
[super blendView:view forPropName:name propValue:prop];
|
||||||
}
|
}
|
||||||
|
@ -2711,6 +2711,10 @@ var Input = /** @class */ (function (_super) {
|
|||||||
Property,
|
Property,
|
||||||
__metadata$a("design:type", Number)
|
__metadata$a("design:type", Number)
|
||||||
], Input.prototype, "maxLength", void 0);
|
], Input.prototype, "maxLength", void 0);
|
||||||
|
__decorate$a([
|
||||||
|
Property,
|
||||||
|
__metadata$a("design:type", Boolean)
|
||||||
|
], Input.prototype, "password", void 0);
|
||||||
return Input;
|
return Input;
|
||||||
}(View));
|
}(View));
|
||||||
(function (InputType) {
|
(function (InputType) {
|
||||||
|
@ -2101,6 +2101,10 @@ __decorate$a([
|
|||||||
Property,
|
Property,
|
||||||
__metadata$a("design:type", Number)
|
__metadata$a("design:type", Number)
|
||||||
], Input.prototype, "maxLength", void 0);
|
], Input.prototype, "maxLength", void 0);
|
||||||
|
__decorate$a([
|
||||||
|
Property,
|
||||||
|
__metadata$a("design:type", Boolean)
|
||||||
|
], Input.prototype, "password", void 0);
|
||||||
(function (InputType) {
|
(function (InputType) {
|
||||||
InputType[InputType["Default"] = 0] = "Default";
|
InputType[InputType["Default"] = 0] = "Default";
|
||||||
InputType[InputType["Number"] = 1] = "Number";
|
InputType[InputType["Number"] = 1] = "Number";
|
||||||
|
@ -3590,6 +3590,10 @@ __decorate$a([
|
|||||||
Property,
|
Property,
|
||||||
__metadata$a("design:type", Number)
|
__metadata$a("design:type", Number)
|
||||||
], Input.prototype, "maxLength", void 0);
|
], Input.prototype, "maxLength", void 0);
|
||||||
|
__decorate$a([
|
||||||
|
Property,
|
||||||
|
__metadata$a("design:type", Boolean)
|
||||||
|
], Input.prototype, "password", void 0);
|
||||||
(function (InputType) {
|
(function (InputType) {
|
||||||
InputType[InputType["Default"] = 0] = "Default";
|
InputType[InputType["Default"] = 0] = "Default";
|
||||||
InputType[InputType["Number"] = 1] = "Number";
|
InputType[InputType["Number"] = 1] = "Number";
|
||||||
|
1
doric-js/index.d.ts
vendored
1
doric-js/index.d.ts
vendored
@ -744,6 +744,7 @@ declare module 'doric/lib/src/widget/input' {
|
|||||||
onTextChange?: (text: string) => void;
|
onTextChange?: (text: string) => void;
|
||||||
onFocusChange?: (focused: boolean) => void;
|
onFocusChange?: (focused: boolean) => void;
|
||||||
maxLength?: number;
|
maxLength?: number;
|
||||||
|
password?: boolean;
|
||||||
getText(context: BridgeContext): Promise<string>;
|
getText(context: BridgeContext): Promise<string>;
|
||||||
setSelection(context: BridgeContext, start: number, end?: number): Promise<string>;
|
setSelection(context: BridgeContext, start: number, end?: number): Promise<string>;
|
||||||
requestFocus(context: BridgeContext): Promise<any>;
|
requestFocus(context: BridgeContext): Promise<any>;
|
||||||
|
1
doric-js/lib/src/widget/input.d.ts
vendored
1
doric-js/lib/src/widget/input.d.ts
vendored
@ -14,6 +14,7 @@ export declare class Input extends View {
|
|||||||
onTextChange?: (text: string) => void;
|
onTextChange?: (text: string) => void;
|
||||||
onFocusChange?: (focused: boolean) => void;
|
onFocusChange?: (focused: boolean) => void;
|
||||||
maxLength?: number;
|
maxLength?: number;
|
||||||
|
password?: boolean;
|
||||||
getText(context: BridgeContext): Promise<string>;
|
getText(context: BridgeContext): Promise<string>;
|
||||||
setSelection(context: BridgeContext, start: number, end?: number): Promise<string>;
|
setSelection(context: BridgeContext, start: number, end?: number): Promise<string>;
|
||||||
requestFocus(context: BridgeContext): Promise<any>;
|
requestFocus(context: BridgeContext): Promise<any>;
|
||||||
|
@ -87,6 +87,10 @@ __decorate([
|
|||||||
Property,
|
Property,
|
||||||
__metadata("design:type", Number)
|
__metadata("design:type", Number)
|
||||||
], Input.prototype, "maxLength", void 0);
|
], Input.prototype, "maxLength", void 0);
|
||||||
|
__decorate([
|
||||||
|
Property,
|
||||||
|
__metadata("design:type", Boolean)
|
||||||
|
], Input.prototype, "password", void 0);
|
||||||
export var InputType;
|
export var InputType;
|
||||||
(function (InputType) {
|
(function (InputType) {
|
||||||
InputType[InputType["Default"] = 0] = "Default";
|
InputType[InputType["Default"] = 0] = "Default";
|
||||||
|
@ -54,6 +54,9 @@ export class Input extends View {
|
|||||||
@Property
|
@Property
|
||||||
maxLength?: number
|
maxLength?: number
|
||||||
|
|
||||||
|
@Property
|
||||||
|
password?: boolean
|
||||||
|
|
||||||
getText(context: BridgeContext) {
|
getText(context: BridgeContext) {
|
||||||
return this.nativeChannel(context, 'getText')() as Promise<string>
|
return this.nativeChannel(context, 'getText')() as Promise<string>
|
||||||
}
|
}
|
||||||
|
4
doric-web/dist/index.js
vendored
4
doric-web/dist/index.js
vendored
@ -3648,6 +3648,10 @@ __decorate$a([
|
|||||||
Property,
|
Property,
|
||||||
__metadata$a("design:type", Number)
|
__metadata$a("design:type", Number)
|
||||||
], Input.prototype, "maxLength", void 0);
|
], Input.prototype, "maxLength", void 0);
|
||||||
|
__decorate$a([
|
||||||
|
Property,
|
||||||
|
__metadata$a("design:type", Boolean)
|
||||||
|
], Input.prototype, "password", void 0);
|
||||||
(function (InputType) {
|
(function (InputType) {
|
||||||
InputType[InputType["Default"] = 0] = "Default";
|
InputType[InputType["Default"] = 0] = "Default";
|
||||||
InputType[InputType["Number"] = 1] = "Number";
|
InputType[InputType["Number"] = 1] = "Number";
|
||||||
|
2
doric-web/dist/index.js.map
vendored
2
doric-web/dist/index.js.map
vendored
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user