fixed bug

This commit is contained in:
IDONTSUDO 2024-10-20 13:09:48 +03:00
parent 15cb712c3d
commit 2f15b86a42
12 changed files with 167 additions and 89 deletions

View file

@ -12,6 +12,9 @@ export const ArrayExtensions = () => {
} }
if ([].atR === undefined) { if ([].atR === undefined) {
Array.prototype.atR = function (index) { Array.prototype.atR = function (index) {
if (index === undefined) {
return Result.error(undefined);
}
const result = this.at(index); const result = this.at(index);
if (result) { if (result) {
return Result.ok(result); return Result.ok(result);

View file

@ -29,7 +29,7 @@ declare global {
replacePropIndex(property: Partial<T>, index: number): T[]; replacePropIndex(property: Partial<T>, index: number): T[];
someR(predicate: (value: T) => boolean): Result<void, Array<T>>; someR(predicate: (value: T) => boolean): Result<void, Array<T>>;
updateAll(value: Partial<T>): Array<T>; updateAll(value: Partial<T>): Array<T>;
atR(index: number): Result<void, T>; atR(index: number | undefined): Result<void, T>;
} }
interface Date { interface Date {
formatDate(): string; formatDate(): string;

View file

@ -1,12 +1,19 @@
import { IsNotEmpty, IsString } from "class-validator"; import { IsNotEmpty, IsString } from "class-validator";
import { BehaviorTreeBuilderStore } from "../../features/behavior_tree_builder/presentation/behavior_tree_builder_store"; import { BehaviorTreeBuilderStore } from "../../features/behavior_tree_builder/presentation/behavior_tree_builder_store";
import { datasetFormMockContext, datasetFormMockResult, defaultFormValue } from "../../features/dataset/dataset_model"; import {
datasetFormMockContext,
datasetFormMockResult,
defaultFormValue,
} from "../../features/dataset/dataset_model";
import { DependencyViewModel } from "./skill_model"; import { DependencyViewModel } from "./skill_model";
import { ValidationModel } from "./validation_model"; import { ValidationModel } from "./validation_model";
import { FormType } from "./form"; import { FormType } from "./form";
import makeAutoObservable from "mobx-store-inheritance"; import makeAutoObservable from "mobx-store-inheritance";
export class FormBuilderValidationModel extends ValidationModel implements DependencyViewModel { export class FormBuilderValidationModel
extends ValidationModel
implements DependencyViewModel
{
@IsNotEmpty() @IsNotEmpty()
@IsString() @IsString()
public result: string; public result: string;
@ -29,13 +36,22 @@ export class FormBuilderValidationModel extends ValidationModel implements Depen
formBuilderValidationModel.context.isEmpty() && formBuilderValidationModel.context.isEmpty() &&
formBuilderValidationModel.result.isEmpty() && formBuilderValidationModel.result.isEmpty() &&
formBuilderValidationModel.form.isEmpty(); formBuilderValidationModel.form.isEmpty();
static test = () =>
new FormBuilderValidationModel(ffContext, ff1Result, [], "");
static datasetEmpty = () => static datasetEmpty = () =>
new FormBuilderValidationModel(datasetFormMockContext, datasetFormMockResult, [], defaultFormValue); new FormBuilderValidationModel(
datasetFormMockContext,
datasetFormMockResult,
[],
defaultFormValue
);
static empty = () => new FormBuilderValidationModel("", "", [], ""); static empty = () => new FormBuilderValidationModel("", "", [], "");
static emptyTest = () => new FormBuilderValidationModel(``, ``, [], defaultFormValue); static emptyTest = () =>
static creteDataSetTest = () => new FormBuilderValidationModel(``, scene, [], ""); new FormBuilderValidationModel(``, ``, [], defaultFormValue);
static emptySimple = () => new FormBuilderValidationModel("", simpleFormBuilder, [], ""); static creteDataSetTest = () =>
new FormBuilderValidationModel(``, scene, [], "");
static emptySimple = () =>
new FormBuilderValidationModel("", simpleFormBuilder, [], "");
static vision = () => static vision = () =>
new FormBuilderValidationModel( new FormBuilderValidationModel(
`ENUM PRETRAIN = "true","false";`, `ENUM PRETRAIN = "true","false";`,
@ -55,3 +71,13 @@ export const scene = `{
export const simpleFormBuilder = `{ export const simpleFormBuilder = `{
"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}]
}`; }`;
export const ffContext = `type ITEM = {
"name": \${NAME:string:default},
"value": \${VALUE:string:default}
};
`;
export const ff1Result = `{
"empty":\${NAME:string:default},
"params": \${ITEM:Array<ITEM>:[]}
}`;

View file

@ -21,7 +21,6 @@ export class ValidationModel {
if (error.constraints) result += Object.values(error.constraints).join(", "); if (error.constraints) result += Object.values(error.constraints).join(", ");
return result; return result;
}); });
console.log(message);
return Result.error(message.join(", \n")); return Result.error(message.join(", \n"));
} else { } else {
return Result.ok(this as unknown as T); return Result.ok(this as unknown as T);

View file

@ -141,5 +141,4 @@ export class CoreHttpRepository extends HttpRepository {
} }
getAllScenes = () => this._jsonRequest<SceneModel[]>(HttpMethod.GET, "/scenes"); getAllScenes = () => this._jsonRequest<SceneModel[]>(HttpMethod.GET, "/scenes");
} }
["", "", ""].map((el) => el.toLowerCase()).map((el) => el != "");
["", "", ""].map((el) => el.toLowerCase()).filter((el) => el != "");

View file

@ -1,5 +1,9 @@
import * as React from "react"; import * as React from "react";
import { FormViewModel, InputBuilderViewModel, InputType } from "./form_view_model"; import {
FormViewModel,
InputBuilderViewModel,
InputType,
} from "./form_view_model";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { FormBuilderStore } from "./form_builder_store"; import { FormBuilderStore } from "./form_builder_store";
import { CoreSelect } from "../select/select"; import { CoreSelect } from "../select/select";
@ -46,7 +50,9 @@ export const FormBuilder = observer((props: IFormBuilder) => {
key={index} key={index}
items={values} items={values}
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: 20 }} style={{ margin: 20 }}
/> />
@ -54,7 +60,10 @@ export const FormBuilder = observer((props: IFormBuilder) => {
} }
if (element.type?.isEqual(InputType.ARRAY)) { if (element.type?.isEqual(InputType.ARRAY)) {
return ( return (
<div key={index} style={{ border: "1px black solid", margin: 20 }}> <div
key={index}
style={{ border: "1px black solid", margin: 20 }}
>
<div <div
style={{ style={{
display: "flex", display: "flex",
@ -78,51 +87,91 @@ export const FormBuilder = observer((props: IFormBuilder) => {
return ( return (
<div style={{ margin: 20 }}> <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: 20 }} style={{ paddingLeft: 20 }}
type="DeleteCircle" type="DeleteCircle"
onClick={() => store.deleteTotalValueSubItem(element.id, index)} onClick={() =>
store.deleteTotalValueSubItem(
element.id,
index
)
}
/> />
</div> </div>
{subArray.map((subSubArrayItem: InputBuilderViewModel, subIndex: number) => { {subArray.map(
if (subSubArrayItem.type.isEqual(InputType.ENUM)) { (
subSubArrayItem: InputBuilderViewModel,
subIndex: number
) => {
if (
subSubArrayItem.type.isEqual(
InputType.ENUM
)
) {
return ( return (
<> <>
<CoreSelect <CoreSelect
items={subSubArrayItem.values?.map((el) => String(el)) ?? []} items={
value={subSubArrayItem.totalValue ?? subSubArrayItem.defaultValue} subSubArrayItem.values?.map(
onChange={(value) => store.changeTotalSubValue(element.id, subIndex, value)} (el) => String(el)
) ?? []
}
value={
subSubArrayItem.totalValue ??
subSubArrayItem.defaultValue
}
onChange={(value) => console.log(subSubArrayItem.id)
}
label={element.name} label={element.name}
style={{ margin: 5 }} style={{ margin: 5 }}
/> />
</> </>
); );
} }
if (subSubArrayItem.type.isEqualMany([InputType.NUMBER, InputType.STRING])) if (
subSubArrayItem.type.isEqualMany([
InputType.NUMBER,
InputType.STRING,
])
)
return ( return (
<div> <div>
<CoreInput <CoreInput
isFormBuilder={true} isFormBuilder={true}
style={{ margin: 5 }} style={{ margin: 5 }}
onChange={(e) => { onChange={(e) =>
store.changeTotalSubValue(element.id, subIndex, e); store.changeTotalSubValue(
}} element.id,
subIndex,
e,
index
)
}
validation={ validation={
subSubArrayItem.type.isEqual(InputType.NUMBER) subSubArrayItem.type.isEqual(
InputType.NUMBER
)
? (el) => Number().isValid(el) ? (el) => Number().isValid(el)
: undefined : undefined
} }
error="только числа" error="только числа"
value={subSubArrayItem.totalValue ?? subSubArrayItem.defaultValue} value={
subSubArrayItem.totalValue ??
subSubArrayItem.defaultValue
}
label={subSubArrayItem.name} label={subSubArrayItem.name}
/> />
</div> </div>
); );
return <>Error</>; return <>Error</>;
})} }
)}
</div> </div>
); );
}) })
@ -138,7 +187,11 @@ export const FormBuilder = observer((props: IFormBuilder) => {
<div> <div>
<CoreInput <CoreInput
isFormBuilder={true} isFormBuilder={true}
validation={element.type.isEqual(InputType.NUMBER) ? (el) => Number().isValid(el) : 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);
}} }}
@ -153,7 +206,10 @@ export const FormBuilder = observer((props: IFormBuilder) => {
return ( return (
<> <>
{getFormBuilderComponents( {getFormBuilderComponents(
element.name.replace(">", "").replace("<", "").replace("/", ""), element.name
.replace(">", "")
.replace("<", "")
.replace("/", ""),
element.totalValue ?? element.defaultValue, element.totalValue ?? element.defaultValue,
(text) => store.changeTotalValue(element.id, text) (text) => store.changeTotalValue(element.id, text)
).fold( ).fold(

View file

@ -1,5 +1,6 @@
import clone from "just-clone";
import { makeAutoObservable } from "mobx"; import { makeAutoObservable } from "mobx";
import { FormViewModel } from "./form_view_model"; import { FormViewModel, InputBuilderViewModel } from "./form_view_model";
import { TypedEvent } from "../../helper/typed_event"; import { TypedEvent } from "../../helper/typed_event";
import { FormBuilderValidationModel } from "../../model/form_builder_validation_model"; import { FormBuilderValidationModel } from "../../model/form_builder_validation_model";
@ -15,31 +16,26 @@ export class FormBuilderStore {
this.changerForm = new ChangerForm(); this.changerForm = new ChangerForm();
} }
changeTotalSubValue(id: string, subIndex: number, value: string) { changeTotalSubValue(id: string, subIndex: number, value: string, arrayIndex: number | undefined = undefined) {
if (this.formViewModel?.inputs) { if (this.formViewModel?.inputs) {
this.formViewModel.inputs = this.formViewModel?.inputs.map((el) => { this.formViewModel.inputs = this.formViewModel?.inputs.map((el) => {
if (!el.id.isEqual(id)) { if (!el.id.isEqual(id)) {
return el; return el;
} else { } else {
if (el.totalValue instanceof Array) { if (el.totalValue instanceof Array) {
el.totalValue = el.totalValue.map((subElement) => { el.totalValue.atR(arrayIndex).map((array) =>
if (subElement instanceof Array) { array.atR(subIndex).map((element: InputBuilderViewModel) => {
subElement.map((subSubElement, i) => {
if (subIndex !== i) { element.totalValue = value;
return subSubElement; })
} );
subSubElement.totalValue = value;
return subSubElement;
});
}
return subElement;
});
return el;
} }
return el; return el;
} }
}); });
this.changerForm.emit(this.formViewModel?.fromFormBuilderValidationModel()); this.changerForm.emit(this.formViewModel?.fromFormBuilderValidationModel());
} }
} }
@ -88,7 +84,7 @@ export class FormBuilderStore {
if (!(el.totalValue instanceof Array)) { if (!(el.totalValue instanceof Array)) {
el.totalValue = []; el.totalValue = [];
} }
el.totalValue.push(el.values); el.totalValue.push(clone(el.values as object));
return el; return el;
}); });
this.changerForm.emit(this.formViewModel?.fromFormBuilderValidationModel()); this.changerForm.emit(this.formViewModel?.fromFormBuilderValidationModel());

View file

@ -90,8 +90,13 @@ export class FormViewModel {
return; return;
} }
try { try {
return JSON.parse(
return JSON.parse(result.replace(/[^\x00-\x7F]/g, "").replaceAll("\n", "").replaceAll("\\", "").replaceAll("/", "")); result
.replace(/[^\x00-\x7F]/g, "")
.replaceAll("\n", "")
.replaceAll("\\", "")
.replaceAll("/", "")
);
} catch (error) { } catch (error) {
console.log("ERROR: FormViewModel json() " + result); console.log("ERROR: FormViewModel json() " + result);
} }
@ -128,7 +133,7 @@ export class FormViewModel {
element.totalValue.forEach((el) => { element.totalValue.forEach((el) => {
const objectUnion = {}; const objectUnion = {};
let objectMapperResult = ""; let objectMapperResult = "";
if (el instanceof Array) if (el instanceof Array) {
el.forEach((subElement) => { el.forEach((subElement) => {
let subResult = subElement.totalValue ?? subElement.defaultValue; let subResult = subElement.totalValue ?? subElement.defaultValue;
if (subElement.type.isEqualMany([InputType.STRING, InputType.ENUM])) { if (subElement.type.isEqualMany([InputType.STRING, InputType.ENUM])) {
@ -141,6 +146,8 @@ export class FormViewModel {
// @ts-ignore // @ts-ignore
objectUnion[subElement.name] = subResult; objectUnion[subElement.name] = subResult;
}); });
}
if (Object.keys(objectUnion).length !== 0) { if (Object.keys(objectUnion).length !== 0) {
if (element.subType) { if (element.subType) {
objectMapperResult = this.getTypeBody(element.subType); objectMapperResult = this.getTypeBody(element.subType);

View file

@ -1,9 +0,0 @@
{
"params": [
{
"name": "default",
"value": "default"
}
]
}

View file

@ -45,13 +45,18 @@ export const FormBuilderForm = observer((props: IPropsForm<Partial<FormBuilderVa
) : ( ) : (
<> <>
<CoreInput <CoreInput
style={{height:'100%'}}
value={store.viewModel.result} value={store.viewModel.result}
label="Result" label="Result"
styleContentEditable={{height:'100%'}}
onChange={(text) => store.updateForm({ result: text })} onChange={(text) => store.updateForm({ result: text })}
/> />
<CoreInput <CoreInput
style={{height:'100%'}}
value={store.viewModel.context} value={store.viewModel.context}
label="Context" label="Context"
styleContentEditable={{height:'100%'}}
onChange={(text) => store.updateForm({ context: text })} onChange={(text) => store.updateForm({ context: text })}
/> />
<div style={{ width: 100 }}> <div style={{ width: 100 }}>

View file

@ -7,7 +7,7 @@ import { FormBuilderValidationModel } from "../../../../../../core/model/form_bu
export class FormsFormBuilderStore extends FormState<FormBuilderValidationModel, CoreError> { export class FormsFormBuilderStore extends FormState<FormBuilderValidationModel, CoreError> {
isBtScreen = false; isBtScreen = false;
isModalOpen = false; isModalOpen = false;
viewModel: FormBuilderValidationModel = FormBuilderValidationModel.datasetEmpty(); viewModel: FormBuilderValidationModel = FormBuilderValidationModel.empty();
constructor() { constructor() {
super(); super();
makeAutoObservable(this); makeAutoObservable(this);

View file

@ -7,8 +7,6 @@ import { RouterProvider } from "react-router-dom";
import { router } from "./core/routers/routers"; import { router } from "./core/routers/routers";
import { configure } from "mobx"; import { configure } from "mobx";
import { ThemeStore } from "./core/store/theme_store"; import { ThemeStore } from "./core/store/theme_store";
import { FormBuilder } from "./core/ui/form_builder/form_builder";
import { FormBuilderValidationModel } from "./core/model/form_builder_validation_model";
configure({ configure({
enforceActions: "never", enforceActions: "never",
@ -23,8 +21,6 @@ root.render(
<> <>
<SocketListener> <SocketListener>
<RouterProvider router={router} /> <RouterProvider router={router} />
</SocketListener> </SocketListener>
</> </>
); );