Добавлено применение стилей приоритета по параметрам из настроек доски или списка задач

This commit is contained in:
Pavel Gnedov 2023-07-03 13:19:07 +07:00
parent 00f7e6eea3
commit ed451557f2
6 changed files with 112 additions and 0 deletions

View file

@ -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);
}

View file

@ -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);

View file

@ -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[];

View file

@ -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);

View file

@ -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) {

View file

@ -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) {