From 23c39cbae2b2e8ad69462c5fd22671aa2157b977 Mon Sep 17 00:00:00 2001 From: IDONTSUDO Date: Sun, 20 Oct 2024 15:58:14 +0300 Subject: [PATCH] skill import --- ui/src/features/skills/skills_screen.tsx | 37 ++++++++++++++++++++++-- ui/src/features/skills/skills_store.ts | 21 +++++++++++++- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/ui/src/features/skills/skills_screen.tsx b/ui/src/features/skills/skills_screen.tsx index bd962b0..894fc56 100644 --- a/ui/src/features/skills/skills_screen.tsx +++ b/ui/src/features/skills/skills_screen.tsx @@ -1,21 +1,32 @@ import { observer } from "mobx-react-lite"; import { DrawersSkills, SkillsStore } from "./skills_store"; -import { Drawer, Modal } from "antd"; +import { Drawer, Modal, message } from "antd"; import { CoreInput } from "../../core/ui/input/input"; import { CoreText, CoreTextType } from "../../core/ui/text/text"; import { TopicViewModel } from "../topics/topic_view_model"; -import { BtAction, BtActionViewModel } from "../../core/model/skill_model"; +import { BtAction, BtActionViewModel, ISkill, SkillModel } from "../../core/model/skill_model"; import { btDependencyFormBuilder } from "../behavior_tree_builder/presentation/ui/forms/forms"; import { CoreButton } from "../../core/ui/button/button"; import { CoreSelect } from "../../core/ui/select/select"; import { useStore } from "../../core/helper/use_store"; import { FormBuilder } from "../../core/ui/form_builder/form_builder"; import { ButtonV2 } from "../../core/ui/button/button_v2"; +import { Result } from "../../core/helper/result"; +import { plainToInstance } from "class-transformer"; + +export const isValidJson = (json: any): Result => { + try { + return Result.ok(JSON.parse(json)); + } catch { + return Result.error(`is not json type: ${json}`); + } +}; export const SkillsScreenPath = "/skills"; export const SkillsScreen = observer(() => { const store = useStore(SkillsStore); + return ( <>
@@ -24,6 +35,11 @@ export const SkillsScreen = observer(() => { text="new skill" onClick={() => store.editDrawer(DrawersSkills.newSkill, true)} /> + store.editDrawer(DrawersSkills.importSkill, true)} + /> {store.skills?.map((el) => (
{
))}
- + store.editDrawer(DrawersSkills.importSkill, false)} + open={store.drawers.find((el) => el.name === DrawersSkills.importSkill)?.status} + > +
+ store.importSkill(text)} + /> +
+
{ isModalOpen: boolean = false; @@ -25,6 +28,22 @@ export class SkillsStore extends UiDrawerFormState { super(DrawersSkills); makeAutoObservable(this); } + importSkill = (text: string) => + isValidJson(text.replace(/[^\x00-\x7F]/g, "")).fold( + async (model) => + (await (await plainToInstance(SkillModel, model)).valid()).fold( + async (skillModel) => { + skillModel._id = undefined; + await this.messageHttp(this.skillsHttpRepository.createNewSkill(skillModel), { + successMessage: "Навык импортирован", + }); + await this.init(); + this.editDrawer(DrawersSkills.importSkill, false); + }, + async (error) => message.error(error) + ), + async (error) => message.error(error) + ); handleFormBuilderModalCancel = () => (this.formBuilderModal = false); init = async (navigate?: NavigateFunction | undefined) => { this.mapOk("skills", this.skillsHttpRepository.getAllSkills());