Добавлено применение стилей приоритета по параметрам из настроек доски или списка задач
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 nano from 'nano';
|
||||
import { WidgetInterface } from '../widget-interface';
|
||||
import * as PriorityStylesEnhancerNs from '@app/event-emitter/issue-enhancers/priority-styles-enhancer';
|
||||
|
||||
export namespace ListIssuesByFieldsWidgetNs {
|
||||
export type Params = {
|
||||
|
|
@ -66,6 +67,7 @@ export class ListIssuesByFieldsWidgetService
|
|||
this.timePassedHighlightEnhancer,
|
||||
this.issueUrlEnhancer,
|
||||
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
||||
PriorityStylesEnhancerNs.CreatePriorityStylesEnhancer(widgetParams),
|
||||
]);
|
||||
const grouped = store.groupByStatusWithExtra((issue) => {
|
||||
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 nano from 'nano';
|
||||
import { WidgetInterface } from '../widget-interface';
|
||||
import * as PriorityStylesEnhancerNs from '@app/event-emitter/issue-enhancers/priority-styles-enhancer';
|
||||
|
||||
export namespace ListIssuesByUsersLikeJiraWidgetNs {
|
||||
export namespace Models {
|
||||
|
|
@ -61,6 +62,7 @@ export class ListIssuesByUsersLikeJiraWidgetService
|
|||
this.timePassedHighlightEnhancer,
|
||||
this.issueUrlEnhancer,
|
||||
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
||||
PriorityStylesEnhancerNs.CreatePriorityStylesEnhancer(widgetParams),
|
||||
]);
|
||||
const grouped = store.groupByStatusWithExtraToMultipleStories((issue) => {
|
||||
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 nano from 'nano';
|
||||
import { WidgetInterface } from '../widget-interface';
|
||||
import * as PriorityStylesEnhancerNs from '@app/event-emitter/issue-enhancers/priority-styles-enhancer';
|
||||
|
||||
export namespace ListIssuesByUsersWidgetNs {
|
||||
export namespace Models {
|
||||
|
|
@ -73,6 +74,7 @@ export class ListIssuesByUsersWidgetService
|
|||
this.timePassedHighlightEnhancer,
|
||||
this.issueUrlEnhancer,
|
||||
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
||||
PriorityStylesEnhancerNs.CreatePriorityStylesEnhancer(widgetParams),
|
||||
]);
|
||||
const grouped = store.groupByStatusWithExtra((issue) => {
|
||||
const res = this.getUserValueByKey(issue, widgetParams.userKey);
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import {
|
|||
} from '@app/event-emitter/utils/tree-issues-store';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { WidgetInterface } from '../widget-interface';
|
||||
import * as PriorityStylesEnhancerNs from '@app/event-emitter/issue-enhancers/priority-styles-enhancer';
|
||||
|
||||
export namespace RootIssueSubTreesWidgetNs {
|
||||
export namespace Models {
|
||||
|
|
@ -66,6 +67,7 @@ export class RootIssueSubTreesWidgetService
|
|||
this.timePassedHighlightEnhancer,
|
||||
this.issueUrlEnhancer,
|
||||
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
||||
PriorityStylesEnhancerNs.CreatePriorityStylesEnhancer(widgetParams),
|
||||
]);
|
||||
let stories: TreeIssuesStoreNs.Models.GetFlatStories.Result;
|
||||
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 { Injectable, Logger } from '@nestjs/common';
|
||||
import nano from 'nano';
|
||||
import * as PriorityStylesEnhancerNs from '@app/event-emitter/issue-enhancers/priority-styles-enhancer';
|
||||
|
||||
export namespace IssuesByTagsWidgetNs {
|
||||
export type Params = {
|
||||
|
|
@ -59,6 +60,7 @@ export class IssuesByTagsWidgetService
|
|||
this.timePassedHighlightEnhancer,
|
||||
this.issueUrlEnhancer,
|
||||
TagStyledEnhancerNs.CreateTagStyledEnhancerForConfig(widgetParams),
|
||||
PriorityStylesEnhancerNs.CreatePriorityStylesEnhancer(widgetParams),
|
||||
]);
|
||||
const grouped = store.groupByStatusWithExtraToMultipleStories((issue) => {
|
||||
if (!issue || !widgetParams.tags || !widgetParams.tags.tagsKeyName) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue