CoreInput form error adding

This commit is contained in:
IDONTSUDO 2024-04-12 20:43:36 +03:00
parent 27763fc8d2
commit c10cdb8158
6 changed files with 45 additions and 23 deletions

1
p.ts Normal file
View file

@ -0,0 +1 @@

View file

@ -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 {

View file

@ -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));
};
}
}; };

View file

@ -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>
); );

View file

@ -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>
); );
}; };

View file

@ -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":{