@kopexa/grc 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-5TBN3JQA.mjs +66 -0
- package/dist/{chunk-TW3S4OE2.mjs → chunk-AGASJJ7X.mjs} +106 -82
- package/dist/chunk-DC44K745.mjs +46 -0
- package/dist/chunk-HI7F2CF4.mjs +1 -0
- package/dist/chunk-HJUSN7FD.mjs +1 -0
- package/dist/chunk-QDYL5ABK.mjs +118 -0
- package/dist/chunk-QS5S6V26.mjs +22 -0
- package/dist/chunk-VFX3DASQ.mjs +57 -0
- package/dist/common/control/index.d.mts +3 -0
- package/dist/common/control/index.d.ts +3 -0
- package/dist/common/control/index.js +160 -0
- package/dist/common/control/index.mjs +11 -0
- package/dist/common/control/mapped-controls.d.mts +33 -0
- package/dist/common/control/mapped-controls.d.ts +33 -0
- package/dist/common/control/mapped-controls.js +159 -0
- package/dist/common/control/mapped-controls.mjs +11 -0
- package/dist/common/control/messages.d.mts +16 -0
- package/dist/common/control/messages.d.ts +16 -0
- package/dist/common/control/messages.js +45 -0
- package/dist/common/control/messages.mjs +7 -0
- package/dist/common/impact/impact-card.d.mts +7 -1
- package/dist/common/impact/impact-card.d.ts +7 -1
- package/dist/common/impact/impact-card.js +105 -81
- package/dist/common/impact/impact-card.mjs +1 -1
- package/dist/common/impact/index.js +105 -81
- package/dist/common/impact/index.mjs +1 -1
- package/dist/common/index.d.mts +5 -0
- package/dist/common/index.d.ts +5 -0
- package/dist/common/index.js +458 -145
- package/dist/common/index.mjs +27 -2
- package/dist/common/risk/index.d.mts +4 -0
- package/dist/common/risk/index.d.ts +4 -0
- package/dist/common/risk/index.js +185 -0
- package/dist/common/risk/index.mjs +20 -0
- package/dist/common/risk/messages.d.mts +40 -0
- package/dist/common/risk/messages.d.ts +40 -0
- package/dist/common/risk/messages.js +69 -0
- package/dist/common/risk/messages.mjs +7 -0
- package/dist/common/risk/risk-rating-display.d.mts +21 -0
- package/dist/common/risk/risk-rating-display.d.ts +21 -0
- package/dist/common/risk/risk-rating-display.js +139 -0
- package/dist/common/risk/risk-rating-display.mjs +10 -0
- package/dist/common/risk/types.d.mts +37 -0
- package/dist/common/risk/types.d.ts +37 -0
- package/dist/common/risk/types.js +82 -0
- package/dist/common/risk/types.mjs +11 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +458 -145
- package/dist/index.mjs +27 -2
- package/package.json +8 -7
- package/src/common/control/index.ts +6 -0
- package/src/common/control/mapped-controls.tsx +192 -0
- package/src/common/control/messages.ts +16 -0
- package/src/common/impact/impact-card.tsx +132 -79
- package/src/common/index.ts +2 -0
- package/src/common/risk/index.ts +12 -0
- package/src/common/risk/messages.ts +40 -0
- package/src/common/risk/risk-rating-display.tsx +86 -0
- package/src/common/risk/types.ts +91 -0
- /package/dist/{chunk-BFZPRJQT.mjs → chunk-CND77GVC.mjs} +0 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useSafeIntl } from "@kopexa/i18n";
|
|
4
|
+
import { Tooltip } from "@kopexa/sight";
|
|
5
|
+
import { riskRating } from "@kopexa/theme";
|
|
6
|
+
import { messages } from "./messages";
|
|
7
|
+
import {
|
|
8
|
+
getRiskLevelFromRating,
|
|
9
|
+
isRatingUnrated,
|
|
10
|
+
type RiskLevel,
|
|
11
|
+
type RiskRating,
|
|
12
|
+
} from "./types";
|
|
13
|
+
|
|
14
|
+
export interface RiskRatingDisplayProps {
|
|
15
|
+
/** The risk rating to display */
|
|
16
|
+
rating: RiskRating | null | undefined;
|
|
17
|
+
/** Show the rating value badge */
|
|
18
|
+
showBadge?: boolean;
|
|
19
|
+
/** Show the level label text */
|
|
20
|
+
showLabel?: boolean;
|
|
21
|
+
/** Size variant */
|
|
22
|
+
size?: "sm" | "md";
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Display component for risk ratings.
|
|
27
|
+
* Shows a colored badge with the rating value and level label.
|
|
28
|
+
* Handles "not rated" state gracefully.
|
|
29
|
+
*/
|
|
30
|
+
export function RiskRatingDisplay({
|
|
31
|
+
rating,
|
|
32
|
+
showBadge = true,
|
|
33
|
+
showLabel = true,
|
|
34
|
+
size = "md",
|
|
35
|
+
}: RiskRatingDisplayProps) {
|
|
36
|
+
const intl = useSafeIntl();
|
|
37
|
+
|
|
38
|
+
// Handle unrated state
|
|
39
|
+
if (isRatingUnrated(rating)) {
|
|
40
|
+
const styles = riskRating({ size, level: "unrated" });
|
|
41
|
+
const levelLabel = intl.formatMessage(messages.level_unrated);
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<Tooltip content={intl.formatMessage(messages.not_rated_hint)}>
|
|
45
|
+
<div className={styles.base()}>
|
|
46
|
+
{showBadge && <div className={styles.badge()}>—</div>}
|
|
47
|
+
{showLabel && <span className={styles.label()}>{levelLabel}</span>}
|
|
48
|
+
</div>
|
|
49
|
+
</Tooltip>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// At this point, rating is guaranteed to be non-null with valid values
|
|
54
|
+
const ratedValue = rating as RiskRating;
|
|
55
|
+
const level = getRiskLevelFromRating(ratedValue.rating);
|
|
56
|
+
const styles = riskRating({
|
|
57
|
+
size,
|
|
58
|
+
level: level as Exclude<RiskLevel, "unrated">,
|
|
59
|
+
});
|
|
60
|
+
const levelLabelKey = `level_${level}` as keyof typeof messages;
|
|
61
|
+
const levelLabel = intl.formatMessage(messages[levelLabelKey]);
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<Tooltip
|
|
65
|
+
content={
|
|
66
|
+
<div className="text-xs space-y-1">
|
|
67
|
+
<div>
|
|
68
|
+
{intl.formatMessage(messages.likelihood)}: {ratedValue.likelihood}/5
|
|
69
|
+
</div>
|
|
70
|
+
<div>
|
|
71
|
+
{intl.formatMessage(messages.consequence)}: {ratedValue.consequence}
|
|
72
|
+
/5
|
|
73
|
+
</div>
|
|
74
|
+
{ratedValue.comment && (
|
|
75
|
+
<div className="text-muted-foreground">{ratedValue.comment}</div>
|
|
76
|
+
)}
|
|
77
|
+
</div>
|
|
78
|
+
}
|
|
79
|
+
>
|
|
80
|
+
<div className={styles.base()}>
|
|
81
|
+
{showBadge && <div className={styles.badge()}>{ratedValue.rating}</div>}
|
|
82
|
+
{showLabel && <span className={styles.label()}>{levelLabel}</span>}
|
|
83
|
+
</div>
|
|
84
|
+
</Tooltip>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RiskRating represents the risk assessment details.
|
|
3
|
+
* Aligned with backend Go struct.
|
|
4
|
+
*/
|
|
5
|
+
export interface RiskRating {
|
|
6
|
+
/** Likelihood of the risk occurring (1-5). 0 = not rated. */
|
|
7
|
+
likelihood: number;
|
|
8
|
+
/** Consequence/impact if the risk occurs (1-5). 0 = not rated. */
|
|
9
|
+
consequence: number;
|
|
10
|
+
/** Calculated rating: likelihood × consequence (0-25). 0 = not rated. */
|
|
11
|
+
rating: number;
|
|
12
|
+
/** Optional comment for context */
|
|
13
|
+
comment?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type RiskLevel = "unrated" | "low" | "medium" | "high" | "critical";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Get risk level from rating (0-25).
|
|
20
|
+
* - 0: Unrated
|
|
21
|
+
* - 1-4: Low
|
|
22
|
+
* - 5-9: Medium
|
|
23
|
+
* - 10-16: High
|
|
24
|
+
* - 17-25: Critical
|
|
25
|
+
*/
|
|
26
|
+
export function getRiskLevelFromRating(rating: number): RiskLevel {
|
|
27
|
+
if (rating === 0) return "unrated";
|
|
28
|
+
if (rating <= 4) return "low";
|
|
29
|
+
if (rating <= 9) return "medium";
|
|
30
|
+
if (rating <= 16) return "high";
|
|
31
|
+
return "critical";
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Check if a rating is considered "not rated"
|
|
36
|
+
*/
|
|
37
|
+
export function isRatingUnrated(
|
|
38
|
+
rating: RiskRating | null | undefined,
|
|
39
|
+
): boolean {
|
|
40
|
+
if (!rating) return true;
|
|
41
|
+
return (
|
|
42
|
+
rating.rating === 0 || rating.likelihood === 0 || rating.consequence === 0
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const riskLevelConfig: Record<
|
|
47
|
+
RiskLevel,
|
|
48
|
+
{
|
|
49
|
+
label: string;
|
|
50
|
+
bgColor: string;
|
|
51
|
+
textColor: string;
|
|
52
|
+
iconBgColor: string;
|
|
53
|
+
iconTextColor: string;
|
|
54
|
+
}
|
|
55
|
+
> = {
|
|
56
|
+
unrated: {
|
|
57
|
+
label: "Nicht bewertet",
|
|
58
|
+
bgColor: "bg-muted",
|
|
59
|
+
textColor: "text-muted-foreground",
|
|
60
|
+
iconBgColor: "bg-muted/50",
|
|
61
|
+
iconTextColor: "text-muted-foreground",
|
|
62
|
+
},
|
|
63
|
+
low: {
|
|
64
|
+
label: "Niedrig",
|
|
65
|
+
bgColor: "bg-success",
|
|
66
|
+
textColor: "text-success",
|
|
67
|
+
iconBgColor: "bg-success/10",
|
|
68
|
+
iconTextColor: "text-success",
|
|
69
|
+
},
|
|
70
|
+
medium: {
|
|
71
|
+
label: "Mittel",
|
|
72
|
+
bgColor: "bg-warning",
|
|
73
|
+
textColor: "text-warning",
|
|
74
|
+
iconBgColor: "bg-warning/10",
|
|
75
|
+
iconTextColor: "text-warning",
|
|
76
|
+
},
|
|
77
|
+
high: {
|
|
78
|
+
label: "Hoch",
|
|
79
|
+
bgColor: "bg-orange-500",
|
|
80
|
+
textColor: "text-orange-500",
|
|
81
|
+
iconBgColor: "bg-orange-500/10",
|
|
82
|
+
iconTextColor: "text-orange-500",
|
|
83
|
+
},
|
|
84
|
+
critical: {
|
|
85
|
+
label: "Kritisch",
|
|
86
|
+
bgColor: "bg-destructive",
|
|
87
|
+
textColor: "text-destructive",
|
|
88
|
+
iconBgColor: "bg-destructive/10",
|
|
89
|
+
iconTextColor: "text-destructive",
|
|
90
|
+
},
|
|
91
|
+
};
|
|
File without changes
|