@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.
Files changed (61) hide show
  1. package/dist/chunk-5TBN3JQA.mjs +66 -0
  2. package/dist/{chunk-TW3S4OE2.mjs → chunk-AGASJJ7X.mjs} +106 -82
  3. package/dist/chunk-DC44K745.mjs +46 -0
  4. package/dist/chunk-HI7F2CF4.mjs +1 -0
  5. package/dist/chunk-HJUSN7FD.mjs +1 -0
  6. package/dist/chunk-QDYL5ABK.mjs +118 -0
  7. package/dist/chunk-QS5S6V26.mjs +22 -0
  8. package/dist/chunk-VFX3DASQ.mjs +57 -0
  9. package/dist/common/control/index.d.mts +3 -0
  10. package/dist/common/control/index.d.ts +3 -0
  11. package/dist/common/control/index.js +160 -0
  12. package/dist/common/control/index.mjs +11 -0
  13. package/dist/common/control/mapped-controls.d.mts +33 -0
  14. package/dist/common/control/mapped-controls.d.ts +33 -0
  15. package/dist/common/control/mapped-controls.js +159 -0
  16. package/dist/common/control/mapped-controls.mjs +11 -0
  17. package/dist/common/control/messages.d.mts +16 -0
  18. package/dist/common/control/messages.d.ts +16 -0
  19. package/dist/common/control/messages.js +45 -0
  20. package/dist/common/control/messages.mjs +7 -0
  21. package/dist/common/impact/impact-card.d.mts +7 -1
  22. package/dist/common/impact/impact-card.d.ts +7 -1
  23. package/dist/common/impact/impact-card.js +105 -81
  24. package/dist/common/impact/impact-card.mjs +1 -1
  25. package/dist/common/impact/index.js +105 -81
  26. package/dist/common/impact/index.mjs +1 -1
  27. package/dist/common/index.d.mts +5 -0
  28. package/dist/common/index.d.ts +5 -0
  29. package/dist/common/index.js +458 -145
  30. package/dist/common/index.mjs +27 -2
  31. package/dist/common/risk/index.d.mts +4 -0
  32. package/dist/common/risk/index.d.ts +4 -0
  33. package/dist/common/risk/index.js +185 -0
  34. package/dist/common/risk/index.mjs +20 -0
  35. package/dist/common/risk/messages.d.mts +40 -0
  36. package/dist/common/risk/messages.d.ts +40 -0
  37. package/dist/common/risk/messages.js +69 -0
  38. package/dist/common/risk/messages.mjs +7 -0
  39. package/dist/common/risk/risk-rating-display.d.mts +21 -0
  40. package/dist/common/risk/risk-rating-display.d.ts +21 -0
  41. package/dist/common/risk/risk-rating-display.js +139 -0
  42. package/dist/common/risk/risk-rating-display.mjs +10 -0
  43. package/dist/common/risk/types.d.mts +37 -0
  44. package/dist/common/risk/types.d.ts +37 -0
  45. package/dist/common/risk/types.js +82 -0
  46. package/dist/common/risk/types.mjs +11 -0
  47. package/dist/index.d.mts +5 -0
  48. package/dist/index.d.ts +5 -0
  49. package/dist/index.js +458 -145
  50. package/dist/index.mjs +27 -2
  51. package/package.json +8 -7
  52. package/src/common/control/index.ts +6 -0
  53. package/src/common/control/mapped-controls.tsx +192 -0
  54. package/src/common/control/messages.ts +16 -0
  55. package/src/common/impact/impact-card.tsx +132 -79
  56. package/src/common/index.ts +2 -0
  57. package/src/common/risk/index.ts +12 -0
  58. package/src/common/risk/messages.ts +40 -0
  59. package/src/common/risk/risk-rating-display.tsx +86 -0
  60. package/src/common/risk/types.ts +91 -0
  61. /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