diff --git a/server/src/features/calculations_instance/calculations_instance_presentation.ts b/server/src/features/calculations_instance/calculations_instance_presentation.ts index 8dfeb8e..d89766d 100644 --- a/server/src/features/calculations_instance/calculations_instance_presentation.ts +++ b/server/src/features/calculations_instance/calculations_instance_presentation.ts @@ -4,7 +4,8 @@ import { CalculationInstanceValidationModel } from "./models/calculations_instan import { CalculationInstanceDBModel } from "./models/calculations_instance_database_model"; import { CreateCalculationInstanceScenario } from "./domain/create_calculation_instance_scenario"; import { DeleteCalculationsInstanceScenario } from "./domain/delete_calculations_instance_scenario"; - +import { GetAllEndCalculationsInstanceActiveProjectScenarios } from "./domain/get_all_end_calculations_instance_active_project_scenarios"; + export class CalculationsInstancesPresentation extends CrudController< CalculationInstanceValidationModel, @@ -19,7 +20,12 @@ export class CalculationsInstancesPresentation extends CrudController< super.delete(new DeleteCalculationsInstanceScenario().call); super.post(new CreateCalculationInstanceScenario().call); - + this.subRoutes.push({ + method: "POST", + subUrl: "get/all/end/calculations", + //@ts-expect-error + fn: new GetAllEndCalculationsInstanceActiveProjectScenarios(), + }) this.subRoutes.push({ method: "GET", subUrl: "exec", @@ -27,4 +33,3 @@ export class CalculationsInstancesPresentation extends CrudController< }); } } - \ No newline at end of file diff --git a/server/src/features/calculations_instance/domain/get_all_end_calculations_instance_active_project_scenarios.ts b/server/src/features/calculations_instance/domain/get_all_end_calculations_instance_active_project_scenarios.ts new file mode 100644 index 0000000..b9eb5f3 --- /dev/null +++ b/server/src/features/calculations_instance/domain/get_all_end_calculations_instance_active_project_scenarios.ts @@ -0,0 +1,20 @@ +import { IsString } from "class-validator"; +import { CallbackStrategyWithValidationModel, ResponseBase } from "../../../core/controllers/http_controller"; +import { SearchManyDataBaseModelUseCase } from "../../../core/usecases/search_many_database_model_usecase"; +import { GetActiveProjectIdScenario } from "../../projects/domain/get_active_project_id_scenario"; +import { ICalculationInstance, CalculationInstanceDBModel } from "../models/calculations_instance_database_model"; + + +export class CalculationInstanceType { + @IsString() + type: string; +} + +export class GetAllEndCalculationsInstanceActiveProjectScenarios extends CallbackStrategyWithValidationModel { + validationModel: CalculationInstanceType = new CalculationInstanceType(); + call = async (model: CalculationInstanceType): ResponseBase => (await new GetActiveProjectIdScenario().call()).map( + async (activeProjectModel) => await new SearchManyDataBaseModelUseCase(CalculationInstanceDBModel).call({ project: activeProjectModel.id, isEnd: true, type: model.type }), + ); + + +} diff --git a/server/src/features/calculations_instance/models/calculations_instance_database_model.ts b/server/src/features/calculations_instance/models/calculations_instance_database_model.ts index f52a63d..43a091d 100644 --- a/server/src/features/calculations_instance/models/calculations_instance_database_model.ts +++ b/server/src/features/calculations_instance/models/calculations_instance_database_model.ts @@ -62,6 +62,7 @@ export const CalculationInstanceSchema = new Schema({ instancePath: { type: String, }, + project: { type: Schema.Types.ObjectId, ref: projectSchema, diff --git a/ui/src/core/extensions/array.ts b/ui/src/core/extensions/array.ts index 33ec3d8..6ea9308 100644 --- a/ui/src/core/extensions/array.ts +++ b/ui/src/core/extensions/array.ts @@ -10,6 +10,11 @@ export const ArrayExtensions = () => { return Result.ok(this); }; } + if ([].whereOne === undefined) { + Array.prototype.whereOne = function (predicate) { + return this.filter(predicate).atR(0); + } + } if ([].atR === undefined) { Array.prototype.atR = function (index) { if (index === undefined) { diff --git a/ui/src/core/extensions/extensions.ts b/ui/src/core/extensions/extensions.ts index 5afcbed..acacdd9 100644 --- a/ui/src/core/extensions/extensions.ts +++ b/ui/src/core/extensions/extensions.ts @@ -30,6 +30,7 @@ declare global { someR(predicate: (value: T) => boolean): Result>; updateAll(value: Partial): Array; atR(index: number | undefined): Result; + whereOne(predicate: (value: T) => boolean): 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 f858f40..7fa447e 100644 --- a/ui/src/core/model/form_builder_validation_model.tsx +++ b/ui/src/core/model/form_builder_validation_model.tsx @@ -1,19 +1,12 @@ 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; @@ -36,22 +29,13 @@ export class FormBuilderValidationModel formBuilderValidationModel.context.isEmpty() && formBuilderValidationModel.result.isEmpty() && formBuilderValidationModel.form.isEmpty(); - static test = () => - new FormBuilderValidationModel(ffContext, ff1Result, [], ""); + 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( ` @@ -96,6 +80,7 @@ export class FormBuilderValidationModel };`, ` { + "process":\${:OBJECT:{"type": "OBJECT_DETECTION"}, "datasetObjects":\${:OBJECT:{"details": []}, "typedataset": \${typedataset:Enum:ObjectDetection}, "models_randomization":{ diff --git a/ui/src/core/store/base_store.ts b/ui/src/core/store/base_store.ts index b9562f6..ebd7e65 100644 --- a/ui/src/core/store/base_store.ts +++ b/ui/src/core/store/base_store.ts @@ -127,6 +127,3 @@ export abstract class FormState extends UiErrorState { this.viewModel = plainToInstance(instance, viewModel); }; } - - - \ 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 ad60b8a..753a02a 100644 --- a/ui/src/core/ui/form_builder/form_builder.tsx +++ b/ui/src/core/ui/form_builder/form_builder.tsx @@ -1,9 +1,5 @@ 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"; @@ -13,219 +9,162 @@ import { CoreText, CoreTextType } from "../text/text"; import { getFormBuilderComponents } from "./forms/form_builder_components"; import { FormBuilderValidationModel } from "../../model/form_builder_validation_model"; -export interface IFormBuilder { - formBuilder: FormBuilderValidationModel; - onChange: (change: FormBuilderValidationModel) => void; -} +export const FormBuilder = observer( + (props: { formBuilder: FormBuilderValidationModel; onChange: (change: FormBuilderValidationModel) => void }) => { + const [store] = React.useState(() => new FormBuilderStore()); -export const FormBuilder = observer((props: IFormBuilder) => { - const [store] = React.useState(() => new FormBuilderStore()); + React.useEffect(() => { + store.init(props.formBuilder.context, props.formBuilder.result); + if (props.formBuilder.form.isNotEmpty()) { + store.formViewModel = new FormViewModel( + props.formBuilder.form.map((el) => InputBuilderViewModel.fromJSON(el)), + props.formBuilder.result, + props.formBuilder.context + ); + props.formBuilder.form.map((el) => InputBuilderViewModel.fromJSON(el)); + } + store.changerForm.on((event) => { + if (event) props.onChange(event); + }); + }, []); - React.useEffect(() => { - store.init(props.formBuilder.context, props.formBuilder.result); - if (props.formBuilder.form.isNotEmpty()) { - store.formViewModel = new FormViewModel( - props.formBuilder.form.map((el) => InputBuilderViewModel.fromJSON(el)), - props.formBuilder.result, - props.formBuilder.context - ); - props.formBuilder.form.map((el) => InputBuilderViewModel.fromJSON(el)); - } - store.changerForm.on((event) => { - if (event) props.onChange(event); - }); - }, []); + return ( +
+ {store.isError ? ( + <>Error + ) : ( +
+ {store.formViewModel?.inputs?.map((element, index) => { + if (element.type?.isEqual(InputType.ENUM)) { + const values = element.values as string[]; + return ( + store.changeTotalValue(element.id, value)} + label={element.name} + style={{ margin: 20 }} + /> + ); + } + if (element.type?.isEqual(InputType.ARRAY)) { + return ( +
+
{ + store.open(element.id); + }} + > + + +
- return ( -
- {store.isError ? ( - <>Error - ) : ( -
- {store.formViewModel?.inputs?.map((element, index) => { - if (element.type?.isEqual(InputType.ENUM)) { - const values = element.values as string[]; - return ( - - store.changeTotalValue(element.id, value) - } - label={element.name} - style={{ margin: 20 }} - /> - ); - } - if (element.type?.isEqual(InputType.ARRAY)) { - return ( -
-
{ - store.open(element.id); - }} - > - - -
+ {element.isOpen ? ( +
+ {element.totalValue instanceof Array + ? element.totalValue?.map((subArray, index) => { + return ( +
+
+ + store.deleteTotalValueSubItem(element.id, index)} + /> +
- {element.isOpen ? ( -
- {element.totalValue instanceof Array - ? element.totalValue?.map((subArray, index) => { - return ( -
-
- - - store.deleteTotalValueSubItem( - element.id, - index - ) - } - /> -
- - {subArray.map( - ( - subSubArrayItem: InputBuilderViewModel, - subIndex: number - ) => { - if ( - subSubArrayItem.type.isEqual( - InputType.ENUM - ) - ) { + {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) - } + 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, - ]) - ) + if (subSubArrayItem.type.isEqualMany([InputType.NUMBER, InputType.STRING])) return (
- store.changeTotalSubValue( - element.id, - subIndex, - e, - index - ) - } + onChange={(e) => store.changeTotalSubValue(element.id, subIndex, e, index)} validation={ - subSubArrayItem.type.isEqual( - InputType.NUMBER - ) + subSubArrayItem.type.isEqual(InputType.NUMBER) ? (el) => Number().isValid(el) : undefined } error="только числа" - value={ - subSubArrayItem.totalValue ?? - subSubArrayItem.defaultValue - } + value={subSubArrayItem.totalValue ?? subSubArrayItem.defaultValue} label={subSubArrayItem.name} />
); return <>Error; - } - )} -
- ); - }) - : null} -
- ) : null} -
- ); - } + })} +
+ ); + }) + : null} +
+ ) : null} +
+ ); + } - if (element.type?.isEqualMany([InputType.NUMBER, InputType.STRING])) - return ( -
- Number().isValid(el) - : undefined - } - onChange={(e) => { - store.changeTotalValue(element.id, e); - }} - value={element.totalValue ?? element.defaultValue} - error="только числа" - label={element.name} - style={{ margin: 20 }} - /> -
- ); - if (element.type?.isEqual(InputType.OBJECT)) - return ( - <> - {getFormBuilderComponents( - element.name - .replace(">", "") - .replace("<", "") - .replace("/", ""), - element.totalValue ?? element.defaultValue, - (text) => store.changeTotalValue(element.id, text) - ).fold( - (s) => ( - <>{s} - ), - (error) => ( - <>{error} - ) - )} - - ); - return
Error {String(element)}
; - })} -
- )} -
- ); -}); + if (element.type?.isEqualMany([InputType.NUMBER, InputType.STRING])) + return ( +
+ Number().isValid(el) : undefined} + onChange={(e) => { + store.changeTotalValue(element.id, e); + }} + value={element.totalValue ?? element.defaultValue} + error="только числа" + label={element.name} + style={{ margin: 20 }} + /> +
+ ); + if (element.type?.isEqual(InputType.OBJECT)) + return ( + <> + {getFormBuilderComponents( + element.name.replace(">", "").replace("<", "").replace("/", ""), + element.totalValue ?? element.defaultValue, + (text) => store.changeTotalValue(element.id, text) + ).fold( + (s) => ( + <>{s} + ), + (error) => ( + <>{error} + ) + )} + + ); + return
Error {String(element)}
; + })} +
+ )} +
+ ); + } +); diff --git a/ui/src/core/ui/form_builder/forms/form_builder_components.tsx b/ui/src/core/ui/form_builder/forms/form_builder_components.tsx index ec30844..1e40957 100644 --- a/ui/src/core/ui/form_builder/forms/form_builder_components.tsx +++ b/ui/src/core/ui/form_builder/forms/form_builder_components.tsx @@ -1,10 +1,10 @@ import { Result } from "../../../helper/result"; -import { SelectDatasetScreen } from "./select_dataset/presentation/select_dataset_screen"; +import { SelectProcess } from "./select_dataset/presentation/select_process"; import { SelectDetail } from "./select_detail/presentation/select_detail_screen"; export enum FormBuilderComponents { SelectDetail = "SelectDetail", - SelectDataset = "SelectDataset", + SelectProcess = "SelectProcess", } export interface IFormBuilderComponentsProps { dependency: T; @@ -18,8 +18,8 @@ export const getFormBuilderComponents = ( if (name.isEqual(FormBuilderComponents.SelectDetail)) { return Result.ok(); } - if (name.isEqual(FormBuilderComponents.SelectDataset)) { - return Result.ok(); + if (name.isEqual(FormBuilderComponents.SelectProcess)) { + return Result.ok(); } return Result.error(name); }; diff --git a/ui/src/core/ui/form_builder/forms/select_dataset/data/select_dataset_repository.tsx b/ui/src/core/ui/form_builder/forms/select_dataset/data/select_dataset_repository.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/ui/src/core/ui/form_builder/forms/select_dataset/data/select_process_repository.ts b/ui/src/core/ui/form_builder/forms/select_dataset/data/select_process_repository.ts new file mode 100644 index 0000000..b511865 --- /dev/null +++ b/ui/src/core/ui/form_builder/forms/select_dataset/data/select_process_repository.ts @@ -0,0 +1,5 @@ +import { CoreHttpRepository, HttpMethod } from "../../../../../repository/core_http_repository"; + +export class SelectProcessRepository extends CoreHttpRepository { + getAllProcessByType = (type: string) => this._jsonRequest(HttpMethod.POST, '/calculations/instances/get/all/end/calculations', { type: type }) +} \ No newline at end of file diff --git a/ui/src/core/ui/form_builder/forms/select_dataset/model/select_dataset_model.ts b/ui/src/core/ui/form_builder/forms/select_dataset/model/select_dataset_model.ts deleted file mode 100644 index e69de29..0000000 diff --git a/ui/src/core/ui/form_builder/forms/select_dataset/model/select_process_model.ts b/ui/src/core/ui/form_builder/forms/select_dataset/model/select_process_model.ts new file mode 100644 index 0000000..f69343b --- /dev/null +++ b/ui/src/core/ui/form_builder/forms/select_dataset/model/select_process_model.ts @@ -0,0 +1,12 @@ +import { IsString } from "class-validator"; +import { ValidationModel } from "../../../../../model/validation_model"; + + +export class SelectProcessModel extends ValidationModel { + @IsString() + type: string; + @IsString() + selectProcess?: any; + @IsString() + process?: string; +} \ No newline at end of file diff --git a/ui/src/core/ui/form_builder/forms/select_dataset/presentation/select_dataset_screen.tsx b/ui/src/core/ui/form_builder/forms/select_dataset/presentation/select_dataset_screen.tsx deleted file mode 100644 index 31d57a6..0000000 --- a/ui/src/core/ui/form_builder/forms/select_dataset/presentation/select_dataset_screen.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { observer } from "mobx-react-lite"; -import { IFormBuilderComponentsProps } from "../../form_builder_components"; - -export const SelectDatasetScreen = observer((props:IFormBuilderComponentsProps) => { - return <>SELECT DATASET; -}); diff --git a/ui/src/core/ui/form_builder/forms/select_dataset/presentation/select_dataset_store.ts b/ui/src/core/ui/form_builder/forms/select_dataset/presentation/select_dataset_store.ts deleted file mode 100644 index e69de29..0000000 diff --git a/ui/src/core/ui/form_builder/forms/select_dataset/presentation/select_process.tsx b/ui/src/core/ui/form_builder/forms/select_dataset/presentation/select_process.tsx new file mode 100644 index 0000000..902bb18 --- /dev/null +++ b/ui/src/core/ui/form_builder/forms/select_dataset/presentation/select_process.tsx @@ -0,0 +1,35 @@ +import React, { useState } from "react"; +import { observer } from "mobx-react-lite"; +import { IFormBuilderComponentsProps } from "../../form_builder_components"; +import { useStore } from "../../../../../helper/use_store"; +import { SelectProcessStore } from "./select_process_store"; +import { useEffect } from "react"; +import { SelectProcessModel } from "../model/select_process_model"; +import { Loader } from "../../../../loader/loader"; +import { CoreSelect } from "../../../../select/select"; + +export const SelectProcess = observer((props: IFormBuilderComponentsProps) => { + const [store] = useState(new SelectProcessStore()); + useEffect(() => { + store.loadClassInstance(SelectProcessModel, props.dependency); + store.init(); + }, []); + return ( +
+ {store.isLoading ? ( + + ) : ( +
+ el.name)} + value={store.viewModel.selectProcess?.name} + label={`Процесс тип ${store.viewModel.type}`} + onChange={(value: string, index: number) => + store.updateForm({ selectProcess: store.calculationInstances.atR(index).map((el) => el) }) + } + /> +
+ )} +
+ ); +}); diff --git a/ui/src/core/ui/form_builder/forms/select_dataset/presentation/select_process_store.ts b/ui/src/core/ui/form_builder/forms/select_dataset/presentation/select_process_store.ts new file mode 100644 index 0000000..ccd3211 --- /dev/null +++ b/ui/src/core/ui/form_builder/forms/select_dataset/presentation/select_process_store.ts @@ -0,0 +1,20 @@ +import { NavigateFunction } from "react-router-dom"; +import { FormState } from "../../../../../store/base_store"; +import { SelectProcessModel } from "../model/select_process_model"; +import { SelectProcessRepository } from "../data/select_process_repository"; +import { CalculationModel } from "../../../../../../features/calculation_instance/model/calculation_model"; +import makeAutoObservable from "mobx-store-inheritance"; + +export class SelectProcessStore extends FormState { + selectProcessRepository = new SelectProcessRepository(); + viewModel: SelectProcessModel; + calculationInstances: CalculationModel[] = []; + constructor() { + super(); + makeAutoObservable(this); + } + async init(navigate?: NavigateFunction | undefined): Promise { + await this.mapOk('calculationInstances', this.selectProcessRepository.getAllProcessByType(this.viewModel.type)); + console.log(this.calculationInstances); + } +} \ No newline at end of file diff --git a/ui/src/core/ui/form_builder/forms/select_detail/presentation/select_detail_screen.tsx b/ui/src/core/ui/form_builder/forms/select_detail/presentation/select_detail_screen.tsx index 5e0aa28..596b70e 100644 --- a/ui/src/core/ui/form_builder/forms/select_detail/presentation/select_detail_screen.tsx +++ b/ui/src/core/ui/form_builder/forms/select_detail/presentation/select_detail_screen.tsx @@ -1,4 +1,4 @@ -// @ts-nocheck + import React from "react"; import { IFormBuilderComponentsProps } from "../../form_builder_components"; import { observer } from "mobx-react-lite"; @@ -10,7 +10,7 @@ import { plainToInstance } from "class-transformer"; export const SelectDetail = observer((props: IFormBuilderComponentsProps) => { const [store] = React.useState(() => new SelectDetailStore()); React.useEffect(() => { - console.log(props.dependency.details); + store.viewModel = new SelectDetailViewModel(props.dependency.details); store.isLoading = false; store.init(); diff --git a/ui/src/core/ui/form_builder/test.tsx b/ui/src/core/ui/form_builder/test.tsx index 5074df0..54b6dea 100644 --- a/ui/src/core/ui/form_builder/test.tsx +++ b/ui/src/core/ui/form_builder/test.tsx @@ -9,7 +9,7 @@ import { FormBuilder } from "./form_builder"; import makeAutoObservable from "mobx-store-inheritance"; class FormBuilderTextStore extends ModalStore { - viewModel = FormBuilderValidationModel.empty(); + viewModel = FormBuilderValidationModel.vision(); constructor() { super(); makeAutoObservable(this); @@ -21,6 +21,7 @@ export const FormBuildTest = observer(() => { return (
+ (store.viewModel.result = text)} /> (store.viewModel.context = text)} /> (store.isModalOpen = true)} /> @@ -33,15 +34,15 @@ export const FormBuildTest = observer(() => { onCancel={() => { store.isModalOpen = false; }} - > - { - console.log(e.output); - // console.log(JSON.stringify(e.output)) - }} - /> - + > +
+ { + console.log(e.output); + // console.log(JSON.stringify(e.output)) + }} + />
); }); diff --git a/ui/src/core/ui/select/select.tsx b/ui/src/core/ui/select/select.tsx index 017c16f..47bff79 100644 --- a/ui/src/core/ui/select/select.tsx +++ b/ui/src/core/ui/select/select.tsx @@ -6,7 +6,7 @@ interface ICoreSelectProps extends IStyle { items: string[]; value: string; label: string; - onChange: (value: string) => void; + onChange: (value: string, index: number) => void; } export const CoreSelect = (props: ICoreSelectProps) => { const ref = React.useRef(null); @@ -52,7 +52,7 @@ export const CoreSelect = (props: ICoreSelectProps) => { key={i} onClick={() => { setValue(el); - props.onChange(el); + props.onChange(el, i); }} style={{ backgroundColor: "rgba(230, 224, 233, 1)", diff --git a/ui/src/features/calculation_instance/presentation/calculation_instance_screen.tsx b/ui/src/features/calculation_instance/presentation/calculation_instance_screen.tsx index a149435..68822ae 100644 --- a/ui/src/features/calculation_instance/presentation/calculation_instance_screen.tsx +++ b/ui/src/features/calculation_instance/presentation/calculation_instance_screen.tsx @@ -28,7 +28,6 @@ export const CalculationInstanceScreenPath = "/calculation"; export const CalculationInstanceScreen = observer(() => { const store = useStore(CalculationInstanceStore); - // console.log(200); return ( <> { () => store.makeEditProcess(el), () => store.deleteInstance(el._id ?? ""), () => store.execSkill(el._id ?? ""), - () => store.execSkill(el._id ?? "") + () => store.execSkill(el._id ?? ""), + () => store.changeProcessStatus(el._id ?? ''), )} ); diff --git a/ui/src/features/calculation_instance/presentation/calculation_instance_store.tsx b/ui/src/features/calculation_instance/presentation/calculation_instance_store.tsx index 1ca399a..fa5fad8 100644 --- a/ui/src/features/calculation_instance/presentation/calculation_instance_store.tsx +++ b/ui/src/features/calculation_instance/presentation/calculation_instance_store.tsx @@ -5,7 +5,7 @@ import { Drawer, UiDrawerFormState } from "../../../core/store/base_store"; import { CalculationHttpRepository } from "../data/calculation_http_repository"; import { message } from "antd"; import { UUID } from "../../all_projects/data/project_http_repository"; -import { CalculationModel } from "../model/calculation_model"; +import { CalculationModel as calculationModel } from "../model/calculation_model"; import { ProcessUpdate, CalculationSocketRepository } from "../data/calculation_socket_repository"; import { match } from "ts-pattern"; import { plainToInstance } from "class-transformer"; @@ -20,16 +20,16 @@ export enum StoreTypes { empty = "empty", } -export class CalculationInstanceStore extends UiDrawerFormState { +export class CalculationInstanceStore extends UiDrawerFormState { calculationHttpRepository: CalculationHttpRepository = new CalculationHttpRepository(); calculationSocketRepository: CalculationSocketRepository = new CalculationSocketRepository(); activeProjectId?: UUID; storeType: StoreTypes = StoreTypes.empty; - viewModel: CalculationModel = CalculationModel.empty(); - modelTemplate?: CalculationModel[]; - editProcess?: CalculationModel; - calculationInstances?: CalculationModel[]; - selectTemplate?: CalculationModel; + viewModel: calculationModel = calculationModel.empty(); + modelTemplate?: calculationModel[]; + editProcess?: calculationModel; + calculationInstances?: calculationModel[]; + selectTemplate?: calculationModel; titleDrawer: string = DrawersSkill.NEW_SKILL; drawers: Drawer[]; isModalOpen: boolean = false; @@ -41,7 +41,7 @@ export class CalculationInstanceStore extends UiDrawerFormState { + setSelectTemplate = (el: calculationModel) => { this.selectTemplate = el; - const instance = plainToInstance(CalculationModel, el); + const instance = plainToInstance(calculationModel, el); instance.instanceName = this?.viewModel.instanceName; this.viewModel = instance; }; @@ -84,7 +84,7 @@ export class CalculationInstanceStore extends UiDrawerFormState {}) .with(StoreTypes.newType, async () => - (await this.viewModel.valid()).fold( + (await this.viewModel.valid()).fold( async (model) => { model.project = this.activeProjectId?.id; @@ -99,7 +99,7 @@ export class CalculationInstanceStore extends UiDrawerFormState { - (await this.viewModel.valid()).fold( + (await this.viewModel.valid()).fold( async (model) => { delete model._id; model.project = this.activeProjectId?.id; @@ -128,20 +128,30 @@ export class CalculationInstanceStore extends UiDrawerFormState { this.editDrawer(DrawersSkill.EDIT_SKILL, false); - (await this.viewModel.valid()).fold( + (await this.viewModel.valid()).fold( async (model) => await this.calculationHttpRepository.editCalculation(model), async (err) => message.error(err) ); }; - makeEditProcess = (el: CalculationModel) => { + makeEditProcess = (el: calculationModel) => { this.editProcess = el; - this.loadClassInstance(CalculationModel, el); + this.loadClassInstance(calculationModel, el); this.editDrawer(DrawersSkill.EDIT_SKILL, true); }; - deleteTemplate = async (el: CalculationModel) => { + deleteTemplate = async (el: calculationModel) => { await this.messageHttp(this.calculationHttpRepository.deleteTemplate(el._id ?? ""), { successMessage: "Удален", }); await this.mapOk("modelTemplate", this.calculationHttpRepository.getAllTemplates()); }; + changeProcessStatus = async (id: string) => + this! + .calculationInstances!.whereOne((el) => el._id === id) + .map( + async (calculationModel) => ( + (calculationModel.isEnd = !calculationModel.isEnd), + await this.calculationHttpRepository.editCalculation(calculationModel), + await this.init(undefined) + ) + ); } diff --git a/ui/src/features/calculation_instance/presentation/ui/cards/get_model_card.tsx b/ui/src/features/calculation_instance/presentation/ui/cards/get_model_card.tsx index 901029d..fdb16ca 100644 --- a/ui/src/features/calculation_instance/presentation/ui/cards/get_model_card.tsx +++ b/ui/src/features/calculation_instance/presentation/ui/cards/get_model_card.tsx @@ -1,6 +1,6 @@ import { match } from "ts-pattern"; import { PoseEstimateCard } from "./pose_estimate_card/model_card"; -import { Dropdown, MenuProps, message } from "antd"; +import { Checkbox, Dropdown, MenuProps, message } from "antd"; import { CoreText, CoreTextType } from "../../../../../core/ui/text/text"; import { IMenuItem } from "../../../../dataset/card_dataset"; import { Icon } from "../../../../../core/ui/icons/icons"; @@ -15,7 +15,8 @@ export const getModelCard = ( onEdit: Function, onDelete: Function, onPlay: Function, - onPause: Function + onPause: Function, + onChangeProcessIsEnd: Function ) => { const menu: IMenuItem[] = [ { @@ -26,6 +27,10 @@ export const getModelCard = ( onClick: () => onDelete(), name: "Удалить", }, + { + onClick: () => onChangeProcessIsEnd(), + name: calculationModel.isEnd ? "Вернуть на доработку" : "Завершить", + }, ]; const items: MenuProps["items"] = menu.map((el, index) => { diff --git a/ui/src/index.tsx b/ui/src/index.tsx index a8d3fea..6b4baea 100644 --- a/ui/src/index.tsx +++ b/ui/src/index.tsx @@ -7,6 +7,9 @@ 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 { FormBuilderComponents } from "./core/ui/form_builder/forms/form_builder_components"; +import { FormBuildTest } from "./core/ui/form_builder/test"; configure({ enforceActions: "never", @@ -19,8 +22,9 @@ export const themeStore = new ThemeStore(); root.render( <> - + {/* - + */} + );