This commit is contained in:
IDONTSUDO 2023-11-20 00:48:40 +03:00
parent d70253d6a6
commit fa645dde92
51 changed files with 657 additions and 281 deletions

View file

@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-this-alias */
export const ArrayExtensions = () => {
if ([].equals === undefined) {
// eslint-disable-next-line no-extend-native
@ -23,11 +24,11 @@ export const ArrayExtensions = () => {
if ([].lastElement === undefined) {
// eslint-disable-next-line no-extend-native
Array.prototype.lastElement = function () {
let instanceCheck = this;
const instanceCheck = this;
if (instanceCheck === undefined) {
return undefined;
} else {
let instance = instanceCheck as [];
const instance = instanceCheck as [];
return instance[instance.length - 1];
}
};
@ -38,4 +39,10 @@ export const ArrayExtensions = () => {
return this.length === 0;
};
}
if ([].isNotEmpty === undefined) {
// eslint-disable-next-line no-extend-native
Array.prototype.isNotEmpty = function () {
return this.length !== 0;
};
}
};

View file

@ -7,6 +7,7 @@ declare global {
equals(array: Array<T>, strict: boolean): boolean;
lastElement(): T | undefined;
isEmpty(): boolean;
isNotEmpty():boolean;
}
interface String {
isEmpty(): boolean;

View file

@ -0,0 +1,7 @@
export interface ActivePipeline {
pipelineIsRunning: boolean;
projectUUID?: string | null;
lastProcessCompleteCount: number | null;
error: any;
}

View file

@ -23,15 +23,27 @@ import {
CreateTriggerScreenPath,
TriggerScreen,
} from "../../features/create_trigger/presentation/create_trigger_screen";
import { CreateProcessScreen, CreateProcessScreenPath } from "../../features/create_process/presentation/create_process_screen";
import {
CreateProcessScreen,
CreateProcessScreenPath,
} from "../../features/create_process/presentation/create_process_screen";
import { ProjectRepository } from "../../features/all_projects/data/project_repository";
import {
CreateProjectInstancePath,
CreateProjectInstanceScreen,
} from "../../features/create_project_instance/create_project_instance";
const idURL = ":id";
export const router = createBrowserRouter([
{
path: AllProjectScreenPath,
loader: new ProjectRepository().loader,
element: <AllProjectScreen />,
},
{
path: PipelineInstanceScreenPath,
path: PipelineInstanceScreenPath + idURL,
element: <PipelineInstanceScreen />,
},
{
@ -54,4 +66,8 @@ export const router = createBrowserRouter([
path: CreateProcessScreenPath,
element: <CreateProcessScreen />,
},
{
path: CreateProjectInstancePath + idURL,
element: <CreateProjectInstanceScreen />,
},
]);

View file

@ -0,0 +1,22 @@
// TODO(IDONTSUDO): нужно переписать все запросы под BaseStore
import { Result } from "../helper/result";
export class BaseStore {
isLoading = false;
isError = false;
async loadingHelper<T>(callBack: Promise<Result<any, T>>) {
this.isLoading = true;
const result = await callBack;
if (result.isFailure()) {
this.isError = true;
this.isLoading = false;
return result.forward();
}
this.isLoading = false;
return result;
}
}

View file

@ -8,7 +8,7 @@ import { useNavigate } from "react-router-dom";
const { Title } = Typography;
export interface IHeader {
largeText: string;
largeText?: string;
minText?: string;
path?: string;
needBackButton?: undefined | any;
@ -25,7 +25,7 @@ export const Header: React.FunctionComponent<IHeader> = (props: IHeader) => {
marginTop: "20px",
marginRight: "20px",
display: "contents",
}}
}}
>
{needBackButton ? (
<>

View file

@ -1,8 +1,27 @@
import { HttpMethod, HttpRepository } from "../../../core/repository/http_repository";
import { redirect } from "react-router-dom";
import { ActivePipeline } from "../../../core/model/active_pipiline";
import {
HttpMethod,
HttpRepository,
} from "../../../core/repository/http_repository";
import { PipelineInstanceScreenPath } from "../../pipeline_instance_main_screen/pipeline_instance_screen";
import { IProjectModel } from "../model/project_model";
export class ProjectRepository extends HttpRepository {
async getAllProject() {
return this.jsonRequest<IProjectModel[]>(HttpMethod.GET,'/project')
return this.jsonRequest<IProjectModel[]>(HttpMethod.GET, "/project");
}
async getActivePipeline() {
return this.jsonRequest<ActivePipeline>(HttpMethod.GET, "/realtime");
}
loader = async () => {
const result = await this.getActivePipeline();
// if (result.isSuccess() && result.value.projectUUID !== null) {
// return redirect(PipelineInstanceScreenPath + result.value.projectUUID);
// }
return null;
};
}

View file

@ -6,7 +6,7 @@ import { observer } from "mobx-react-lite";
import { SelectProjectScreenPath } from "../../select_project/presentation/select_project";
export const AllProjectScreenPath = "/";
export const AllProjectScreen: React.FunctionComponent = observer(() => {
const [allProjectStore] = React.useState(
() => new AllProjectStore(new ProjectRepository())
@ -15,7 +15,6 @@ export const AllProjectScreen: React.FunctionComponent = observer(() => {
return (
<>
<LoadPage
largeText={"Projects"}
needBackButton={false}
minText="create project?"

View file

@ -1,42 +1,24 @@
import makeAutoObservable from "mobx-store-inheritance";
import { ProjectRepository } from "../data/project_repository";
import { IProjectModel } from "../model/project_model";
import { Result } from "../../../core/helper/result";
import { BaseStore } from "../../../core/store/base_store";
// TODO(IDONTSUDO): нужно переписать все сторы под BaseStore
class BaseStore {
isLoading = false;
isError = false;
async loadingHelper<T>(callBack: Promise<Result<any, T>>) {
this.isLoading = true;
const result = await callBack;
if (result.isFailure()) {
this.isError = true;
this.isLoading = false;
return result.forward();
}
this.isLoading = false;
return result;
}
}
export class AllProjectStore extends BaseStore {
projectsModels?: IProjectModel[];
repository: ProjectRepository;
redirect = false;
constructor(repository: ProjectRepository) {
super();
this.repository = repository;
this.getProjects();
makeAutoObservable(this);
}
async getProjects() {
const result = await this.loadingHelper(this.repository.getAllProject());
if (result.isSuccess()) {
this.projectsModels = result.value;
}
}
}
}

View file

@ -1,9 +1,10 @@
import { makeAutoObservable } from "mobx";
import makeAutoObservable from "mobx-store-inheritance";
import { CreatePipelineRepository } from "../data/create_pipeline_repository";
import { ITriggerModel } from "../../../core/model/trigger_model";
import { IProcess } from "../../create_process/model/process_model";
import { message } from "antd";
import { BaseStore } from "../../../core/store/base_store";
enum Type {
PROCESS,
TRIGGER,
@ -15,20 +16,23 @@ export interface UnionView {
uuid?: string;
}
export class CreatePipelineStore {
export class CreatePipelineStore extends BaseStore {
repository: CreatePipelineRepository;
triggersModels: ITriggerModel[] = [];
processModels: IProcess[] = [];
pipelineViewModels: UnionView[] = [];
isLoading = false;
isError = false;
constructor(repository: CreatePipelineRepository) {
super();
this.repository = repository;
makeAutoObservable(this);
this.init();
}
private init() {
this.loadTriggers();
this.loadProcess();
}
filterPipelineViewModel(index: number): void {
this.pipelineViewModels = this.pipelineViewModels.filter(
(_el, i) => i !== index

View file

@ -1,19 +1,20 @@
import { makeAutoObservable } from "mobx";
import makeAutoObservable from "mobx-store-inheritance";
import {
CreateProjectRepository,
PipelineModel,
} from "./create_project_repository";
import { message } from "antd";
import { BaseStore } from "../../core/store/base_store";
class CreateProjectStore {
class CreateProjectStore extends BaseStore {
repository: CreateProjectRepository;
isLoading = false;
isError = false;
pipelineModels?: PipelineModel[];
newProjectDescription: string = "";
newProjectViews: PipelineModel[] = [];
constructor(repository: CreateProjectRepository) {
super();
this.repository = repository;
makeAutoObservable(this);
this.loadPipelines();
@ -74,4 +75,3 @@ class CreateProjectStore {
export const createProjectStore = new CreateProjectStore(
new CreateProjectRepository()
);

View file

@ -0,0 +1,27 @@
import * as React from "react";
import { CreateProjectInstanceStore } from "./create_project_instance_store";
import { CreateProjectInstanceRepository } from "./create_project_instance_repository";
import { observer } from "mobx-react-lite";
import { Upload, Button } from "antd";
import { useParams } from "react-router-dom";
export const CreateProjectInstancePath = "/create/project/instance/";
export const CreateProjectInstanceScreen = observer(() => {
const [createProjectInstanceStore] = React.useState(
() => new CreateProjectInstanceStore(new CreateProjectInstanceRepository())
);
const id = useParams().id;
createProjectInstanceStore.getProjectById(id as string)
return (
<>
<Upload
onChange={(e) => {
console.log(e);
}}
>
<Button>Upload root entity</Button>
</Upload>
</>
);
});

View file

@ -0,0 +1,10 @@
import {
HttpMethod,
HttpRepository,
} from "../../core/repository/http_repository";
export class CreateProjectInstanceRepository extends HttpRepository {
async getProjectInstance(id: string) {
return await this.jsonRequest(HttpMethod.GET, "");
}
}

View file

@ -0,0 +1,18 @@
import makeAutoObservable from "mobx-store-inheritance";
import { BaseStore } from "../../core/store/base_store";
import { CreateProjectInstanceRepository } from "./create_project_instance_repository";
export class CreateProjectInstanceStore extends BaseStore {
constructor(repository: CreateProjectInstanceRepository) {
super();
this.repository = repository;
makeAutoObservable(this);
}
repository: CreateProjectInstanceRepository;
async getProjectById(id: string) {
const result = await this.loadingHelper(this.repository.getProjectInstance(id))
if(result.isSuccess()){
}
}
}

View file

@ -1,17 +1,18 @@
import { makeAutoObservable } from "mobx";
import makeAutoObservable from "mobx-store-inheritance";
import { v4 as uuidv4 } from "uuid";
import { TriggerType } from "../../../core/model/trigger_model";
import { TriggerRepository } from "../data/trigger_repository";
import { TriggerViewModel } from "../model/trigger_form_view_model";
import { BaseStore } from "../../../core/store/base_store";
class TriggerStore {
class TriggerStore extends BaseStore {
constructor(repository: TriggerRepository) {
super();
this.triggerType = TriggerType.FILE;
this.repository = repository;
makeAutoObservable(this);
}
isLoading = false;
triggerDescription: string = "";
triggerType: TriggerType;
codeTriggerValue = "";
@ -71,7 +72,7 @@ class TriggerStore {
}
}
async saveResult(): Promise<void> {
this.isLoading = true
this.isLoading = true;
await this.repository.save({
type: this.getTriggerDescription(),
description: this.triggerDescription,
@ -79,7 +80,7 @@ class TriggerStore {
return el.value;
}),
});
this.isLoading = false
this.isLoading = false;
}
}

View file

@ -0,0 +1 @@
export class PipelineInstanceRepository {}

View file

@ -1,14 +1,19 @@
import * as React from "react";
import { Button } from "antd";
import { LoadPage } from "../../core/ui/pages/load_page";
import { PipelineInstanceStore } from "./pipeline_instance_store";
export const PipelineInstanceScreenPath = '/pipeline_instance/:id'
export const PipelineInstanceScreenPath = "/pipeline_instance/";
export const PipelineInstanceScreen: React.FunctionComponent = () => {
const [pipelineInstanceStore] = React.useState(
() => new PipelineInstanceStore()
);
return (
<>
<Button></Button>
</>
<LoadPage
needBackButton={false}
isError={pipelineInstanceStore.isError}
isLoading={pipelineInstanceStore.isLoading}
children={<div></div>}
/>
);
};

View file

@ -0,0 +1,9 @@
import makeAutoObservable from "mobx-store-inheritance";
import { BaseStore } from "../../core/store/base_store";
export class PipelineInstanceStore extends BaseStore {
constructor() {
super();
makeAutoObservable(this);
}
}

View file

@ -1,6 +1,7 @@
import { DatabaseModel } from "../../../core/model/database_model";
import { IProcess } from "../../create_process/model/process_model";
export interface IProjectModel {
export interface IProjectModel extends DatabaseModel {
pipelines: [IProcess];
rootDir: string;
description: string;

View file

@ -1,17 +1,19 @@
import * as React from "react";
import { observer } from "mobx-react-lite";
import { LoadPage } from "../../../core/ui/pages/load_page";
import { CreateProjectScreenPath } from "../../create_project/create_project_screen";
import { SelectProjectStore } from "./select_project_store";
import { SelectProjectRepository } from "../data/select_project_repository";
import { useNavigate } from "react-router-dom";
import { CreateProjectInstancePath } from "../../create_project_instance/create_project_instance";
import { Button } from "antd";
export const SelectProjectScreenPath = "/select_project";
export const SelectProjectScreen: React.FunctionComponent = observer(() => {
const [selectProjectStore] = React.useState(
() => new SelectProjectStore(new SelectProjectRepository())
);
);
const navigate = useNavigate();
return (
<>
@ -25,7 +27,13 @@ export const SelectProjectScreen: React.FunctionComponent = observer(() => {
return (
<>
<div>{el.description}</div>
<div>+(РЕАЛИЗУЙ ТУТ ПЛЮСИК БЛЯТЬ ИЛИ КНОПКУ)</div>
<div>
<Button
onClick={() => navigate(CreateProjectInstancePath + el._id)}
>
create instance
</Button>
</div>
</>
);
})}

View file

@ -1,15 +1,16 @@
import { makeAutoObservable } from "mobx";
import makeAutoObservable from "mobx-store-inheritance";
import { SelectProjectRepository } from "../data/select_project_repository";
import { IProjectModel } from "../model/project_model";
import { BaseStore } from "../../../core/store/base_store";
export class SelectProjectStore {
export class SelectProjectStore extends BaseStore {
repository: SelectProjectRepository;
isLoading = false;
isError = false;
page = 1;
projects: IProjectModel[] = [];
constructor(repository: SelectProjectRepository) {
super()
this.repository = repository;
makeAutoObservable(this);
this.getPipelines();

View file

@ -10,7 +10,7 @@ export interface ISocketListerProps {
export const SocketLister = observer((props: ISocketListerProps) => {
return (
<>
{socketListerStore.socketDisconnect ? (
{socketListerStore.socketHasDisconnect ? (
<ReloadIcon
onClick={() => {
socketListerStore.reconnect();

View file

@ -3,7 +3,7 @@ import { SocketRepository } from "../../core/repository/socket_repository";
class SocketListerStore {
repository: SocketRepository;
socketDisconnect = false;
socketHasDisconnect = false;
constructor(repository: SocketRepository) {
this.repository = repository;
@ -13,7 +13,7 @@ class SocketListerStore {
async reconnect() {
await this.repository.connect()
this.socketDisconnect = false
this.socketHasDisconnect = false
}
}