progress
This commit is contained in:
parent
d7ea79935e
commit
c2da1d8f4c
19 changed files with 76 additions and 38 deletions
|
@ -8,6 +8,9 @@ import { SaveBtScenario as FillBtScenario } from "./domain/save_bt_scenario";
|
||||||
import { GetCameraUseCase } from "./domain/get_cameras_usecase";
|
import { GetCameraUseCase } from "./domain/get_cameras_usecase";
|
||||||
import { GetRobotsUseCase } from "./domain/get_robots_usecase";
|
import { GetRobotsUseCase } from "./domain/get_robots_usecase";
|
||||||
import { GetTopicsUseCase } from "./domain/get_topics_usecase";
|
import { GetTopicsUseCase } from "./domain/get_topics_usecase";
|
||||||
|
import { DeleteBehaviorTreeScenario } from "./domain/delete_behavior_tree_scenario";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export class BehaviorTreesPresentation extends CrudController<BehaviorTreeValidationModel, typeof BehaviorTreeDBModel> {
|
export class BehaviorTreesPresentation extends CrudController<BehaviorTreeValidationModel, typeof BehaviorTreeDBModel> {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -43,6 +46,11 @@ export class BehaviorTreesPresentation extends CrudController<BehaviorTreeValida
|
||||||
subUrl: "topics",
|
subUrl: "topics",
|
||||||
fn: new GetTopicsUseCase()
|
fn: new GetTopicsUseCase()
|
||||||
})
|
})
|
||||||
|
this.subRoutes.push({
|
||||||
|
method: "POST",
|
||||||
|
subUrl: "delete/bt",
|
||||||
|
fn: new DeleteBehaviorTreeScenario(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { CallbackStrategyWithIdQuery, ResponseBase } from "../../../core/controllers/http_controller";
|
||||||
|
import { StaticFilesProject } from "../../../core/models/static_files";
|
||||||
|
import { DeleteDataBaseModelUseCase } from "../../../core/usecases/delete_database_model_usecase";
|
||||||
|
import { DeleteRecursiveFolderUseCase } from "../../../core/usecases/delete_recursive_folder_usecase";
|
||||||
|
import { SearchOneDataBaseModelUseCase } from "../../../core/usecases/search_database_model_usecase";
|
||||||
|
import { CoreValidation } from "../../../core/validations/core_validation";
|
||||||
|
import { MongoIdValidation } from "../../../core/validations/mongo_id_validation";
|
||||||
|
import { IProjectModel, ProjectDBModel } from "../../projects/models/project_model_database_model";
|
||||||
|
import { BehaviorTreeDBModel } from "../models/behavior_tree_database_model";
|
||||||
|
|
||||||
|
export class DeleteBehaviorTreeScenario extends CallbackStrategyWithIdQuery {
|
||||||
|
idValidationExpression: CoreValidation = new MongoIdValidation();
|
||||||
|
call = async (id: string): ResponseBase => (
|
||||||
|
await new SearchOneDataBaseModelUseCase<IProjectModel>(ProjectDBModel).call({ isActive: true }, "no active projects")
|
||||||
|
).map(async (model) => (await (new DeleteRecursiveFolderUseCase().call(`${model.rootDir}/${StaticFilesProject.behaviorTrees}`))).map(async () => (await new DeleteDataBaseModelUseCase(BehaviorTreeDBModel).call(id))));
|
||||||
|
}
|
|
@ -4,9 +4,8 @@ import { SearchOneDataBaseModelUseCase } from "../../../core/usecases/search_dat
|
||||||
import { IProjectModel, ProjectDBModel } from "../models/project_model_database_model";
|
import { IProjectModel, ProjectDBModel } from "../models/project_model_database_model";
|
||||||
|
|
||||||
export class GetActiveProjectIdScenario extends CallbackStrategyWithEmpty {
|
export class GetActiveProjectIdScenario extends CallbackStrategyWithEmpty {
|
||||||
async call(): Promise<Result<any, { id: string }>> {
|
call = async (): Promise<Result<any, { id: string }>> => (
|
||||||
return (
|
await new SearchOneDataBaseModelUseCase<IProjectModel>(ProjectDBModel).call({ isActive: true }, "no active projects")
|
||||||
await new SearchOneDataBaseModelUseCase<IProjectModel>(ProjectDBModel).call({ isActive: true }, "no active projects")
|
).map((model) => Result.ok({ id: model._id }));
|
||||||
).map((model) => Result.ok({ id: model._id }));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,11 @@ import { SocketSubscriber } from "./core/controllers/socket_controller";
|
||||||
import { extensions } from "./core/extensions/extensions";
|
import { extensions } from "./core/extensions/extensions";
|
||||||
import { httpRoutes } from "./core/controllers/routes";
|
import { httpRoutes } from "./core/controllers/routes";
|
||||||
import { executorProgramService } from "./core/usecases/exec_process_usecase";
|
import { executorProgramService } from "./core/usecases/exec_process_usecase";
|
||||||
|
import { main } from "./p";
|
||||||
|
|
||||||
extensions();
|
extensions();
|
||||||
|
|
||||||
const socketSubscribers = [new SocketSubscriber(executorProgramService, "realtime")];
|
const socketSubscribers = [new SocketSubscriber(executorProgramService, "realtime")];
|
||||||
|
|
||||||
new App(httpRoutes, socketSubscribers).listen();
|
new App(httpRoutes, socketSubscribers).listen();
|
||||||
|
// main()
|
|
@ -10,7 +10,6 @@ export class FormBuilderValidationModel extends ValidationModel implements Depen
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
@IsString()
|
@IsString()
|
||||||
public result: string;
|
public result: string;
|
||||||
@IsNotEmpty()
|
|
||||||
@IsString()
|
@IsString()
|
||||||
public context: string;
|
public context: string;
|
||||||
public form: string[];
|
public form: string[];
|
||||||
|
@ -36,6 +35,19 @@ export class FormBuilderValidationModel extends ValidationModel implements Depen
|
||||||
static emptyTest = () => new FormBuilderValidationModel(``, ``, [], defaultFormValue);
|
static emptyTest = () => new FormBuilderValidationModel(``, ``, [], defaultFormValue);
|
||||||
static creteDataSetTest = () => new FormBuilderValidationModel(``, scene, [], "");
|
static creteDataSetTest = () => new FormBuilderValidationModel(``, scene, [], "");
|
||||||
static emptySimple = () => new FormBuilderValidationModel("", simpleFormBuilder, [], "");
|
static emptySimple = () => new FormBuilderValidationModel("", simpleFormBuilder, [], "");
|
||||||
|
static eee = () =>
|
||||||
|
new FormBuilderValidationModel(
|
||||||
|
``,
|
||||||
|
`{
|
||||||
|
"robot_name": \${ROBOT_NAME:string:rbs_arm},
|
||||||
|
"pose": {
|
||||||
|
"position": { "x": \${X:number:0.1}, "y": \${Y:number:0.1}, "z": \${Z:number:0.7} },
|
||||||
|
"orientation": { "x": \${X:number:0.1}, "y": \${Y:number:0.1}, "z": \${Z:number:0.7} }
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
[],
|
||||||
|
""
|
||||||
|
);
|
||||||
static vision = () =>
|
static vision = () =>
|
||||||
new FormBuilderValidationModel(
|
new FormBuilderValidationModel(
|
||||||
`
|
`
|
||||||
|
|
|
@ -16,11 +16,10 @@ export const DrawerV2: React.FC<{
|
||||||
right: isOpen ? 0 : -300,
|
right: isOpen ? 0 : -300,
|
||||||
width: 300,
|
width: 300,
|
||||||
height: "100%",
|
height: "100%",
|
||||||
backgroundColor: themeStore.theme.darkSurface,
|
backgroundColor: "#880ef8",
|
||||||
boxShadow: "-2px 0 5px rgba(0, 0, 0, 0.5)",
|
boxShadow: "-2px 0 5px rgba(0, 0, 0, 0.5)",
|
||||||
transition: "right 0.3s ease",
|
transition: "right 0.3s ease",
|
||||||
zIndex: 1000,
|
zIndex: 1000,
|
||||||
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", width: "100%" }}>
|
<div style={{ height: "100%", width: "100%" }}>
|
||||||
|
|
|
@ -100,7 +100,7 @@ export const FormBuilder = observer(
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<CoreInput
|
<CoreInput
|
||||||
isFormBuilder={true}
|
|
||||||
style={{ margin: 5 }}
|
style={{ margin: 5 }}
|
||||||
onChange={(e) => store.changeTotalSubValue(element.id, subIndex, e, index)}
|
onChange={(e) => store.changeTotalSubValue(element.id, subIndex, e, index)}
|
||||||
validation={
|
validation={
|
||||||
|
@ -131,7 +131,7 @@ export const FormBuilder = observer(
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<CoreInput
|
<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) => {
|
onChange={(e) => {
|
||||||
store.changeTotalValue(element.id, e);
|
store.changeTotalValue(element.id, e);
|
||||||
|
|
|
@ -95,7 +95,7 @@ export class FormViewModel {
|
||||||
.replace(/[^\x00-\x7F]/g, "")
|
.replace(/[^\x00-\x7F]/g, "")
|
||||||
.replaceAll("\n", "")
|
.replaceAll("\n", "")
|
||||||
.replaceAll("\\", "")
|
.replaceAll("\\", "")
|
||||||
// .replaceAll("/", "")
|
// .replaceAll("/", "")
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log("ERROR: FormViewModel json() " + result);
|
console.log("ERROR: FormViewModel json() " + result);
|
||||||
|
@ -190,8 +190,9 @@ export class FormViewModel {
|
||||||
});
|
});
|
||||||
return result as unknown as string;
|
return result as unknown as string;
|
||||||
}
|
}
|
||||||
static fromString(result: string, context: string): Result<void, FormViewModel> {
|
static fromString(result: string = '', context: string = ''): Result<void, FormViewModel> {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (result.isEmpty() && context.isEmpty()) {
|
if (result.isEmpty() && context.isEmpty()) {
|
||||||
return Result.error(undefined);
|
return Result.error(undefined);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import { message } from "antd";
|
||||||
export const SelectProcess = observer((props: IFormBuilderComponentsProps<any>) => {
|
export const SelectProcess = observer((props: IFormBuilderComponentsProps<any>) => {
|
||||||
const [store] = useState(new SelectProcessStore());
|
const [store] = useState(new SelectProcessStore());
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
console.log(props.dependency)
|
||||||
store.loadClassInstance(SelectProcessModel, props.dependency);
|
store.loadClassInstance(SelectProcessModel, props.dependency);
|
||||||
store.init();
|
store.init();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
|
@ -9,7 +9,7 @@ import { FormBuilder } from "./form_builder";
|
||||||
import makeAutoObservable from "mobx-store-inheritance";
|
import makeAutoObservable from "mobx-store-inheritance";
|
||||||
|
|
||||||
class FormBuilderTextStore extends ModalStore {
|
class FormBuilderTextStore extends ModalStore {
|
||||||
viewModel = FormBuilderValidationModel.vision();
|
viewModel = FormBuilderValidationModel.eee();
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
makeAutoObservable(this);
|
makeAutoObservable(this);
|
||||||
|
@ -39,6 +39,7 @@ export const FormBuildTest = observer(() => {
|
||||||
<FormBuilder
|
<FormBuilder
|
||||||
formBuilder={store.viewModel}
|
formBuilder={store.viewModel}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
|
console.log(e)
|
||||||
// console.log(e.output);
|
// console.log(e.output);
|
||||||
console.log(JSON.stringify(e.output))
|
console.log(JSON.stringify(e.output))
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -16,7 +16,6 @@ interface IInputProps extends IStyle {
|
||||||
type?: CoreInputType;
|
type?: CoreInputType;
|
||||||
trim?: boolean;
|
trim?: boolean;
|
||||||
styleContentEditable?: React.CSSProperties;
|
styleContentEditable?: React.CSSProperties;
|
||||||
isFormBuilder?: boolean;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const CoreInput = (props: IInputProps) => {
|
export const CoreInput = (props: IInputProps) => {
|
||||||
|
@ -29,15 +28,6 @@ export const CoreInput = (props: IInputProps) => {
|
||||||
setAppendInnerText(false);
|
setAppendInnerText(false);
|
||||||
}
|
}
|
||||||
}, [ref, value, isAppendInnerText, setAppendInnerText, props]);
|
}, [ref, value, isAppendInnerText, setAppendInnerText, props]);
|
||||||
// React.useEffect(() => {
|
|
||||||
// if (props.isFormBuilder) {
|
|
||||||
// if (ref.current && props.value) {
|
|
||||||
// ref.current.innerText = value;
|
|
||||||
// setValue(props.value);
|
|
||||||
// console.log(props.value);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }, [props.value]);
|
|
||||||
|
|
||||||
const isSmall = props.type !== undefined && props.type.isEqual(CoreInputType.small);
|
const isSmall = props.type !== undefined && props.type.isEqual(CoreInputType.small);
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -2,15 +2,16 @@ import { themeStore } from "../../..";
|
||||||
import { Icon } from "../icons/icons";
|
import { Icon } from "../icons/icons";
|
||||||
import { CoreText, CoreTextType, FontType } from "../text/text";
|
import { CoreText, CoreTextType, FontType } from "../text/text";
|
||||||
|
|
||||||
interface InputV2Props {
|
export const InputV2: React.FC<{
|
||||||
|
style?: React.CSSProperties;
|
||||||
label: string;
|
label: string;
|
||||||
value?: string;
|
value?: string;
|
||||||
trim?: boolean;
|
trim?: boolean;
|
||||||
|
validation?: (value: string) => boolean;
|
||||||
|
error?: string;
|
||||||
height?: number;
|
height?: number;
|
||||||
onChange?: (text: string) => void;
|
onChange?: (text: string) => void;
|
||||||
|
}> = ({ label, height, value, onChange, trim }) => {
|
||||||
}
|
|
||||||
export const InputV2: React.FC<InputV2Props> = ({ label, height, value, onChange, trim }) => {
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
|
|
|
@ -21,7 +21,6 @@ export class BehaviorTreeBuilderHttpRepository extends CoreHttpRepository {
|
||||||
`${this.featureApi}/by_id?id=${id}`,
|
`${this.featureApi}/by_id?id=${id}`,
|
||||||
BehaviorTreeModel
|
BehaviorTreeModel
|
||||||
) as unknown as Promise<Result<HttpError, BehaviorTreeModel>>;
|
) as unknown as Promise<Result<HttpError, BehaviorTreeModel>>;
|
||||||
deleteBt = (id: string) => this._jsonRequest(HttpMethod.DELETE, `${this.featureApi}?id=${id}`);
|
|
||||||
editBt = async (model: BehaviorTreeModel) => {
|
editBt = async (model: BehaviorTreeModel) => {
|
||||||
await this._jsonRequest(HttpMethod.POST, `${this.featureApi}/fill/tree`, model);
|
await this._jsonRequest(HttpMethod.POST, `${this.featureApi}/fill/tree`, model);
|
||||||
model.__v = undefined
|
model.__v = undefined
|
||||||
|
|
|
@ -148,7 +148,7 @@ export const BehaviorTreeBuilderScreen = observer(() => {
|
||||||
width: "calc(100% - 300px)",
|
width: "calc(100% - 300px)",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<PanelGroup direction="horizontal" style={{ width: "100%" }}>
|
{/* <PanelGroup direction="horizontal" style={{ width: "100%" }}>
|
||||||
<Panel>
|
<Panel>
|
||||||
<div
|
<div
|
||||||
ref={ref}
|
ref={ref}
|
||||||
|
@ -160,11 +160,18 @@ export const BehaviorTreeBuilderScreen = observer(() => {
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Panel>
|
</Panel>
|
||||||
<PanelResizeHandle>
|
{store.panels.map((el) => (
|
||||||
<div style={{ width: 10, height: "100%", backgroundColor: "beige" }}></div>
|
<>
|
||||||
</PanelResizeHandle>
|
<PanelResizeHandle>
|
||||||
<Panel defaultSize={0}> </Panel>
|
<div style={{ width: "100%", color: "white" }}>BANE</div>
|
||||||
</PanelGroup>
|
<div
|
||||||
|
style={{ width: 10, height: "100%", backgroundColor: "beige", border: "1px solid black" }}
|
||||||
|
></div>
|
||||||
|
</PanelResizeHandle>
|
||||||
|
<Panel defaultSize={0}> </Panel>
|
||||||
|
</>
|
||||||
|
))}
|
||||||
|
</PanelGroup> */}
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,7 @@ export class BehaviorTreeBuilderStore extends UiDrawerFormState<BehaviorTreeView
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
panels = [1, 1, 1, 1];
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super(DrawerState);
|
super(DrawerState);
|
||||||
|
|
|
@ -81,7 +81,7 @@ export const FormBuilderForm = observer((props: IPropsForm<Partial<FormBuilderVa
|
||||||
store.isModalOpen = false;
|
store.isModalOpen = false;
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<FormBuilder formBuilder={store.viewModel} onChange={() => {}} />
|
<FormBuilder formBuilder={store.viewModel} onChange={(form) => (console.log(form), props.onChange(form))} />
|
||||||
</Modal>
|
</Modal>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { BehaviorTreeViewModel } from "../behavior_tree_builder/model/behavior_t
|
||||||
|
|
||||||
export class BehaviorTreeManagerHttpRepository extends CoreHttpRepository {
|
export class BehaviorTreeManagerHttpRepository extends CoreHttpRepository {
|
||||||
featureApi = `/behavior/trees`;
|
featureApi = `/behavior/trees`;
|
||||||
deleteBt = (id: string) => this._jsonRequest(HttpMethod.DELETE, `${this.featureApi}?id=${id}`);
|
deleteBt = (id: string) => this._jsonRequest(HttpMethod.POST, `${this.featureApi}/delete/bt?id=${id}`);
|
||||||
saveNewBt = async (model: BehaviorTreeViewModel) => this._jsonRequest(HttpMethod.POST, this.featureApi, model);
|
saveNewBt = async (model: BehaviorTreeViewModel) => this._jsonRequest(HttpMethod.POST, this.featureApi, model);
|
||||||
getAllBtInstances = async () => this._jsonRequest<BehaviorTreeModel[]>(HttpMethod.GET, this.featureApi);
|
getAllBtInstances = async () => this._jsonRequest<BehaviorTreeModel[]>(HttpMethod.GET, this.featureApi);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import { useStore } from "../../core/helper/use_store";
|
||||||
import { FormBuilder } from "../../core/ui/form_builder/form_builder";
|
import { FormBuilder } from "../../core/ui/form_builder/form_builder";
|
||||||
import { ButtonV2 } from "../../core/ui/button/button_v2";
|
import { ButtonV2 } from "../../core/ui/button/button_v2";
|
||||||
import { Result } from "../../core/helper/result";
|
import { Result } from "../../core/helper/result";
|
||||||
import { plainToInstance } from "class-transformer";
|
|
||||||
|
|
||||||
export const isValidJson = <T,>(json: any): Result<string, T> => {
|
export const isValidJson = <T,>(json: any): Result<string, T> => {
|
||||||
try {
|
try {
|
||||||
|
@ -288,3 +287,4 @@ export const SkillsScreen = observer(() => {
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
import "reflect-metadata";
|
import "reflect-metadata";
|
||||||
import "antd/dist/antd.min.css";
|
import "antd/dist/antd.min.css";
|
||||||
import ReactDOM from "react-dom/client";
|
import ReactDOM from "react-dom/client";
|
||||||
|
@ -8,6 +7,7 @@ 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 { FormBuildTest } from "./core/ui/form_builder/test";
|
||||||
|
|
||||||
configure({
|
configure({
|
||||||
enforceActions: "never",
|
enforceActions: "never",
|
||||||
|
@ -23,5 +23,6 @@ root.render(
|
||||||
<SocketListener>
|
<SocketListener>
|
||||||
<RouterProvider router={router} />
|
<RouterProvider router={router} />
|
||||||
</SocketListener>
|
</SocketListener>
|
||||||
|
{/* <FormBuildTest /> */}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue