CoreInput form error adding
This commit is contained in:
parent
27763fc8d2
commit
c10cdb8158
6 changed files with 45 additions and 23 deletions
1
p.ts
Normal file
1
p.ts
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
|
@ -25,6 +25,7 @@ declare global {
|
||||||
fromArray(): number[];
|
fromArray(): number[];
|
||||||
toPx(): string;
|
toPx(): string;
|
||||||
unixFromDate(): string;
|
unixFromDate(): string;
|
||||||
|
isValid(str: string): boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface String {
|
interface String {
|
||||||
|
|
|
@ -18,4 +18,10 @@ export const NumberExtensions = () => {
|
||||||
return `${date.getUTCFullYear()}.${date.getMonth()}.${date.getDay()} ${date.getHours()}:${date.getMinutes()}`;
|
return `${date.getUTCFullYear()}.${date.getMonth()}.${date.getDay()} ${date.getHours()}:${date.getMinutes()}`;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
if (Number().isValid === undefined) {
|
||||||
|
// eslint-disable-next-line no-extend-native
|
||||||
|
Number.prototype.isValid = function (str: string) {
|
||||||
|
return !isNaN(Number(str));
|
||||||
|
};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -39,20 +39,20 @@ export const FormBuilder = observer((props: IFormBuilder) => {
|
||||||
value={element.totalValue ?? element.defaultValue}
|
value={element.totalValue ?? element.defaultValue}
|
||||||
onChange={(value) => store.changeTotalValue(element.id, value)}
|
onChange={(value) => store.changeTotalValue(element.id, value)}
|
||||||
label={element.name}
|
label={element.name}
|
||||||
style={{ margin: 10 }}
|
style={{ margin: 20 }}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (element.type.isEqual(InputType.ARRAY)) {
|
if (element.type.isEqual(InputType.ARRAY)) {
|
||||||
return (
|
return (
|
||||||
<div style={{ border: "1px black solid", margin: 10 }}>
|
<div style={{ border: "1px black solid", margin: 20 }}>
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
display: "flex",
|
display: "flex",
|
||||||
justifyContent: "space-between",
|
justifyContent: "space-between",
|
||||||
margin: 10,
|
margin: 20,
|
||||||
alignItems: "center",
|
alignItems: "center",
|
||||||
paddingRight: 10,
|
paddingRight: 20,
|
||||||
}}
|
}}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
store.open(element.id);
|
store.open(element.id);
|
||||||
|
@ -63,15 +63,15 @@ export const FormBuilder = observer((props: IFormBuilder) => {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{element.isOpen ? (
|
{element.isOpen ? (
|
||||||
<div style={{ margin: 10 }}>
|
<div style={{ margin: 20 }}>
|
||||||
{element.totalValue instanceof Array
|
{element.totalValue instanceof Array
|
||||||
? element.totalValue?.map((subArray, index) => {
|
? element.totalValue?.map((subArray, index) => {
|
||||||
return (
|
return (
|
||||||
<div style={{ margin: 10 }}>
|
<div style={{ margin: 20 }}>
|
||||||
<div style={{ display: "flex" }}>
|
<div style={{ display: "flex" }}>
|
||||||
<CoreText text={(element.subType ?? "") + ` ${index}`} type={CoreTextType.medium} />
|
<CoreText text={(element.subType ?? "") + ` ${index}`} type={CoreTextType.medium} />
|
||||||
<Icon
|
<Icon
|
||||||
style={{ paddingLeft: 10 }}
|
style={{ paddingLeft: 20 }}
|
||||||
type="DeleteCircle"
|
type="DeleteCircle"
|
||||||
onClick={() => store.deleteTotalValueSubItem(element.id, index)}
|
onClick={() => store.deleteTotalValueSubItem(element.id, index)}
|
||||||
/>
|
/>
|
||||||
|
@ -101,9 +101,10 @@ export const FormBuilder = observer((props: IFormBuilder) => {
|
||||||
}}
|
}}
|
||||||
validation={
|
validation={
|
||||||
subSubArrayItem.type.isEqual(InputType.NUMBER)
|
subSubArrayItem.type.isEqual(InputType.NUMBER)
|
||||||
? store.numberValidation
|
? (el) => Number().isValid(el)
|
||||||
: undefined
|
: undefined
|
||||||
}
|
}
|
||||||
|
error="только числа"
|
||||||
value={subSubArrayItem.defaultValue}
|
value={subSubArrayItem.defaultValue}
|
||||||
label={subSubArrayItem.name}
|
label={subSubArrayItem.name}
|
||||||
/>
|
/>
|
||||||
|
@ -126,13 +127,14 @@ export const FormBuilder = observer((props: IFormBuilder) => {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<CoreInput
|
<CoreInput
|
||||||
validation={element.type.isEqual(InputType.NUMBER) ? store.numberValidation : undefined}
|
validation={element.type.isEqual(InputType.NUMBER) ? (el) => Number().isValid(el) : undefined}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
store.changeTotalValue(element.id, e);
|
store.changeTotalValue(element.id, e);
|
||||||
}}
|
}}
|
||||||
value={element.defaultValue}
|
value={element.defaultValue}
|
||||||
|
error="только числа"
|
||||||
label={element.name}
|
label={element.name}
|
||||||
style={{ margin: 10 }}
|
style={{ margin: 20 }}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -6,11 +6,20 @@ interface IInputProps {
|
||||||
value?: string;
|
value?: string;
|
||||||
onChange?: (value: string) => void;
|
onChange?: (value: string) => void;
|
||||||
style?: React.CSSProperties;
|
style?: React.CSSProperties;
|
||||||
validation?: RegExp;
|
validation?: (value: string) => boolean;
|
||||||
|
error?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const CoreInput = (props: IInputProps) => {
|
export const CoreInput = (props: IInputProps) => {
|
||||||
const [value, setValue] = React.useState<string | undefined>(() => props.value);
|
const [value, setValue] = React.useState<string>(() => props.value ?? "");
|
||||||
|
const ref = React.useRef<HTMLDivElement>(null);
|
||||||
|
const [isAppendInnerText, setAppendInnerText] = React.useState(true);
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (ref.current && isAppendInnerText) {
|
||||||
|
ref.current.innerText = value;
|
||||||
|
setAppendInnerText(false);
|
||||||
|
}
|
||||||
|
}, [ref, value, isAppendInnerText, setAppendInnerText]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
|
@ -28,20 +37,17 @@ export const CoreInput = (props: IInputProps) => {
|
||||||
<CoreText type={CoreTextType.small} text={props.label} />
|
<CoreText type={CoreTextType.small} text={props.label} />
|
||||||
|
|
||||||
<div
|
<div
|
||||||
|
ref={ref}
|
||||||
onInput={(e) => {
|
onInput={(e) => {
|
||||||
// setValue(e.)
|
|
||||||
if (e.currentTarget.textContent) {
|
if (e.currentTarget.textContent) {
|
||||||
setValue(e.currentTarget.textContent);
|
setValue(e.currentTarget.textContent);
|
||||||
if (
|
if (props.validation !== undefined && props.validation(value) && props.onChange) {
|
||||||
props.validation !== undefined &&
|
props.onChange(value);
|
||||||
props.validation?.test(e.currentTarget.textContent) &&
|
|
||||||
props.onChange
|
|
||||||
) {
|
|
||||||
props.onChange(e.currentTarget.textContent);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (props.onChange) {
|
|
||||||
props.onChange(e.currentTarget.textContent);
|
if (props.onChange && props.validation === undefined) {
|
||||||
|
props.onChange(value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,7 +55,13 @@ export const CoreInput = (props: IInputProps) => {
|
||||||
style={{ fontSize: 16, fontFamily: "Roboto", color: "#1D1B20", height: 24 }}
|
style={{ fontSize: 16, fontFamily: "Roboto", color: "#1D1B20", height: 24 }}
|
||||||
contentEditable="true"
|
contentEditable="true"
|
||||||
/>
|
/>
|
||||||
{props.validation?.test(value ?? "") ?? false ? <div>Error</div> : null}
|
{value ? (
|
||||||
|
props.validation ? (
|
||||||
|
props.validation(value) ? null : (
|
||||||
|
<div style={{ color: "#ff1d0c" }}>{props.error ? props.error : "error"}</div>
|
||||||
|
)
|
||||||
|
) : null
|
||||||
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -108,7 +108,7 @@ export const datasetFormMockResult = `{
|
||||||
},
|
},
|
||||||
"camera_position":{
|
"camera_position":{
|
||||||
"center_shell": [\${CENTER_SHELL_1:number:0}, \${CENTER_SHELL_2:number:0}, \${CENTER_SHELL_3:number:0}],
|
"center_shell": [\${CENTER_SHELL_1:number:0}, \${CENTER_SHELL_2:number:0}, \${CENTER_SHELL_3:number:0}],
|
||||||
"radius_range": [\${RADIUS_RANGE_1:number:0.4}, \${RADIUS_RANGE_2:number:1.4}],
|
"radius_range": [\${RADIUS_RANGE_1:number:1}, \${RADIUS_RANGE_2:number:1.4}],
|
||||||
"elevation_range": [\${ELEVATION_RANGE_1:number:10}, \${ELEVATION_RANGE_2:number:90}]
|
"elevation_range": [\${ELEVATION_RANGE_1:number:10}, \${ELEVATION_RANGE_2:number:90}]
|
||||||
},
|
},
|
||||||
"generation":{
|
"generation":{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue