Добавлено применение стилей приоритета по параметрам из настроек доски или списка задач
This commit is contained in:
parent
00f7e6eea3
commit
ed451557f2
6 changed files with 112 additions and 0 deletions
|
|
@ -0,0 +1,102 @@
|
||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
|
import { RedmineTypes } from '../models/redmine-types';
|
||||||
|
import { IssueEnhancerInterface } from './issue-enhancer-interface';
|
||||||
|
|
||||||
|
export type StyleRule = {
|
||||||
|
default?: boolean;
|
||||||
|
priorityName?: string;
|
||||||
|
style?: string;
|
||||||
|
className?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const defaultRule: StyleRule = {
|
||||||
|
default: true,
|
||||||
|
style: 'background-color: gray; color: white;',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const defaultKey = 'priorityStyle';
|
||||||
|
|
||||||
|
export function ValidateStyleRule(rule: StyleRule): boolean {
|
||||||
|
return (
|
||||||
|
// check default prop
|
||||||
|
(typeof rule.default === 'boolean' ||
|
||||||
|
typeof rule.default === 'undefined') &&
|
||||||
|
// check priority name prop
|
||||||
|
(rule.default ||
|
||||||
|
(!rule.default &&
|
||||||
|
typeof rule.priorityName === 'string' &&
|
||||||
|
rule.priorityName.length > 0)) &&
|
||||||
|
// check style or className props
|
||||||
|
((typeof rule.style === 'string' && rule.style.length > 0) ||
|
||||||
|
(typeof rule.className === 'string' && rule.className.length > 0))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function HasDefaultRule(rules: StyleRule[]): boolean {
|
||||||
|
const hasDefaultRule = rules.find((rule) => rule.default);
|
||||||
|
return Boolean(hasDefaultRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class PriorityStylesEnhancer implements IssueEnhancerInterface {
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
private rules: StyleRule[];
|
||||||
|
|
||||||
|
private targetKey: string;
|
||||||
|
|
||||||
|
constructor(rules?: StyleRule[], targetKey?: string) {
|
||||||
|
let validatedRules: StyleRule[] = [];
|
||||||
|
if (rules && rules.length > 0) {
|
||||||
|
validatedRules = rules.filter(ValidateStyleRule);
|
||||||
|
}
|
||||||
|
if (!HasDefaultRule(validatedRules)) {
|
||||||
|
validatedRules.push(defaultRule);
|
||||||
|
}
|
||||||
|
this.rules = validatedRules;
|
||||||
|
|
||||||
|
this.targetKey =
|
||||||
|
typeof targetKey === 'string' && targetKey.length > 0
|
||||||
|
? targetKey
|
||||||
|
: defaultKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
async enhance(
|
||||||
|
issue: RedmineTypes.ExtendedIssue,
|
||||||
|
): Promise<RedmineTypes.ExtendedIssue> {
|
||||||
|
const priorityName = issue.priority.name;
|
||||||
|
const priorityRule = this.findPriorityRule(priorityName);
|
||||||
|
issue[this.targetKey] = priorityRule.style || priorityRule.className;
|
||||||
|
return issue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private findPriorityRule(priority: string): StyleRule {
|
||||||
|
return (this.rules.find((r) => r.priorityName === priority) ||
|
||||||
|
this.rules.find((r) => r.default)) as StyleRule;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export type PrioritiesStyleParams = {
|
||||||
|
rules: StyleRule[];
|
||||||
|
targetKey: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ConfigWithPriorityStyles = {
|
||||||
|
priorities?: PrioritiesStyleParams;
|
||||||
|
[key: string]: any;
|
||||||
|
};
|
||||||
|
|
||||||
|
export function CreatePriorityStylesEnhancer(
|
||||||
|
cfg: ConfigWithPriorityStyles,
|
||||||
|
): PriorityStylesEnhancer {
|
||||||
|
let params: PrioritiesStyleParams;
|
||||||
|
if (cfg.priorities && cfg.priorities.rules && cfg.priorities.targetKey) {
|
||||||
|
params = cfg.priorities;
|
||||||
|
} else {
|
||||||
|
params = {
|
||||||
|
rules: [defaultRule],
|
||||||
|
targetKey: defaultKey,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return new PriorityStylesEnhancer(params.rules, params.targetKey);
|
||||||
|
}
|
||||||
|
|
@ -13,6 +13,7 @@ import { TreeIssuesStore } from '@app/event-emitter/utils/tree-issues-store';
|
||||||
import { Injectable, Logger } from '@nestjs/common';
|
import { Injectable, Logger } from '@nestjs/common';
|
||||||
import nano from 'nano';
|
import nano from 'nano';
|
||||||
import { WidgetInterface } from '../widget-interface';
|
import { WidgetInterface } from '../widget-interface';
|
||||||
|
import * as PriorityStylesEnhancerNs from '@app/event-emitter/issue-enhancers/priority-styles-enhancer';
|
||||||
|
|
||||||
export namespace ListIssuesByFieldsWidgetNs {
|
export namespace ListIssuesByFieldsWidgetNs {
|
||||||
export type Params = {
|
export type Params = {
|
||||||
|
|
@ -66,6 +67,7 @@ export class ListIssuesByFieldsWidgetService
|
||||||
this.timePassedHighlightEnhancer,
|
this.timePassedHighlightEnhancer,
|
||||||
this.issueUrlEnhancer,
|
this.issueUrlEnhancer,
|
||||||
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
||||||
|
PriorityStylesEnhancerNs.CreatePriorityStylesEnhancer(widgetParams),
|
||||||
]);
|
]);
|
||||||
const grouped = store.groupByStatusWithExtra((issue) => {
|
const grouped = store.groupByStatusWithExtra((issue) => {
|
||||||
return this.getGroupFromIssue(issue, widgetParams);
|
return this.getGroupFromIssue(issue, widgetParams);
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import { TreeIssuesStore } from '@app/event-emitter/utils/tree-issues-store';
|
||||||
import { Injectable, Logger } from '@nestjs/common';
|
import { Injectable, Logger } from '@nestjs/common';
|
||||||
import nano from 'nano';
|
import nano from 'nano';
|
||||||
import { WidgetInterface } from '../widget-interface';
|
import { WidgetInterface } from '../widget-interface';
|
||||||
|
import * as PriorityStylesEnhancerNs from '@app/event-emitter/issue-enhancers/priority-styles-enhancer';
|
||||||
|
|
||||||
export namespace ListIssuesByUsersLikeJiraWidgetNs {
|
export namespace ListIssuesByUsersLikeJiraWidgetNs {
|
||||||
export namespace Models {
|
export namespace Models {
|
||||||
|
|
@ -61,6 +62,7 @@ export class ListIssuesByUsersLikeJiraWidgetService
|
||||||
this.timePassedHighlightEnhancer,
|
this.timePassedHighlightEnhancer,
|
||||||
this.issueUrlEnhancer,
|
this.issueUrlEnhancer,
|
||||||
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
||||||
|
PriorityStylesEnhancerNs.CreatePriorityStylesEnhancer(widgetParams),
|
||||||
]);
|
]);
|
||||||
const grouped = store.groupByStatusWithExtraToMultipleStories((issue) => {
|
const grouped = store.groupByStatusWithExtraToMultipleStories((issue) => {
|
||||||
const users = [] as string[];
|
const users = [] as string[];
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import { TreeIssuesStore } from '@app/event-emitter/utils/tree-issues-store';
|
||||||
import { Injectable, Logger } from '@nestjs/common';
|
import { Injectable, Logger } from '@nestjs/common';
|
||||||
import nano from 'nano';
|
import nano from 'nano';
|
||||||
import { WidgetInterface } from '../widget-interface';
|
import { WidgetInterface } from '../widget-interface';
|
||||||
|
import * as PriorityStylesEnhancerNs from '@app/event-emitter/issue-enhancers/priority-styles-enhancer';
|
||||||
|
|
||||||
export namespace ListIssuesByUsersWidgetNs {
|
export namespace ListIssuesByUsersWidgetNs {
|
||||||
export namespace Models {
|
export namespace Models {
|
||||||
|
|
@ -73,6 +74,7 @@ export class ListIssuesByUsersWidgetService
|
||||||
this.timePassedHighlightEnhancer,
|
this.timePassedHighlightEnhancer,
|
||||||
this.issueUrlEnhancer,
|
this.issueUrlEnhancer,
|
||||||
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
||||||
|
PriorityStylesEnhancerNs.CreatePriorityStylesEnhancer(widgetParams),
|
||||||
]);
|
]);
|
||||||
const grouped = store.groupByStatusWithExtra((issue) => {
|
const grouped = store.groupByStatusWithExtra((issue) => {
|
||||||
const res = this.getUserValueByKey(issue, widgetParams.userKey);
|
const res = this.getUserValueByKey(issue, widgetParams.userKey);
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import {
|
||||||
} from '@app/event-emitter/utils/tree-issues-store';
|
} from '@app/event-emitter/utils/tree-issues-store';
|
||||||
import { Injectable } from '@nestjs/common';
|
import { Injectable } from '@nestjs/common';
|
||||||
import { WidgetInterface } from '../widget-interface';
|
import { WidgetInterface } from '../widget-interface';
|
||||||
|
import * as PriorityStylesEnhancerNs from '@app/event-emitter/issue-enhancers/priority-styles-enhancer';
|
||||||
|
|
||||||
export namespace RootIssueSubTreesWidgetNs {
|
export namespace RootIssueSubTreesWidgetNs {
|
||||||
export namespace Models {
|
export namespace Models {
|
||||||
|
|
@ -66,6 +67,7 @@ export class RootIssueSubTreesWidgetService
|
||||||
this.timePassedHighlightEnhancer,
|
this.timePassedHighlightEnhancer,
|
||||||
this.issueUrlEnhancer,
|
this.issueUrlEnhancer,
|
||||||
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
||||||
|
PriorityStylesEnhancerNs.CreatePriorityStylesEnhancer(widgetParams),
|
||||||
]);
|
]);
|
||||||
let stories: TreeIssuesStoreNs.Models.GetFlatStories.Result;
|
let stories: TreeIssuesStoreNs.Models.GetFlatStories.Result;
|
||||||
if (widgetParams.parentsAsGroups) {
|
if (widgetParams.parentsAsGroups) {
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import { GetValueFromObjectByKey } from '@app/event-emitter/utils/get-value-from
|
||||||
import { TreeIssuesStore } from '@app/event-emitter/utils/tree-issues-store';
|
import { TreeIssuesStore } from '@app/event-emitter/utils/tree-issues-store';
|
||||||
import { Injectable, Logger } from '@nestjs/common';
|
import { Injectable, Logger } from '@nestjs/common';
|
||||||
import nano from 'nano';
|
import nano from 'nano';
|
||||||
|
import * as PriorityStylesEnhancerNs from '@app/event-emitter/issue-enhancers/priority-styles-enhancer';
|
||||||
|
|
||||||
export namespace IssuesByTagsWidgetNs {
|
export namespace IssuesByTagsWidgetNs {
|
||||||
export type Params = {
|
export type Params = {
|
||||||
|
|
@ -59,6 +60,7 @@ export class IssuesByTagsWidgetService
|
||||||
this.timePassedHighlightEnhancer,
|
this.timePassedHighlightEnhancer,
|
||||||
this.issueUrlEnhancer,
|
this.issueUrlEnhancer,
|
||||||
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
||||||
|
PriorityStylesEnhancerNs.CreatePriorityStylesEnhancer(widgetParams),
|
||||||
]);
|
]);
|
||||||
const grouped = store.groupByStatusWithExtraToMultipleStories((issue) => {
|
const grouped = store.groupByStatusWithExtraToMultipleStories((issue) => {
|
||||||
if (!issue || !widgetParams.tags || !widgetParams.tags.tagsKeyName) {
|
if (!issue || !widgetParams.tags || !widgetParams.tags.tagsKeyName) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue