Заготовка для дашбордов
This commit is contained in:
parent
ce413b8cad
commit
85f4483845
2 changed files with 155 additions and 0 deletions
|
|
@ -18,6 +18,7 @@ import { IssuesService } from './issues/issues.service';
|
||||||
import { IssuesController } from './issues/issues.controller';
|
import { IssuesController } from './issues/issues.controller';
|
||||||
import { TimestampEnhancer } from './issue-enhancers/timestamps-enhancer';
|
import { TimestampEnhancer } from './issue-enhancers/timestamps-enhancer';
|
||||||
import { EnhancerService } from './issue-enhancers/enhancer.service';
|
import { EnhancerService } from './issue-enhancers/enhancer.service';
|
||||||
|
import { ProjectDashboardService } from './project-dashboard/project-dashboard.service';
|
||||||
import { RootIssueSubTreesWidgetService } from './project-dashboard/widgets/root-issue-subtrees.widget.service';
|
import { RootIssueSubTreesWidgetService } from './project-dashboard/widgets/root-issue-subtrees.widget.service';
|
||||||
|
|
||||||
@Module({})
|
@Module({})
|
||||||
|
|
@ -41,6 +42,7 @@ export class EventEmitterModule implements OnModuleInit {
|
||||||
IssuesService,
|
IssuesService,
|
||||||
TimestampEnhancer,
|
TimestampEnhancer,
|
||||||
EnhancerService,
|
EnhancerService,
|
||||||
|
ProjectDashboardService,
|
||||||
RootIssueSubTreesWidgetService,
|
RootIssueSubTreesWidgetService,
|
||||||
],
|
],
|
||||||
exports: [
|
exports: [
|
||||||
|
|
@ -56,6 +58,7 @@ export class EventEmitterModule implements OnModuleInit {
|
||||||
IssuesService,
|
IssuesService,
|
||||||
TimestampEnhancer,
|
TimestampEnhancer,
|
||||||
EnhancerService,
|
EnhancerService,
|
||||||
|
ProjectDashboardService,
|
||||||
RootIssueSubTreesWidgetService,
|
RootIssueSubTreesWidgetService,
|
||||||
],
|
],
|
||||||
controllers: [MainController, UsersController, IssuesController],
|
controllers: [MainController, UsersController, IssuesController],
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,152 @@
|
||||||
|
/* eslint-disable @typescript-eslint/no-namespace */
|
||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
|
import { RedmineTypes } from '../models/redmine-types';
|
||||||
|
|
||||||
|
export namespace ProjectDashboard {
|
||||||
|
export namespace Models {
|
||||||
|
export type Params = {
|
||||||
|
projectName: string;
|
||||||
|
workers: Worker[];
|
||||||
|
filter: FilterDefination[];
|
||||||
|
statuses: Status[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Worker = {
|
||||||
|
id?: number;
|
||||||
|
firstname?: string;
|
||||||
|
lastname?: string;
|
||||||
|
name?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export enum FilterTypes {
|
||||||
|
TREE = 'TREE',
|
||||||
|
LIST = 'LIST',
|
||||||
|
DYNAMIC_LIST = 'DYNAMIC_LIST',
|
||||||
|
VERSION = 'VERSION',
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace FilterParams {
|
||||||
|
export type Tree = {
|
||||||
|
rootIssueId: number;
|
||||||
|
subtrees: SubTree[];
|
||||||
|
showOthers: boolean;
|
||||||
|
};
|
||||||
|
export type SubTree = {
|
||||||
|
title: string;
|
||||||
|
issueId: number;
|
||||||
|
};
|
||||||
|
export type List = {
|
||||||
|
issueIds: number[];
|
||||||
|
};
|
||||||
|
export type Version = {
|
||||||
|
version: string;
|
||||||
|
};
|
||||||
|
export type DynamicList = {
|
||||||
|
selector: Record<string, any>;
|
||||||
|
};
|
||||||
|
export type AnyFilterParams = Tree | List | DynamicList | Version;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type FilterParams = Record<string, any>;
|
||||||
|
|
||||||
|
export namespace FilterResults {
|
||||||
|
export type Tree = List;
|
||||||
|
export type List = { status: string; issues: RedmineTypes.Issue[] }[];
|
||||||
|
export type DynamicList = List;
|
||||||
|
export type Version = List;
|
||||||
|
export type AnyFilterResults = List | Tree | DynamicList | Version;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type FilterResult = Record<string, any>[];
|
||||||
|
|
||||||
|
export type AnalyticFunction = {
|
||||||
|
functionName: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type FilterDefination = {
|
||||||
|
type: FilterTypes;
|
||||||
|
title: string;
|
||||||
|
params: FilterParams.AnyFilterParams;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type FilterWithResults = {
|
||||||
|
params: FilterDefination;
|
||||||
|
results: FilterResults.AnyFilterResults;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Status = {
|
||||||
|
name: string;
|
||||||
|
closed: boolean;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function CheckWorker(worker: Models.Worker): boolean {
|
||||||
|
return Boolean(
|
||||||
|
(typeof worker.id === 'number' && worker.id >= 0) ||
|
||||||
|
(worker.firstname && worker.lastname) ||
|
||||||
|
worker.name,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SingleProject {
|
||||||
|
// TODO: code for SingleProject
|
||||||
|
constructor(private params: Models.Params) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace Widgets {
|
||||||
|
// Чё будет делать виджет?
|
||||||
|
// * рендер - из параметров будет создавать данные с какими-либо расчётами
|
||||||
|
|
||||||
|
export interface Widget {
|
||||||
|
render(
|
||||||
|
filterParams: Models.FilterParams,
|
||||||
|
dashboardParams: Models.Params,
|
||||||
|
): Models.FilterResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class List implements Widget {
|
||||||
|
render(
|
||||||
|
filterParams: Models.FilterParams,
|
||||||
|
dashboardParams: Models.Params,
|
||||||
|
): Models.FilterResult {
|
||||||
|
throw new Error('Method not implemented.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class DynamicList implements Widget {
|
||||||
|
render(
|
||||||
|
filterParams: Models.FilterParams,
|
||||||
|
dashboardParams: Models.Params,
|
||||||
|
): Models.FilterResult {
|
||||||
|
throw new Error('Method not implemented.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Tree implements Widget {
|
||||||
|
render(
|
||||||
|
filterParams: Models.FilterParams,
|
||||||
|
dashboardParams: Models.Params,
|
||||||
|
): Models.FilterResult {
|
||||||
|
throw new Error('Method not implemented.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Version implements Widget {
|
||||||
|
render(
|
||||||
|
filterParams: Models.FilterParams,
|
||||||
|
dashboardParams: Models.Params,
|
||||||
|
): Models.FilterResult {
|
||||||
|
throw new Error('Method not implemented.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class ProjectDashboardService {
|
||||||
|
constructor() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue