This commit is contained in:
IDONTSUDO 2025-02-15 17:23:27 +03:00
parent 40eebf9dd8
commit d7e8c825cb
12 changed files with 77 additions and 23 deletions

View file

@ -9,6 +9,9 @@ import { dirname } from "path";
import { CheckAndCreateStaticFilesFolderUseCase } from "../usecases/check_and_create_static_files_folder_usecase";
import { DataBaseConnectUseCase } from "../usecases/database_connect_usecase";
import { TypedEvent } from "../helpers/typed_event";
import { CalculationInstanceDBModel } from "../../features/calculations_instance/models/calculations_instance_database_model";
import * as fs from "fs";
import { WriteFileSystemFileUseCase } from "../usecases/write_file_system_file_usecase";
export enum ServerStatus {
init = "init",
@ -85,7 +88,25 @@ export class App extends TypedEvent<ServerStatus> {
this.app.use(express.json());
this.app.use(express.urlencoded({ extended: true }));
this.app.use(express.static(App.staticFilesStoreDir()));
this.app.get('/logs', async (req, res) => {
const id = req.query.id;
if (id === undefined) {
return res.status(400).json('need req query id?=')
}
const calculationInstanceDBModel = await CalculationInstanceDBModel.findById(id)
if (calculationInstanceDBModel === null) {
return res.status(400).json("calcultaion db model is null");
}
const p = App.staticFilesStoreDir() + '/log.txt';
(await new WriteFileSystemFileUseCase().call(p, calculationInstanceDBModel.lastProcessLogs)).map(() => {
return res.sendFile(p);
})
})
this.app.use(
fileUpload({
createParentPath: true,

View file

@ -65,12 +65,12 @@ interface ISubSetFeatureRouter<A> {
method: HttpMethodType;
subUrl: string;
fn:
| CallbackStrategyWithValidationModel<A>
| CallbackStrategyWithEmpty
| CallbackStrategyWithIdQuery
| CallBackStrategyWithQueryPage
| CallbackStrategyWithFileUpload
| CallbackStrategyWithFilesUploads;
| CallbackStrategyWithValidationModel<A>
| CallbackStrategyWithEmpty
| CallbackStrategyWithIdQuery
| CallBackStrategyWithQueryPage
| CallbackStrategyWithFileUpload
| CallbackStrategyWithFilesUploads;
}
abstract class ICoreHttpController {
@ -234,6 +234,7 @@ export class CoreHttpController<V> implements ICoreHttpController {
return res.json(ok);
},
(err) => {
return res.status(400).json({ error: String(err) });
}
);

View file

@ -0,0 +1,11 @@
import { CallbackStrategyWithIdQuery, ResponseBase } from "../../../core/controllers/http_controller";
import { ReadByIdDataBaseModelUseCase } from "../../../core/usecases/read_database_model_usecase";
import { CoreValidation } from "../../../core/validations/core_validation";
import { MongoIdValidation } from "../../../core/validations/mongo_id_validation";
import { ICalculationInstance, CalculationInstanceDBModel } from "../models/calculations_instance_database_model";
// export class LogToProcessUseCase extends CallbackStrategyWithIdQuery {
// idValidationExpression: CoreValidation = new MongoIdValidation();
// call = async (id: string): ResponseBase => (await new ReadByIdDataBaseModelUseCase<ICalculationInstance>(CalculationInstanceDBModel).call(id)).map((model) => );
// }

View file

@ -4,7 +4,6 @@ import { SocketSubscriber } from "./core/controllers/socket_controller";
import { extensions } from "./core/extensions/extensions";
import { httpRoutes } from "./core/controllers/routes";
import { executorProgramService } from "./core/usecases/exec_process_usecase";
// import { main } from "./p";
import { executorProgramServiceV2 } from "./core/scenarios/exec_process_scenario_v2";
extensions();
@ -12,4 +11,3 @@ extensions();
const socketSubscribers = [new SocketSubscriber(executorProgramService, "realtime"), new SocketSubscriber(executorProgramServiceV2, 'realtimeV2',)];
new App(httpRoutes, socketSubscribers).listen();
// main()

View file

@ -7,14 +7,15 @@ export const DrawerV2: React.FC<{
title?: string;
onClose: () => void;
children: React.ReactNode;
}> = ({ isOpen, onClose, children, title }) => {
width?: number;
}> = ({ isOpen, onClose, children, title, width }) => {
return (
<div
style={{
position: "fixed",
top: 0,
right: isOpen ? 0 : -300,
width: 300,
right: isOpen ? 0 : (width ?? 300) * -1,
width: width ?? 300,
height: "100%",
backgroundColor: "#880ef8",
boxShadow: "-2px 0 5px rgba(0, 0, 0, 0.5)",

View file

@ -16,7 +16,6 @@ export const ListItem = (props: IListItemProps) => {
backgroundColor: "rgba(254, 247, 255, 1)",
border: "1px #6750a4 solid",
width: "100%",
height: 110,
display: "flex",
justifyContent: "space-between",
alignItems: "center",

View file

@ -186,8 +186,17 @@ export const BehaviorTreeBuilderScreen = observer(() => {
title={store.titleDrawer}
onClose={() => store.editDrawer(DrawerState.editThreadBehaviorTree, false)}
isOpen={store.drawers.find((el) => el.name === DrawerState.editThreadBehaviorTree)?.status}
width={window.innerWidth / 2}
>
<div style={{ display: "flex", flexDirection: "column", justifyContent: "space-between", height: "100%" }}>
<div
style={{
display: "flex",
flexDirection: "column",
justifyContent: "space-between",
height: "100%",
overflow: "auto",
}}
>
<div style={{ height: "100%" }}>
{store.skillTemplates?.getForms(store.selected ?? "").map((formType, index) =>
forms(

View file

@ -1,6 +1,6 @@
import { observer } from "mobx-react-lite";
import { BehaviorTreeManagerStore } from "./behavior_tree_manager_store";
import React from "react";
import React, { useEffect } from "react";
import { useStore } from "../../core/helper/use_store";
import { ButtonV2, ButtonV2Type } from "../../core/ui/button/button_v2";
import { CoreCard } from "../../core/ui/card/card";
@ -16,13 +16,13 @@ export const BehaviorTreeManagerScreenPath = "/behavior/tree/manager";
export const BehaviorTreeManagerScreen = observer(() => {
const store = useStore(BehaviorTreeManagerStore);
useEffect(() => {}, []);
return (
<>
<MainPageV2
children={
<>
<div style={{ height: "100%", overflowY: "auto", overflowX: "hidden" }}>
<div style={{ height: "100%", }}>
<div style={{ height: 20 }} />
<ButtonV2
icon={<Icon type={"Plus"} style={{ alignSelf: "center", marginLeft: 10, marginRight: 10 }} />}
@ -65,9 +65,13 @@ export const BehaviorTreeManagerScreen = observer(() => {
}}
/>
<div style={{ height: 20 }} />
<InputV2 trim={true} label={"Название"} onChange={(text) => store.updateForm({ name: text })} />
<InputV2 trim={true} label={"Название"} onChange={(text) => store.updateForm({ name: text })} />
<div style={{ height: 20 }} />
<InputV2 trim={true} label={"Описание"} onChange={(text) => store.updateForm({ description: text })} />
<InputV2
trim={true}
label={"Описание"}
onChange={(text) => store.updateForm({ description: text })}
/>
<div style={{ height: 20 }} />
<SelectV2
items={store.scenes?.map((el) => ({ name: el.name, value: el._id })) ?? []}

View file

@ -14,7 +14,13 @@ export interface ISkils {
}
export class CalculationHttpRepository extends CoreHttpRepository {
async getLogs(id: string) {
await this._request(HttpMethod.GET, `/logs?id=${id}`)
window.location.href = 'http://localhost:4001/log.txt';
}
featureApi = `/calculations/instances`;
subFeatureApi = `/calculations/template`;

View file

@ -60,7 +60,8 @@ export const CalculationInstanceScreen = observer(() => {
() => store.deleteInstance(el._id ?? ""),
() => store.execSkill(el._id ?? ""),
() => store.execSkill(el._id ?? ""),
() => store.changeProcessStatus(el._id ?? "")
() => store.changeProcessStatus(el._id ?? ""),
() => store.getTxtLog(el._id ?? "")
)}
</span>
);

View file

@ -21,6 +21,7 @@ export enum StoreTypes {
}
export class CalculationInstanceStore extends UiDrawerFormState<calculationModel, HttpError> {
getTxtLog = (id: string) => this.calculationHttpRepository.getLogs(id);
calculationHttpRepository: CalculationHttpRepository = new CalculationHttpRepository();
calculationSocketRepository: CalculationSocketRepository = new CalculationSocketRepository();
activeProjectId?: UUID;

View file

@ -1,6 +1,6 @@
import { match } from "ts-pattern";
import { PoseEstimateCard } from "./pose_estimate_card/model_card";
import { Checkbox, Dropdown, MenuProps, message } from "antd";
import { Dropdown, MenuProps, } from "antd";
import { CoreText, CoreTextType } from "../../../../../core/ui/text/text";
import { IMenuItem } from "../../../../dataset/card_dataset";
import { Icon } from "../../../../../core/ui/icons/icons";
@ -16,7 +16,8 @@ export const getModelCard = (
onDelete: Function,
onPlay: Function,
onPause: Function,
onChangeProcessIsEnd: Function
onChangeProcessIsEnd: Function,
onLog: Function
) => {
const menu: IMenuItem[] = [
{
@ -68,7 +69,8 @@ export const getModelCard = (
<Icon
type="Log"
onClick={async () =>
window.prompt("Copy to clipboard: Ctrl+C, Enter", calculationModel.lastProcessLogs ?? "Not found logs")
// window.prompt("Copy to clipboard: Ctrl+C, Enter", calculationModel.lastProcessLogs ?? "Not found logs")
onLog()
}
/>
<Icon