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) {
Array.prototype.atR = function (index) {
if (index === undefined) {
return Result.error(undefined);
}
const result = this.at(index);
if (result) {
return Result.ok(result);

View file

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

View file

@ -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<ITEM>:[]}
}`;

View file

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

View file

@ -141,5 +141,4 @@ export class CoreHttpRepository extends HttpRepository {
}
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 { 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 (
<div key={index} style={{ border: "1px black solid", margin: 20 }}>
<div
key={index}
style={{ border: "1px black solid", margin: 20 }}
>
<div
style={{
display: "flex",
@ -78,51 +87,91 @@ export const FormBuilder = observer((props: IFormBuilder) => {
return (
<div style={{ margin: 20 }}>
<div style={{ display: "flex" }}>
<CoreText text={(element.subType ?? "") + ` ${index}`} type={CoreTextType.medium} />
<CoreText
text={(element.subType ?? "") + ` ${index}`}
type={CoreTextType.medium}
/>
<Icon
style={{ paddingLeft: 20 }}
type="DeleteCircle"
onClick={() => store.deleteTotalValueSubItem(element.id, index)}
onClick={() =>
store.deleteTotalValueSubItem(
element.id,
index
)
}
/>
</div>
{subArray.map((subSubArrayItem: InputBuilderViewModel, subIndex: number) => {
if (subSubArrayItem.type.isEqual(InputType.ENUM)) {
return (
<>
<CoreSelect
items={subSubArrayItem.values?.map((el) => 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 (
<div>
<CoreInput
isFormBuilder={true}
style={{ margin: 5 }}
onChange={(e) => {
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}
/>
</div>
);
{subArray.map(
(
subSubArrayItem: InputBuilderViewModel,
subIndex: number
) => {
if (
subSubArrayItem.type.isEqual(
InputType.ENUM
)
) {
return (
<>
<CoreSelect
items={
subSubArrayItem.values?.map(
(el) => 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 (
<div>
<CoreInput
isFormBuilder={true}
style={{ margin: 5 }}
onChange={(e) =>
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}
/>
</div>
);
return <>Error</>;
})}
return <>Error</>;
}
)}
</div>
);
})
@ -138,7 +187,11 @@ export const FormBuilder = observer((props: IFormBuilder) => {
<div>
<CoreInput
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) => {
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(

View file

@ -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<FormBuilderValidationModel | undefined> {}
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());

View file

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

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
style={{height:'100%'}}
value={store.viewModel.result}
label="Result"
styleContentEditable={{height:'100%'}}
onChange={(text) => store.updateForm({ result: text })}
/>
<CoreInput
style={{height:'100%'}}
value={store.viewModel.context}
label="Context"
styleContentEditable={{height:'100%'}}
onChange={(text) => store.updateForm({ context: text })}
/>
<div style={{ width: 100 }}>

View file

@ -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<FormBuilderValidationModel, CoreError> {
isBtScreen = false;
isModalOpen = false;
viewModel: FormBuilderValidationModel = FormBuilderValidationModel.datasetEmpty();
viewModel: FormBuilderValidationModel = FormBuilderValidationModel.empty();
constructor() {
super();
makeAutoObservable(this);

View file

@ -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(
<>
<SocketListener>
<RouterProvider router={router} />
</SocketListener>
</>
);