From 2f15b86a4206cc16d2e40170d037d2232cdf1acc Mon Sep 17 00:00:00 2001 From: IDONTSUDO Date: Sun, 20 Oct 2024 13:09:48 +0300 Subject: [PATCH] fixed bug --- ui/src/core/extensions/array.ts | 3 + ui/src/core/extensions/extensions.ts | 2 +- .../model/form_builder_validation_model.tsx | 40 ++++- ui/src/core/model/validation_model.ts | 1 - .../core/repository/core_http_repository.ts | 3 +- ui/src/core/ui/form_builder/form_builder.tsx | 142 ++++++++++++------ .../ui/form_builder/form_builder_store.ts | 30 ++-- .../core/ui/form_builder/form_view_model.ts | 13 +- ui/src/core/ui/form_builder/p.json | 9 -- .../forms/form_builder/form_builder_form.tsx | 5 + .../forms/form_builder/form_builder_store.ts | 4 +- ui/src/index.tsx | 4 - 12 files changed, 167 insertions(+), 89 deletions(-) delete mode 100644 ui/src/core/ui/form_builder/p.json diff --git a/ui/src/core/extensions/array.ts b/ui/src/core/extensions/array.ts index b24deaf..33ec3d8 100644 --- a/ui/src/core/extensions/array.ts +++ b/ui/src/core/extensions/array.ts @@ -12,6 +12,9 @@ export const ArrayExtensions = () => { } if ([].atR === undefined) { Array.prototype.atR = function (index) { + if (index === undefined) { + return Result.error(undefined); + } const result = this.at(index); if (result) { return Result.ok(result); diff --git a/ui/src/core/extensions/extensions.ts b/ui/src/core/extensions/extensions.ts index c02b358..5afcbed 100644 --- a/ui/src/core/extensions/extensions.ts +++ b/ui/src/core/extensions/extensions.ts @@ -29,7 +29,7 @@ declare global { replacePropIndex(property: Partial, index: number): T[]; someR(predicate: (value: T) => boolean): Result>; updateAll(value: Partial): Array; - atR(index: number): Result; + atR(index: number | undefined): Result; } interface Date { formatDate(): string; diff --git a/ui/src/core/model/form_builder_validation_model.tsx b/ui/src/core/model/form_builder_validation_model.tsx index f616eec..d696ffb 100644 --- a/ui/src/core/model/form_builder_validation_model.tsx +++ b/ui/src/core/model/form_builder_validation_model.tsx @@ -1,12 +1,19 @@ import { IsNotEmpty, IsString } from "class-validator"; 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 { ValidationModel } from "./validation_model"; import { FormType } from "./form"; import makeAutoObservable from "mobx-store-inheritance"; -export class FormBuilderValidationModel extends ValidationModel implements DependencyViewModel { +export class FormBuilderValidationModel + extends ValidationModel + implements DependencyViewModel +{ @IsNotEmpty() @IsString() public result: string; @@ -29,13 +36,22 @@ export class FormBuilderValidationModel extends ValidationModel implements Depen formBuilderValidationModel.context.isEmpty() && formBuilderValidationModel.result.isEmpty() && formBuilderValidationModel.form.isEmpty(); - + static test = () => + new FormBuilderValidationModel(ffContext, ff1Result, [], ""); static datasetEmpty = () => - new FormBuilderValidationModel(datasetFormMockContext, datasetFormMockResult, [], defaultFormValue); + new FormBuilderValidationModel( + datasetFormMockContext, + datasetFormMockResult, + [], + defaultFormValue + ); static empty = () => new FormBuilderValidationModel("", "", [], ""); - static emptyTest = () => new FormBuilderValidationModel(``, ``, [], defaultFormValue); - static creteDataSetTest = () => new FormBuilderValidationModel(``, scene, [], ""); - static emptySimple = () => new FormBuilderValidationModel("", simpleFormBuilder, [], ""); + static emptyTest = () => + new FormBuilderValidationModel(``, ``, [], defaultFormValue); + static creteDataSetTest = () => + new FormBuilderValidationModel(``, scene, [], ""); + static emptySimple = () => + new FormBuilderValidationModel("", simpleFormBuilder, [], ""); static vision = () => new FormBuilderValidationModel( `ENUM PRETRAIN = "true","false";`, @@ -55,3 +71,13 @@ export const scene = `{ export const simpleFormBuilder = `{ "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:[]} +}`; diff --git a/ui/src/core/model/validation_model.ts b/ui/src/core/model/validation_model.ts index eaffc01..7e41b5e 100644 --- a/ui/src/core/model/validation_model.ts +++ b/ui/src/core/model/validation_model.ts @@ -21,7 +21,6 @@ export class ValidationModel { if (error.constraints) result += Object.values(error.constraints).join(", "); return result; }); - console.log(message); return Result.error(message.join(", \n")); } else { return Result.ok(this as unknown as T); diff --git a/ui/src/core/repository/core_http_repository.ts b/ui/src/core/repository/core_http_repository.ts index d2569df..b84ff92 100644 --- a/ui/src/core/repository/core_http_repository.ts +++ b/ui/src/core/repository/core_http_repository.ts @@ -141,5 +141,4 @@ export class CoreHttpRepository extends HttpRepository { } getAllScenes = () => this._jsonRequest(HttpMethod.GET, "/scenes"); } -["", "", ""].map((el) => el.toLowerCase()).map((el) => el != ""); -["", "", ""].map((el) => el.toLowerCase()).filter((el) => el != ""); + \ No newline at end of file diff --git a/ui/src/core/ui/form_builder/form_builder.tsx b/ui/src/core/ui/form_builder/form_builder.tsx index 4d8e461..d1247da 100644 --- a/ui/src/core/ui/form_builder/form_builder.tsx +++ b/ui/src/core/ui/form_builder/form_builder.tsx @@ -1,5 +1,9 @@ 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 { FormBuilderStore } from "./form_builder_store"; import { CoreSelect } from "../select/select"; @@ -46,7 +50,9 @@ export const FormBuilder = observer((props: IFormBuilder) => { key={index} items={values} value={element.totalValue ?? element.defaultValue} - onChange={(value) => store.changeTotalValue(element.id, value)} + onChange={(value) => + store.changeTotalValue(element.id, value) + } label={element.name} style={{ margin: 20 }} /> @@ -54,7 +60,10 @@ export const FormBuilder = observer((props: IFormBuilder) => { } if (element.type?.isEqual(InputType.ARRAY)) { return ( -
+
{ return (
- + store.deleteTotalValueSubItem(element.id, index)} + onClick={() => + store.deleteTotalValueSubItem( + element.id, + index + ) + } />
- {subArray.map((subSubArrayItem: InputBuilderViewModel, subIndex: number) => { - if (subSubArrayItem.type.isEqual(InputType.ENUM)) { - return ( - <> - String(el)) ?? []} - value={subSubArrayItem.totalValue ?? subSubArrayItem.defaultValue} - onChange={(value) => store.changeTotalSubValue(element.id, subIndex, value)} - label={element.name} - style={{ margin: 5 }} - /> - - ); - } - if (subSubArrayItem.type.isEqualMany([InputType.NUMBER, InputType.STRING])) - return ( -
- { - store.changeTotalSubValue(element.id, subIndex, e); - }} - validation={ - subSubArrayItem.type.isEqual(InputType.NUMBER) - ? (el) => Number().isValid(el) - : undefined - } - error="только числа" - value={subSubArrayItem.totalValue ?? subSubArrayItem.defaultValue} - label={subSubArrayItem.name} - /> -
- ); + {subArray.map( + ( + subSubArrayItem: InputBuilderViewModel, + subIndex: number + ) => { + if ( + subSubArrayItem.type.isEqual( + InputType.ENUM + ) + ) { + return ( + <> + String(el) + ) ?? [] + } + value={ + subSubArrayItem.totalValue ?? + subSubArrayItem.defaultValue + } + onChange={(value) => console.log(subSubArrayItem.id) + } + label={element.name} + style={{ margin: 5 }} + /> + + ); + } + if ( + subSubArrayItem.type.isEqualMany([ + InputType.NUMBER, + InputType.STRING, + ]) + ) + return ( +
+ + store.changeTotalSubValue( + element.id, + subIndex, + e, + index + ) + } + validation={ + subSubArrayItem.type.isEqual( + InputType.NUMBER + ) + ? (el) => Number().isValid(el) + : undefined + } + error="только числа" + value={ + subSubArrayItem.totalValue ?? + subSubArrayItem.defaultValue + } + label={subSubArrayItem.name} + /> +
+ ); - return <>Error; - })} + return <>Error; + } + )}
); }) @@ -138,7 +187,11 @@ export const FormBuilder = observer((props: IFormBuilder) => {
Number().isValid(el) : undefined} + validation={ + element.type.isEqual(InputType.NUMBER) + ? (el) => Number().isValid(el) + : undefined + } onChange={(e) => { store.changeTotalValue(element.id, e); }} @@ -153,7 +206,10 @@ export const FormBuilder = observer((props: IFormBuilder) => { return ( <> {getFormBuilderComponents( - element.name.replace(">", "").replace("<", "").replace("/", ""), + element.name + .replace(">", "") + .replace("<", "") + .replace("/", ""), element.totalValue ?? element.defaultValue, (text) => store.changeTotalValue(element.id, text) ).fold( diff --git a/ui/src/core/ui/form_builder/form_builder_store.ts b/ui/src/core/ui/form_builder/form_builder_store.ts index ebffcb2..4abda8d 100644 --- a/ui/src/core/ui/form_builder/form_builder_store.ts +++ b/ui/src/core/ui/form_builder/form_builder_store.ts @@ -1,8 +1,9 @@ +import clone from "just-clone"; import { makeAutoObservable } from "mobx"; -import { FormViewModel } from "./form_view_model"; +import { FormViewModel, InputBuilderViewModel } from "./form_view_model"; import { TypedEvent } from "../../helper/typed_event"; import { FormBuilderValidationModel } from "../../model/form_builder_validation_model"; - + export class ChangerForm extends TypedEvent {} export class FormBuilderStore { @@ -15,30 +16,25 @@ export class FormBuilderStore { 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) { this.formViewModel.inputs = this.formViewModel?.inputs.map((el) => { if (!el.id.isEqual(id)) { return el; } else { + if (el.totalValue instanceof Array) { - el.totalValue = el.totalValue.map((subElement) => { - if (subElement instanceof Array) { - subElement.map((subSubElement, i) => { - if (subIndex !== i) { - return subSubElement; - } - subSubElement.totalValue = value; - return subSubElement; - }); - } - return subElement; - }); - return el; + el.totalValue.atR(arrayIndex).map((array) => + array.atR(subIndex).map((element: InputBuilderViewModel) => { + + element.totalValue = value; + }) + ); } return el; } }); + this.changerForm.emit(this.formViewModel?.fromFormBuilderValidationModel()); } @@ -88,7 +84,7 @@ export class FormBuilderStore { if (!(el.totalValue instanceof Array)) { el.totalValue = []; } - el.totalValue.push(el.values); + el.totalValue.push(clone(el.values as object)); return el; }); this.changerForm.emit(this.formViewModel?.fromFormBuilderValidationModel()); diff --git a/ui/src/core/ui/form_builder/form_view_model.ts b/ui/src/core/ui/form_builder/form_view_model.ts index a78ff17..7a1905e 100644 --- a/ui/src/core/ui/form_builder/form_view_model.ts +++ b/ui/src/core/ui/form_builder/form_view_model.ts @@ -90,8 +90,13 @@ export class FormViewModel { return; } try { - - return JSON.parse(result.replace(/[^\x00-\x7F]/g, "").replaceAll("\n", "").replaceAll("\\", "").replaceAll("/", "")); + return JSON.parse( + result + .replace(/[^\x00-\x7F]/g, "") + .replaceAll("\n", "") + .replaceAll("\\", "") + .replaceAll("/", "") + ); } catch (error) { console.log("ERROR: FormViewModel json() " + result); } @@ -128,7 +133,7 @@ export class FormViewModel { element.totalValue.forEach((el) => { const objectUnion = {}; let objectMapperResult = ""; - if (el instanceof Array) + if (el instanceof Array) { el.forEach((subElement) => { let subResult = subElement.totalValue ?? subElement.defaultValue; if (subElement.type.isEqualMany([InputType.STRING, InputType.ENUM])) { @@ -141,6 +146,8 @@ export class FormViewModel { // @ts-ignore objectUnion[subElement.name] = subResult; }); + } + if (Object.keys(objectUnion).length !== 0) { if (element.subType) { objectMapperResult = this.getTypeBody(element.subType); diff --git a/ui/src/core/ui/form_builder/p.json b/ui/src/core/ui/form_builder/p.json deleted file mode 100644 index c8542fc..0000000 --- a/ui/src/core/ui/form_builder/p.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - - "params": [ - { - "name": "default", - "value": "default" - } - ] -} \ No newline at end of file diff --git a/ui/src/features/behavior_tree_builder/presentation/ui/forms/form_builder/form_builder_form.tsx b/ui/src/features/behavior_tree_builder/presentation/ui/forms/form_builder/form_builder_form.tsx index db8c6aa..075a278 100644 --- a/ui/src/features/behavior_tree_builder/presentation/ui/forms/form_builder/form_builder_form.tsx +++ b/ui/src/features/behavior_tree_builder/presentation/ui/forms/form_builder/form_builder_form.tsx @@ -45,13 +45,18 @@ export const FormBuilderForm = observer((props: IPropsForm store.updateForm({ result: text })} /> store.updateForm({ context: text })} />
diff --git a/ui/src/features/behavior_tree_builder/presentation/ui/forms/form_builder/form_builder_store.ts b/ui/src/features/behavior_tree_builder/presentation/ui/forms/form_builder/form_builder_store.ts index 67ec2bb..3b7e2c5 100644 --- a/ui/src/features/behavior_tree_builder/presentation/ui/forms/form_builder/form_builder_store.ts +++ b/ui/src/features/behavior_tree_builder/presentation/ui/forms/form_builder/form_builder_store.ts @@ -3,11 +3,11 @@ import { NavigateFunction } from "react-router-dom"; import { FormState, CoreError } from "../../../../../../core/store/base_store"; import { BehaviorTreeBuilderStore } from "../../../behavior_tree_builder_store"; import { FormBuilderValidationModel } from "../../../../../../core/model/form_builder_validation_model"; - + export class FormsFormBuilderStore extends FormState { isBtScreen = false; isModalOpen = false; - viewModel: FormBuilderValidationModel = FormBuilderValidationModel.datasetEmpty(); + viewModel: FormBuilderValidationModel = FormBuilderValidationModel.empty(); constructor() { super(); makeAutoObservable(this); diff --git a/ui/src/index.tsx b/ui/src/index.tsx index 46f2dda..a8d3fea 100644 --- a/ui/src/index.tsx +++ b/ui/src/index.tsx @@ -7,8 +7,6 @@ import { RouterProvider } from "react-router-dom"; import { router } from "./core/routers/routers"; import { configure } from "mobx"; 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({ enforceActions: "never", @@ -23,8 +21,6 @@ root.render( <> - - );