fixed bug
This commit is contained in:
parent
15cb712c3d
commit
2f15b86a42
12 changed files with 167 additions and 89 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>:[]}
|
||||
}`;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 != "");
|
||||
|
|
@ -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(
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
{
|
||||
|
||||
"params": [
|
||||
{
|
||||
"name": "default",
|
||||
"value": "default"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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 }}>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
</>
|
||||
);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue