@kyverno/backstage-plugin-policy-reporter 2.1.1 → 2.2.1
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/README.md +9 -1
- package/dist/components/EntityCustomPoliciesContent/EntityCustomPoliciesContent.esm.js +105 -0
- package/dist/components/EntityCustomPoliciesContent/EntityCustomPoliciesContent.esm.js.map +1 -0
- package/dist/components/EntityCustomPoliciesContent/index.esm.js +2 -0
- package/dist/components/EntityCustomPoliciesContent/index.esm.js.map +1 -0
- package/dist/components/EntityKyvernoPoliciesContent/EntityKyvernoPoliciesContent.esm.js +66 -59
- package/dist/components/EntityKyvernoPoliciesContent/EntityKyvernoPoliciesContent.esm.js.map +1 -1
- package/dist/components/MissingEnvironmentsEmptyState/MissingEnvironmentsEmptyState.esm.js +21 -13
- package/dist/components/MissingEnvironmentsEmptyState/MissingEnvironmentsEmptyState.esm.js.map +1 -1
- package/dist/components/PolicyReportsDrawerComponent/PolicyReportsDrawerComponent.esm.js +69 -3
- package/dist/components/PolicyReportsDrawerComponent/PolicyReportsDrawerComponent.esm.js.map +1 -1
- package/dist/components/PolicyReportsTable/PolicyReportsTable.esm.js +43 -39
- package/dist/components/PolicyReportsTable/PolicyReportsTable.esm.js.map +1 -1
- package/dist/components/SelectEnvironment/SelectEnvironment.esm.js +16 -13
- package/dist/components/SelectEnvironment/SelectEnvironment.esm.js.map +1 -1
- package/dist/components/SeverityComponent/SeverityComponent.esm.js +6 -6
- package/dist/components/SeverityComponent/SeverityComponent.esm.js.map +1 -1
- package/dist/components/StatusComponent/StatusComponent.esm.js +6 -6
- package/dist/components/StatusComponent/StatusComponent.esm.js.map +1 -1
- package/dist/index.d.ts +11 -6
- package/dist/index.esm.js +1 -1
- package/dist/plugin.esm.js +10 -1
- package/dist/plugin.esm.js.map +1 -1
- package/package.json +12 -13
- package/LICENSE +0 -201
package/README.md
CHANGED
|
@@ -14,7 +14,15 @@ Add the plugin to your frontend app
|
|
|
14
14
|
yarn --cwd packages/app add @kyverno/backstage-plugin-policy-reporter
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
Add the
|
|
17
|
+
Add the desired policy-reporter component(s) to your Entity routes in `packages/app/src/components/catalog/EntityPage.tsx`
|
|
18
|
+
Choose from the available components:
|
|
19
|
+
|
|
20
|
+
- [EntityKyvernoPoliciesContent](/docs/component-setup.md#entitykyvernopoliciescontent) - Displays kyverno policies for an entity using the `kyverno` source
|
|
21
|
+
- [EntityCustomPoliciesContent](/docs/component-setup.md#entitycustompoliciescontent) - Displays policy reports from a custom source
|
|
22
|
+
|
|
23
|
+
For detailed setup instructions including screenshots, see the [Component Setup Guide](/docs/component-setup.md).
|
|
24
|
+
|
|
25
|
+
#### EntityKyvernoPoliciesContent example
|
|
18
26
|
|
|
19
27
|
```diff
|
|
20
28
|
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Progress, ContentHeader, Page, Content } from '@backstage/core-components';
|
|
3
|
+
import { useEntity, MissingAnnotationEmptyState } from '@backstage/plugin-catalog-react';
|
|
4
|
+
import { Grid } from '@material-ui/core';
|
|
5
|
+
import { PolicyReportsTable } from '../PolicyReportsTable/PolicyReportsTable.esm.js';
|
|
6
|
+
import { SelectEnvironment } from '../SelectEnvironment/SelectEnvironment.esm.js';
|
|
7
|
+
import { containsRequiredAnnotations, annotationsRequired } from '../../utils/annotations.esm.js';
|
|
8
|
+
import { MissingEnvironmentsEmptyState } from '../MissingEnvironmentsEmptyState/MissingEnvironmentsEmptyState.esm.js';
|
|
9
|
+
import { useEntityEnvironment } from '../../hooks/useEntityEnvironment.esm.js';
|
|
10
|
+
import { KYVERNO_NAMESPACE_ANNOTATION, KYVERNO_KIND_ANNOTATION, KYVERNO_RESOURCE_NAME_ANNOTATION } from '@kyverno/backstage-plugin-policy-reporter-common';
|
|
11
|
+
|
|
12
|
+
const PageContent = ({ children }) => /* @__PURE__ */ jsx(Page, { themeId: "tool", children: /* @__PURE__ */ jsx(Content, { children }) });
|
|
13
|
+
const EntityCustomPoliciesContent = ({
|
|
14
|
+
annotationsDocumentationUrl,
|
|
15
|
+
policyDocumentationUrl,
|
|
16
|
+
sources,
|
|
17
|
+
title
|
|
18
|
+
}) => {
|
|
19
|
+
const { entity } = useEntity();
|
|
20
|
+
const annotations = entity.metadata.annotations;
|
|
21
|
+
const annotationsState = containsRequiredAnnotations(annotations);
|
|
22
|
+
const {
|
|
23
|
+
environments,
|
|
24
|
+
environmentsLoading,
|
|
25
|
+
setCurrentEnvironment,
|
|
26
|
+
currentEnvironment
|
|
27
|
+
} = useEntityEnvironment(entity, annotationsState);
|
|
28
|
+
if (!annotationsState)
|
|
29
|
+
return /* @__PURE__ */ jsx(PageContent, { children: /* @__PURE__ */ jsx(
|
|
30
|
+
MissingAnnotationEmptyState,
|
|
31
|
+
{
|
|
32
|
+
readMoreUrl: annotationsDocumentationUrl,
|
|
33
|
+
annotation: annotationsRequired
|
|
34
|
+
}
|
|
35
|
+
) });
|
|
36
|
+
if (environmentsLoading) return /* @__PURE__ */ jsx(Progress, {});
|
|
37
|
+
if (environments === void 0 || !currentEnvironment)
|
|
38
|
+
return /* @__PURE__ */ jsx(PageContent, { children: /* @__PURE__ */ jsx(MissingEnvironmentsEmptyState, { entity }) });
|
|
39
|
+
const namespaces = annotations[KYVERNO_NAMESPACE_ANNOTATION].split(",");
|
|
40
|
+
const kinds = annotations[KYVERNO_KIND_ANNOTATION].split(",");
|
|
41
|
+
const resourceName = annotations[KYVERNO_RESOURCE_NAME_ANNOTATION];
|
|
42
|
+
return /* @__PURE__ */ jsxs(PageContent, { children: [
|
|
43
|
+
/* @__PURE__ */ jsx(ContentHeader, { title, children: /* @__PURE__ */ jsx(
|
|
44
|
+
SelectEnvironment,
|
|
45
|
+
{
|
|
46
|
+
environments,
|
|
47
|
+
currentEnvironment,
|
|
48
|
+
setCurrentEnvironment
|
|
49
|
+
}
|
|
50
|
+
) }),
|
|
51
|
+
/* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, children: [
|
|
52
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
53
|
+
PolicyReportsTable,
|
|
54
|
+
{
|
|
55
|
+
currentEnvironment,
|
|
56
|
+
filter: {
|
|
57
|
+
namespaces,
|
|
58
|
+
sources,
|
|
59
|
+
kinds,
|
|
60
|
+
status: ["fail", "warn", "error"],
|
|
61
|
+
search: resourceName
|
|
62
|
+
},
|
|
63
|
+
title: "Failing Policy Results",
|
|
64
|
+
emptyContentText: "No failing policies",
|
|
65
|
+
policyDocumentationUrl
|
|
66
|
+
}
|
|
67
|
+
) }),
|
|
68
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
69
|
+
PolicyReportsTable,
|
|
70
|
+
{
|
|
71
|
+
currentEnvironment,
|
|
72
|
+
filter: {
|
|
73
|
+
namespaces,
|
|
74
|
+
sources,
|
|
75
|
+
kinds,
|
|
76
|
+
status: ["pass"],
|
|
77
|
+
search: resourceName
|
|
78
|
+
},
|
|
79
|
+
title: "Passing Policy Results",
|
|
80
|
+
emptyContentText: "No passing policies",
|
|
81
|
+
policyDocumentationUrl
|
|
82
|
+
}
|
|
83
|
+
) }),
|
|
84
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
85
|
+
PolicyReportsTable,
|
|
86
|
+
{
|
|
87
|
+
currentEnvironment,
|
|
88
|
+
filter: {
|
|
89
|
+
namespaces,
|
|
90
|
+
sources,
|
|
91
|
+
kinds,
|
|
92
|
+
status: ["skip"],
|
|
93
|
+
search: resourceName
|
|
94
|
+
},
|
|
95
|
+
title: "Skipped Policy Results",
|
|
96
|
+
emptyContentText: "No skipped policies",
|
|
97
|
+
policyDocumentationUrl
|
|
98
|
+
}
|
|
99
|
+
) })
|
|
100
|
+
] })
|
|
101
|
+
] });
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export { EntityCustomPoliciesContent };
|
|
105
|
+
//# sourceMappingURL=EntityCustomPoliciesContent.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityCustomPoliciesContent.esm.js","sources":["../../../src/components/EntityCustomPoliciesContent/EntityCustomPoliciesContent.tsx"],"sourcesContent":["import {\n Content,\n ContentHeader,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport {\n MissingAnnotationEmptyState,\n useEntity,\n} from '@backstage/plugin-catalog-react';\nimport { Grid } from '@material-ui/core';\nimport { PolicyReportsTable } from '../PolicyReportsTable';\nimport { SelectEnvironment } from '../SelectEnvironment';\nimport {\n containsRequiredAnnotations,\n annotationsRequired,\n} from '../../utils/annotations';\nimport { MissingEnvironmentsEmptyState } from '../MissingEnvironmentsEmptyState';\nimport { useEntityEnvironment } from '../../hooks/useEntityEnvironment';\nimport {\n KYVERNO_KIND_ANNOTATION,\n KYVERNO_NAMESPACE_ANNOTATION,\n KYVERNO_RESOURCE_NAME_ANNOTATION,\n} from '@kyverno/backstage-plugin-policy-reporter-common';\n\ntype EntityCustomPoliciesContentProps = {\n annotationsDocumentationUrl?: string;\n policyDocumentationUrl?: string;\n sources: string[];\n title: string;\n};\n\ntype PageContentProps = {\n children: React.ReactNode;\n};\n\nconst PageContent = ({ children }: PageContentProps) => (\n <Page themeId=\"tool\">\n <Content>{children}</Content>\n </Page>\n);\n\nexport const EntityCustomPoliciesContent = ({\n annotationsDocumentationUrl,\n policyDocumentationUrl,\n sources,\n title,\n}: EntityCustomPoliciesContentProps) => {\n const { entity } = useEntity();\n const annotations = entity.metadata.annotations;\n\n // Boolean variable to validate that entity have required annotations\n const annotationsState: boolean = containsRequiredAnnotations(annotations);\n\n const {\n environments,\n environmentsLoading,\n setCurrentEnvironment,\n currentEnvironment,\n } = useEntityEnvironment(entity, annotationsState);\n\n // Annotations missing\n if (!annotationsState)\n return (\n <PageContent>\n <MissingAnnotationEmptyState\n readMoreUrl={annotationsDocumentationUrl}\n annotation={annotationsRequired}\n />\n </PageContent>\n );\n\n // Fetching environments\n if (environmentsLoading) return <Progress />;\n\n // Environments missing\n if (environments === undefined || !currentEnvironment)\n return (\n <PageContent>\n <MissingEnvironmentsEmptyState entity={entity} />\n </PageContent>\n );\n\n const namespaces = annotations![KYVERNO_NAMESPACE_ANNOTATION].split(',');\n const kinds = annotations![KYVERNO_KIND_ANNOTATION].split(',');\n const resourceName = annotations![KYVERNO_RESOURCE_NAME_ANNOTATION];\n\n return (\n <PageContent>\n <ContentHeader title={title}>\n <SelectEnvironment\n environments={environments}\n currentEnvironment={currentEnvironment}\n setCurrentEnvironment={setCurrentEnvironment}\n />\n </ContentHeader>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <PolicyReportsTable\n currentEnvironment={currentEnvironment}\n filter={{\n namespaces,\n sources,\n kinds,\n status: ['fail', 'warn', 'error'],\n search: resourceName,\n }}\n title=\"Failing Policy Results\"\n emptyContentText=\"No failing policies\"\n policyDocumentationUrl={policyDocumentationUrl}\n />\n </Grid>\n <Grid item xs={12}>\n <PolicyReportsTable\n currentEnvironment={currentEnvironment}\n filter={{\n namespaces,\n sources,\n kinds,\n status: ['pass'],\n search: resourceName,\n }}\n title=\"Passing Policy Results\"\n emptyContentText=\"No passing policies\"\n policyDocumentationUrl={policyDocumentationUrl}\n />\n </Grid>\n <Grid item xs={12}>\n <PolicyReportsTable\n currentEnvironment={currentEnvironment}\n filter={{\n namespaces,\n sources,\n kinds,\n status: ['skip'],\n search: resourceName,\n }}\n title=\"Skipped Policy Results\"\n emptyContentText=\"No skipped policies\"\n policyDocumentationUrl={policyDocumentationUrl}\n />\n </Grid>\n </Grid>\n </PageContent>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
1
2
|
import { Progress, ContentHeader, Page, Content } from '@backstage/core-components';
|
|
2
|
-
import React from 'react';
|
|
3
3
|
import { useEntity, MissingAnnotationEmptyState } from '@backstage/plugin-catalog-react';
|
|
4
4
|
import { Grid } from '@material-ui/core';
|
|
5
5
|
import { PolicyReportsTable } from '../PolicyReportsTable/PolicyReportsTable.esm.js';
|
|
@@ -9,7 +9,7 @@ import { MissingEnvironmentsEmptyState } from '../MissingEnvironmentsEmptyState/
|
|
|
9
9
|
import { useEntityEnvironment } from '../../hooks/useEntityEnvironment.esm.js';
|
|
10
10
|
import { KYVERNO_NAMESPACE_ANNOTATION, KYVERNO_KIND_ANNOTATION, KYVERNO_RESOURCE_NAME_ANNOTATION } from '@kyverno/backstage-plugin-policy-reporter-common';
|
|
11
11
|
|
|
12
|
-
const PageContent = ({ children }) => /* @__PURE__ */
|
|
12
|
+
const PageContent = ({ children }) => /* @__PURE__ */ jsx(Page, { themeId: "tool", children: /* @__PURE__ */ jsx(Content, { children }) });
|
|
13
13
|
const EntityKyvernoPoliciesContent = ({
|
|
14
14
|
annotationsDocumentationUrl,
|
|
15
15
|
policyDocumentationUrl
|
|
@@ -24,72 +24,79 @@ const EntityKyvernoPoliciesContent = ({
|
|
|
24
24
|
currentEnvironment
|
|
25
25
|
} = useEntityEnvironment(entity, annotationsState);
|
|
26
26
|
if (!annotationsState)
|
|
27
|
-
return /* @__PURE__ */
|
|
27
|
+
return /* @__PURE__ */ jsx(PageContent, { children: /* @__PURE__ */ jsx(
|
|
28
28
|
MissingAnnotationEmptyState,
|
|
29
29
|
{
|
|
30
30
|
readMoreUrl: annotationsDocumentationUrl,
|
|
31
31
|
annotation: annotationsRequired
|
|
32
32
|
}
|
|
33
|
-
));
|
|
34
|
-
if (environmentsLoading) return /* @__PURE__ */
|
|
33
|
+
) });
|
|
34
|
+
if (environmentsLoading) return /* @__PURE__ */ jsx(Progress, {});
|
|
35
35
|
if (environments === void 0 || !currentEnvironment)
|
|
36
|
-
return /* @__PURE__ */
|
|
36
|
+
return /* @__PURE__ */ jsx(PageContent, { children: /* @__PURE__ */ jsx(MissingEnvironmentsEmptyState, { entity }) });
|
|
37
37
|
const namespaces = annotations[KYVERNO_NAMESPACE_ANNOTATION].split(",");
|
|
38
38
|
const kinds = annotations[KYVERNO_KIND_ANNOTATION].split(",");
|
|
39
39
|
const resourceName = annotations[KYVERNO_RESOURCE_NAME_ANNOTATION];
|
|
40
|
-
return /* @__PURE__ */
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
{
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
40
|
+
return /* @__PURE__ */ jsxs(PageContent, { children: [
|
|
41
|
+
/* @__PURE__ */ jsx(ContentHeader, { title: "Kyverno Policy Reports", children: /* @__PURE__ */ jsx(
|
|
42
|
+
SelectEnvironment,
|
|
43
|
+
{
|
|
44
|
+
environments,
|
|
45
|
+
currentEnvironment,
|
|
46
|
+
setCurrentEnvironment
|
|
47
|
+
}
|
|
48
|
+
) }),
|
|
49
|
+
/* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, children: [
|
|
50
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
51
|
+
PolicyReportsTable,
|
|
52
|
+
{
|
|
53
|
+
currentEnvironment,
|
|
54
|
+
filter: {
|
|
55
|
+
namespaces,
|
|
56
|
+
sources: ["kyverno"],
|
|
57
|
+
kinds,
|
|
58
|
+
status: ["fail", "warn", "error"],
|
|
59
|
+
search: resourceName
|
|
60
|
+
},
|
|
61
|
+
title: "Failing Policy Results",
|
|
62
|
+
emptyContentText: "No failing policies",
|
|
63
|
+
policyDocumentationUrl
|
|
64
|
+
}
|
|
65
|
+
) }),
|
|
66
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
67
|
+
PolicyReportsTable,
|
|
68
|
+
{
|
|
69
|
+
currentEnvironment,
|
|
70
|
+
filter: {
|
|
71
|
+
namespaces,
|
|
72
|
+
sources: ["kyverno"],
|
|
73
|
+
kinds,
|
|
74
|
+
status: ["pass"],
|
|
75
|
+
search: resourceName
|
|
76
|
+
},
|
|
77
|
+
title: "Passing Policy Results",
|
|
78
|
+
emptyContentText: "No passing policies",
|
|
79
|
+
policyDocumentationUrl
|
|
80
|
+
}
|
|
81
|
+
) }),
|
|
82
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
83
|
+
PolicyReportsTable,
|
|
84
|
+
{
|
|
85
|
+
currentEnvironment,
|
|
86
|
+
filter: {
|
|
87
|
+
namespaces,
|
|
88
|
+
sources: ["kyverno"],
|
|
89
|
+
kinds,
|
|
90
|
+
status: ["skip"],
|
|
91
|
+
search: resourceName
|
|
92
|
+
},
|
|
93
|
+
title: "Skipped Policy Results",
|
|
94
|
+
emptyContentText: "No skipped policies",
|
|
95
|
+
policyDocumentationUrl
|
|
96
|
+
}
|
|
97
|
+
) })
|
|
98
|
+
] })
|
|
99
|
+
] });
|
|
93
100
|
};
|
|
94
101
|
|
|
95
102
|
export { EntityKyvernoPoliciesContent };
|
package/dist/components/EntityKyvernoPoliciesContent/EntityKyvernoPoliciesContent.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityKyvernoPoliciesContent.esm.js","sources":["../../../src/components/EntityKyvernoPoliciesContent/EntityKyvernoPoliciesContent.tsx"],"sourcesContent":["import {\n Content,\n ContentHeader,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport
|
|
1
|
+
{"version":3,"file":"EntityKyvernoPoliciesContent.esm.js","sources":["../../../src/components/EntityKyvernoPoliciesContent/EntityKyvernoPoliciesContent.tsx"],"sourcesContent":["import {\n Content,\n ContentHeader,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport {\n MissingAnnotationEmptyState,\n useEntity,\n} from '@backstage/plugin-catalog-react';\nimport { Grid } from '@material-ui/core';\nimport { PolicyReportsTable } from '../PolicyReportsTable';\nimport { SelectEnvironment } from '../SelectEnvironment';\nimport {\n containsRequiredAnnotations,\n annotationsRequired,\n} from '../../utils/annotations';\nimport { MissingEnvironmentsEmptyState } from '../MissingEnvironmentsEmptyState';\nimport { useEntityEnvironment } from '../../hooks/useEntityEnvironment';\nimport {\n KYVERNO_KIND_ANNOTATION,\n KYVERNO_NAMESPACE_ANNOTATION,\n KYVERNO_RESOURCE_NAME_ANNOTATION,\n} from '@kyverno/backstage-plugin-policy-reporter-common';\n\ntype KyvernoPoliciesContentProps = {\n annotationsDocumentationUrl?: string;\n policyDocumentationUrl?: string;\n};\n\ntype PageContentProps = {\n children: React.ReactNode;\n};\n\nconst PageContent = ({ children }: PageContentProps) => (\n <Page themeId=\"tool\">\n <Content>{children}</Content>\n </Page>\n);\n\nexport const EntityKyvernoPoliciesContent = ({\n annotationsDocumentationUrl,\n policyDocumentationUrl,\n}: KyvernoPoliciesContentProps) => {\n const { entity } = useEntity();\n const annotations = entity.metadata.annotations;\n\n // Boolean variable to validate that entity have required annotations\n const annotationsState: boolean = containsRequiredAnnotations(annotations);\n\n const {\n environments,\n environmentsLoading,\n setCurrentEnvironment,\n currentEnvironment,\n } = useEntityEnvironment(entity, annotationsState);\n\n // Annotations missing\n if (!annotationsState)\n return (\n <PageContent>\n <MissingAnnotationEmptyState\n readMoreUrl={annotationsDocumentationUrl}\n annotation={annotationsRequired}\n />\n </PageContent>\n );\n\n // Fetching environments\n if (environmentsLoading) return <Progress />;\n\n // Environments missing\n if (environments === undefined || !currentEnvironment)\n return (\n <PageContent>\n <MissingEnvironmentsEmptyState entity={entity} />\n </PageContent>\n );\n\n const namespaces = annotations![KYVERNO_NAMESPACE_ANNOTATION].split(',');\n const kinds = annotations![KYVERNO_KIND_ANNOTATION].split(',');\n const resourceName = annotations![KYVERNO_RESOURCE_NAME_ANNOTATION];\n\n return (\n <PageContent>\n <ContentHeader title=\"Kyverno Policy Reports\">\n <SelectEnvironment\n environments={environments}\n currentEnvironment={currentEnvironment}\n setCurrentEnvironment={setCurrentEnvironment}\n />\n </ContentHeader>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <PolicyReportsTable\n currentEnvironment={currentEnvironment}\n filter={{\n namespaces,\n sources: ['kyverno'],\n kinds,\n status: ['fail', 'warn', 'error'],\n search: resourceName,\n }}\n title=\"Failing Policy Results\"\n emptyContentText=\"No failing policies\"\n policyDocumentationUrl={policyDocumentationUrl}\n />\n </Grid>\n <Grid item xs={12}>\n <PolicyReportsTable\n currentEnvironment={currentEnvironment}\n filter={{\n namespaces,\n sources: ['kyverno'],\n kinds,\n status: ['pass'],\n search: resourceName,\n }}\n title=\"Passing Policy Results\"\n emptyContentText=\"No passing policies\"\n policyDocumentationUrl={policyDocumentationUrl}\n />\n </Grid>\n <Grid item xs={12}>\n <PolicyReportsTable\n currentEnvironment={currentEnvironment}\n filter={{\n namespaces,\n sources: ['kyverno'],\n kinds,\n status: ['skip'],\n search: resourceName,\n }}\n title=\"Skipped Policy Results\"\n emptyContentText=\"No skipped policies\"\n policyDocumentationUrl={policyDocumentationUrl}\n />\n </Grid>\n </Grid>\n </PageContent>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
1
2
|
import Box from '@material-ui/core/Box';
|
|
2
3
|
import Button from '@material-ui/core/Button';
|
|
3
4
|
import { makeStyles } from '@material-ui/core/styles';
|
|
4
5
|
import Typography from '@material-ui/core/Typography';
|
|
5
|
-
import React from 'react';
|
|
6
6
|
import { EmptyState, CodeSnippet, Link } from '@backstage/core-components';
|
|
7
7
|
|
|
8
8
|
const useStyles = makeStyles(
|
|
@@ -41,22 +41,30 @@ const MissingEnvironmentsEmptyState = (props) => {
|
|
|
41
41
|
const classes = useStyles();
|
|
42
42
|
const entityKind = entity?.kind || "Component";
|
|
43
43
|
const { yamlText, lineNumbers } = generateYamlExample(entity);
|
|
44
|
-
return /* @__PURE__ */
|
|
44
|
+
return /* @__PURE__ */ jsx(
|
|
45
45
|
EmptyState,
|
|
46
46
|
{
|
|
47
47
|
missing: "field",
|
|
48
48
|
title: "Missing Valid Environment Dependency",
|
|
49
|
-
description: /* @__PURE__ */
|
|
50
|
-
action: /* @__PURE__ */
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
49
|
+
description: /* @__PURE__ */ jsx(Fragment, { children: "You need to add a dependency to a kubernetes-cluster Resource with a kyverno.io/endpoint annotation defined if you want to use this plugin." }),
|
|
50
|
+
action: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
51
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "body1", children: [
|
|
52
|
+
"Add the resource dependency to your ",
|
|
53
|
+
entityKind,
|
|
54
|
+
" YAML as shown in the highlighted example below:"
|
|
55
|
+
] }),
|
|
56
|
+
/* @__PURE__ */ jsx(Box, { className: classes.code, children: /* @__PURE__ */ jsx(
|
|
57
|
+
CodeSnippet,
|
|
58
|
+
{
|
|
59
|
+
text: yamlText,
|
|
60
|
+
language: "yaml",
|
|
61
|
+
showLineNumbers: true,
|
|
62
|
+
highlightedNumbers: lineNumbers,
|
|
63
|
+
customStyle: { background: "inherit", fontSize: "115%" }
|
|
64
|
+
}
|
|
65
|
+
) }),
|
|
66
|
+
/* @__PURE__ */ jsx(Button, { color: "primary", component: Link, to: url, children: "Read more" })
|
|
67
|
+
] })
|
|
60
68
|
}
|
|
61
69
|
);
|
|
62
70
|
};
|
package/dist/components/MissingEnvironmentsEmptyState/MissingEnvironmentsEmptyState.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MissingEnvironmentsEmptyState.esm.js","sources":["../../../src/components/MissingEnvironmentsEmptyState/MissingEnvironmentsEmptyState.tsx"],"sourcesContent":["import Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport
|
|
1
|
+
{"version":3,"file":"MissingEnvironmentsEmptyState.esm.js","sources":["../../../src/components/MissingEnvironmentsEmptyState/MissingEnvironmentsEmptyState.tsx"],"sourcesContent":["import Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport { CodeSnippet, Link, EmptyState } from '@backstage/core-components';\nimport { Entity } from '@backstage/catalog-model';\n\nconst useStyles = makeStyles(\n theme => ({\n code: {\n borderRadius: 6,\n margin: theme.spacing(2, 0),\n background:\n theme.palette.type === 'dark' ? '#444' : theme.palette.common.white,\n },\n }),\n { name: 'BackstageMissingAnnotationEmptyState' },\n);\n\nfunction generateYamlExample(entity?: Entity): {\n yamlText: string;\n lineNumbers: number[];\n} {\n const kind = entity?.kind || 'Component';\n const name = entity?.metadata.name || 'example';\n const type = entity?.spec?.type || 'website';\n const owner = entity?.spec?.owner || 'user:default/guest';\n\n const yamlText = `apiVersion: backstage.io/v1alpha1\nkind: ${kind}\nmetadata:\n name: ${name}\nspec:\n type: ${type}\n owner: ${owner}\n dependsOn: \n - value`;\n\n const lineNumbers: number[] = [9];\n\n return {\n yamlText,\n lineNumbers,\n };\n}\n\nexport const MissingEnvironmentsEmptyState = (props: {\n readMoreUrl?: string;\n entity?: Entity;\n}) => {\n const { entity, readMoreUrl } = props;\n const url =\n readMoreUrl ||\n 'https://backstage.io/docs/features/software-catalog/descriptor-format#specdependson-optional';\n\n const classes = useStyles();\n\n const entityKind = entity?.kind || 'Component';\n const { yamlText, lineNumbers } = generateYamlExample(entity);\n return (\n <EmptyState\n missing=\"field\"\n title=\"Missing Valid Environment Dependency\"\n description={\n <>\n You need to add a dependency to a kubernetes-cluster Resource with a\n kyverno.io/endpoint annotation defined if you want to use this plugin.\n </>\n }\n action={\n <>\n <Typography variant=\"body1\">\n Add the resource dependency to your {entityKind} YAML as shown in\n the highlighted example below:\n </Typography>\n <Box className={classes.code}>\n <CodeSnippet\n text={yamlText}\n language=\"yaml\"\n showLineNumbers\n highlightedNumbers={lineNumbers}\n customStyle={{ background: 'inherit', fontSize: '115%' }}\n />\n </Box>\n <Button color=\"primary\" component={Link} to={url}>\n Read more\n </Button>\n </>\n }\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;AAOA,MAAM,SAAY,GAAA,UAAA;AAAA,EAChB,CAAU,KAAA,MAAA;AAAA,IACR,IAAM,EAAA;AAAA,MACJ,YAAc,EAAA,CAAA;AAAA,MACd,MAAQ,EAAA,KAAA,CAAM,OAAQ,CAAA,CAAA,EAAG,CAAC,CAAA;AAAA,MAC1B,UAAA,EACE,MAAM,OAAQ,CAAA,IAAA,KAAS,SAAS,MAAS,GAAA,KAAA,CAAM,QAAQ,MAAO,CAAA;AAAA;AAClE,GACF,CAAA;AAAA,EACA,EAAE,MAAM,sCAAuC;AACjD,CAAA;AAEA,SAAS,oBAAoB,MAG3B,EAAA;AACA,EAAM,MAAA,IAAA,GAAO,QAAQ,IAAQ,IAAA,WAAA;AAC7B,EAAM,MAAA,IAAA,GAAO,MAAQ,EAAA,QAAA,CAAS,IAAQ,IAAA,SAAA;AACtC,EAAM,MAAA,IAAA,GAAO,MAAQ,EAAA,IAAA,EAAM,IAAQ,IAAA,SAAA;AACnC,EAAM,MAAA,KAAA,GAAQ,MAAQ,EAAA,IAAA,EAAM,KAAS,IAAA,oBAAA;AAErC,EAAA,MAAM,QAAW,GAAA,CAAA;AAAA,MAAA,EACX,IAAI;AAAA;AAAA,QAAA,EAEF,IAAI;AAAA;AAAA,QAAA,EAEJ,IAAI;AAAA,SAAA,EACH,KAAK;AAAA;AAAA,UAAA,CAAA;AAId,EAAM,MAAA,WAAA,GAAwB,CAAC,CAAC,CAAA;AAEhC,EAAO,OAAA;AAAA,IACL,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAEa,MAAA,6BAAA,GAAgC,CAAC,KAGxC,KAAA;AACJ,EAAM,MAAA,EAAE,MAAQ,EAAA,WAAA,EAAgB,GAAA,KAAA;AAChC,EAAA,MAAM,MACJ,WACA,IAAA,8FAAA;AAEF,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EAAM,MAAA,UAAA,GAAa,QAAQ,IAAQ,IAAA,WAAA;AACnC,EAAA,MAAM,EAAE,QAAA,EAAU,WAAY,EAAA,GAAI,oBAAoB,MAAM,CAAA;AAC5D,EACE,uBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,OAAA;AAAA,MACR,KAAM,EAAA,sCAAA;AAAA,MACN,WAAA,kCACI,QAGF,EAAA,6IAAA,EAAA,CAAA;AAAA,MAEF,wBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,wBAAC,IAAA,CAAA,UAAA,EAAA,EAAW,SAAQ,OAAQ,EAAA,QAAA,EAAA;AAAA,UAAA,sCAAA;AAAA,UACW,UAAA;AAAA,UAAW;AAAA,SAElD,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,GAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,IACtB,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAM,EAAA,QAAA;AAAA,YACN,QAAS,EAAA,MAAA;AAAA,YACT,eAAe,EAAA,IAAA;AAAA,YACf,kBAAoB,EAAA,WAAA;AAAA,YACpB,WAAa,EAAA,EAAE,UAAY,EAAA,SAAA,EAAW,UAAU,MAAO;AAAA;AAAA,SAE3D,EAAA,CAAA;AAAA,wBACA,GAAA,CAAC,UAAO,KAAM,EAAA,SAAA,EAAU,WAAW,IAAM,EAAA,EAAA,EAAI,KAAK,QAElD,EAAA,WAAA,EAAA;AAAA,OACF,EAAA;AAAA;AAAA,GAEJ;AAEJ;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { makeStyles, Paper, Box, Typography, Card, CardHeader, CardContent, Grid, Divider } from '@material-ui/core';
|
|
3
3
|
import { SeverityComponent } from '../SeverityComponent/SeverityComponent.esm.js';
|
|
4
4
|
import { StatusComponent } from '../StatusComponent/StatusComponent.esm.js';
|
|
@@ -52,10 +52,76 @@ const PolicyReportsDrawerComponent = ({
|
|
|
52
52
|
}) => {
|
|
53
53
|
const classes = useStyles();
|
|
54
54
|
if (!content) {
|
|
55
|
-
return /* @__PURE__ */
|
|
55
|
+
return /* @__PURE__ */ jsx(Paper, { className: classes.root, children: /* @__PURE__ */ jsx(Box, { p: 2, children: /* @__PURE__ */ jsx(Typography, { variant: "body1", color: "textSecondary", children: "No policy information available" }) }) });
|
|
56
56
|
}
|
|
57
57
|
const formattedDate = new Date(content.timestamp * 1e3).toLocaleString();
|
|
58
|
-
return /* @__PURE__ */
|
|
58
|
+
return /* @__PURE__ */ jsxs(Card, { className: classes.root, "data-testid": "policy-reports-drawer", children: [
|
|
59
|
+
/* @__PURE__ */ jsx(CardHeader, { title: "Policy Details" }),
|
|
60
|
+
/* @__PURE__ */ jsxs(CardContent, { children: [
|
|
61
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "General Information" }),
|
|
62
|
+
/* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, children: [
|
|
63
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsxs(Box, { className: classes.propertyContainer, children: [
|
|
64
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyLabel, children: "ID" }),
|
|
65
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyValue, children: content.id })
|
|
66
|
+
] }) }),
|
|
67
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsxs(Box, { className: classes.propertyContainer, children: [
|
|
68
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyLabel, children: "Name" }),
|
|
69
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyValue, children: content.name })
|
|
70
|
+
] }) }),
|
|
71
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsxs(Box, { className: classes.propertyContainer, children: [
|
|
72
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyLabel, children: "Namespace" }),
|
|
73
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyValue, children: content.namespace })
|
|
74
|
+
] }) }),
|
|
75
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsxs(Box, { className: classes.propertyContainer, children: [
|
|
76
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyLabel, children: "Kind" }),
|
|
77
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyValue, children: content.kind })
|
|
78
|
+
] }) }),
|
|
79
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsxs(Box, { className: classes.propertyContainer, children: [
|
|
80
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyLabel, children: "Resource ID" }),
|
|
81
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyValue, children: content.resourceId })
|
|
82
|
+
] }) }),
|
|
83
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsxs(Box, { className: classes.propertyContainer, children: [
|
|
84
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyLabel, children: "Timestamp" }),
|
|
85
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyValue, children: formattedDate })
|
|
86
|
+
] }) })
|
|
87
|
+
] }),
|
|
88
|
+
/* @__PURE__ */ jsx(Divider, { className: classes.divider }),
|
|
89
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Status Information" }),
|
|
90
|
+
/* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, children: [
|
|
91
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsxs(Box, { className: classes.propertyContainer, children: [
|
|
92
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyLabel, children: "Status" }),
|
|
93
|
+
/* @__PURE__ */ jsx(StatusComponent, { status: content.status })
|
|
94
|
+
] }) }),
|
|
95
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsxs(Box, { className: classes.propertyContainer, children: [
|
|
96
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyLabel, children: "Severity" }),
|
|
97
|
+
/* @__PURE__ */ jsx(SeverityComponent, { severity: content.severity })
|
|
98
|
+
] }) })
|
|
99
|
+
] }),
|
|
100
|
+
/* @__PURE__ */ jsx(Divider, { className: classes.divider }),
|
|
101
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Policy Information" }),
|
|
102
|
+
/* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, children: [
|
|
103
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsxs(Box, { className: classes.propertyContainer, children: [
|
|
104
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyLabel, children: "Policy" }),
|
|
105
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyValue, children: content.policy })
|
|
106
|
+
] }) }),
|
|
107
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsxs(Box, { className: classes.propertyContainer, children: [
|
|
108
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyLabel, children: "Rule" }),
|
|
109
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyValue, children: content.rule })
|
|
110
|
+
] }) })
|
|
111
|
+
] }),
|
|
112
|
+
/* @__PURE__ */ jsx(Divider, { className: classes.divider }),
|
|
113
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Message" }),
|
|
114
|
+
/* @__PURE__ */ jsx(Paper, { elevation: 0, className: classes.message, children: /* @__PURE__ */ jsx(Typography, { variant: "body2", children: content.message }) }),
|
|
115
|
+
content.properties && Object.keys(content.properties).length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
116
|
+
/* @__PURE__ */ jsx(Divider, { className: classes.divider }),
|
|
117
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Additional Properties" }),
|
|
118
|
+
/* @__PURE__ */ jsx(Paper, { elevation: 0, className: classes.propertiesContainer, children: Object.entries(content.properties).map(([key, value]) => /* @__PURE__ */ jsxs(Box, { className: classes.propertyItem, children: [
|
|
119
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.propertyLabel, children: key }),
|
|
120
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", children: value })
|
|
121
|
+
] }, key)) })
|
|
122
|
+
] })
|
|
123
|
+
] })
|
|
124
|
+
] });
|
|
59
125
|
};
|
|
60
126
|
|
|
61
127
|
export { PolicyReportsDrawerComponent };
|
package/dist/components/PolicyReportsDrawerComponent/PolicyReportsDrawerComponent.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolicyReportsDrawerComponent.esm.js","sources":["../../../src/components/PolicyReportsDrawerComponent/PolicyReportsDrawerComponent.tsx"],"sourcesContent":["import { ListResult } from '@kyverno/backstage-plugin-policy-reporter-common';\nimport React from 'react';\nimport {\n Card,\n CardHeader,\n CardContent,\n Typography,\n Divider,\n Grid,\n Box,\n Paper,\n makeStyles,\n} from '@material-ui/core';\nimport { SeverityComponent } from '../SeverityComponent';\nimport { StatusComponent } from '../StatusComponent';\n\ninterface PolicyReportsDrawerProps {\n content: ListResult | undefined;\n}\n\n// Material-UI styles\nconst useStyles = makeStyles(theme => ({\n root: {\n marginBottom: theme.spacing(2),\n },\n sectionTitle: {\n marginBottom: theme.spacing(1),\n fontWeight: 500,\n },\n propertyLabel: {\n color: theme.palette.text.secondary,\n fontWeight: 500,\n },\n propertyValue: {\n textAlign: 'right',\n },\n propertyContainer: {\n marginBottom: theme.spacing(1),\n display: 'flex',\n justifyContent: 'space-between',\n },\n divider: {\n margin: theme.spacing(2, 0),\n },\n message: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.grey[50],\n borderRadius: theme.shape.borderRadius,\n color: 'black',\n },\n propertiesContainer: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.grey[50],\n borderRadius: theme.shape.borderRadius,\n },\n propertyItem: {\n display: 'flex',\n justifyContent: 'space-between',\n borderBottom: `1px solid ${theme.palette.divider}`,\n padding: theme.spacing(1, 0),\n '&:last-child': {\n borderBottom: 'none',\n },\n },\n}));\n\nexport const PolicyReportsDrawerComponent = ({\n content,\n}: PolicyReportsDrawerProps) => {\n const classes = useStyles();\n\n if (!content) {\n return (\n <Paper className={classes.root}>\n <Box p={2}>\n <Typography variant=\"body1\" color=\"textSecondary\">\n No policy information available\n </Typography>\n </Box>\n </Paper>\n );\n }\n\n // Format timestamp to readable date\n const formattedDate = new Date(content.timestamp * 1000).toLocaleString();\n\n return (\n <Card className={classes.root} data-testid=\"policy-reports-drawer\">\n <CardHeader title=\"Policy Details\" />\n <CardContent>\n {/* General Information */}\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n General Information\n </Typography>\n <Grid container spacing={2}>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n ID\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.id}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Name\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.name}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Namespace\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.namespace}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Kind\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.kind}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Resource ID\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.resourceId}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Timestamp\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {formattedDate}\n </Typography>\n </Box>\n </Grid>\n </Grid>\n\n <Divider className={classes.divider} />\n\n {/* Status Information */}\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Status Information\n </Typography>\n <Grid container spacing={2}>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Status\n </Typography>\n <StatusComponent status={content.status} />\n </Box>\n </Grid>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Severity\n </Typography>\n <SeverityComponent severity={content.severity} />\n </Box>\n </Grid>\n </Grid>\n\n <Divider className={classes.divider} />\n\n {/* Policy Information */}\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Policy Information\n </Typography>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Policy\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.policy}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={12}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Rule\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.rule}\n </Typography>\n </Box>\n </Grid>\n </Grid>\n\n <Divider className={classes.divider} />\n\n {/* Message */}\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Message\n </Typography>\n <Paper elevation={0} className={classes.message}>\n <Typography variant=\"body2\">{content.message}</Typography>\n </Paper>\n\n {/* Additional Properties */}\n {content.properties && Object.keys(content.properties).length > 0 && (\n <>\n <Divider className={classes.divider} />\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Additional Properties\n </Typography>\n <Paper elevation={0} className={classes.propertiesContainer}>\n {Object.entries(content.properties).map(([key, value]) => (\n <Box key={key} className={classes.propertyItem}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n {key}\n </Typography>\n <Typography variant=\"body2\">{value}</Typography>\n </Box>\n ))}\n </Paper>\n </>\n )}\n </CardContent>\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PolicyReportsDrawerComponent.esm.js","sources":["../../../src/components/PolicyReportsDrawerComponent/PolicyReportsDrawerComponent.tsx"],"sourcesContent":["import { ListResult } from '@kyverno/backstage-plugin-policy-reporter-common';\nimport {\n Card,\n CardHeader,\n CardContent,\n Typography,\n Divider,\n Grid,\n Box,\n Paper,\n makeStyles,\n} from '@material-ui/core';\nimport { SeverityComponent } from '../SeverityComponent';\nimport { StatusComponent } from '../StatusComponent';\n\ninterface PolicyReportsDrawerProps {\n content: ListResult | undefined;\n}\n\n// Material-UI styles\nconst useStyles = makeStyles(theme => ({\n root: {\n marginBottom: theme.spacing(2),\n },\n sectionTitle: {\n marginBottom: theme.spacing(1),\n fontWeight: 500,\n },\n propertyLabel: {\n color: theme.palette.text.secondary,\n fontWeight: 500,\n },\n propertyValue: {\n textAlign: 'right',\n },\n propertyContainer: {\n marginBottom: theme.spacing(1),\n display: 'flex',\n justifyContent: 'space-between',\n },\n divider: {\n margin: theme.spacing(2, 0),\n },\n message: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.grey[50],\n borderRadius: theme.shape.borderRadius,\n color: 'black',\n },\n propertiesContainer: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.grey[50],\n borderRadius: theme.shape.borderRadius,\n },\n propertyItem: {\n display: 'flex',\n justifyContent: 'space-between',\n borderBottom: `1px solid ${theme.palette.divider}`,\n padding: theme.spacing(1, 0),\n '&:last-child': {\n borderBottom: 'none',\n },\n },\n}));\n\nexport const PolicyReportsDrawerComponent = ({\n content,\n}: PolicyReportsDrawerProps) => {\n const classes = useStyles();\n\n if (!content) {\n return (\n <Paper className={classes.root}>\n <Box p={2}>\n <Typography variant=\"body1\" color=\"textSecondary\">\n No policy information available\n </Typography>\n </Box>\n </Paper>\n );\n }\n\n // Format timestamp to readable date\n const formattedDate = new Date(content.timestamp * 1000).toLocaleString();\n\n return (\n <Card className={classes.root} data-testid=\"policy-reports-drawer\">\n <CardHeader title=\"Policy Details\" />\n <CardContent>\n {/* General Information */}\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n General Information\n </Typography>\n <Grid container spacing={2}>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n ID\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.id}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Name\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.name}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Namespace\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.namespace}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Kind\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.kind}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Resource ID\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.resourceId}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Timestamp\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {formattedDate}\n </Typography>\n </Box>\n </Grid>\n </Grid>\n\n <Divider className={classes.divider} />\n\n {/* Status Information */}\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Status Information\n </Typography>\n <Grid container spacing={2}>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Status\n </Typography>\n <StatusComponent status={content.status} />\n </Box>\n </Grid>\n <Grid item xs={12} md={6}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Severity\n </Typography>\n <SeverityComponent severity={content.severity} />\n </Box>\n </Grid>\n </Grid>\n\n <Divider className={classes.divider} />\n\n {/* Policy Information */}\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Policy Information\n </Typography>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Policy\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.policy}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={12}>\n <Box className={classes.propertyContainer}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n Rule\n </Typography>\n <Typography variant=\"body2\" className={classes.propertyValue}>\n {content.rule}\n </Typography>\n </Box>\n </Grid>\n </Grid>\n\n <Divider className={classes.divider} />\n\n {/* Message */}\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Message\n </Typography>\n <Paper elevation={0} className={classes.message}>\n <Typography variant=\"body2\">{content.message}</Typography>\n </Paper>\n\n {/* Additional Properties */}\n {content.properties && Object.keys(content.properties).length > 0 && (\n <>\n <Divider className={classes.divider} />\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Additional Properties\n </Typography>\n <Paper elevation={0} className={classes.propertiesContainer}>\n {Object.entries(content.properties).map(([key, value]) => (\n <Box key={key} className={classes.propertyItem}>\n <Typography variant=\"body2\" className={classes.propertyLabel}>\n {key}\n </Typography>\n <Typography variant=\"body2\">{value}</Typography>\n </Box>\n ))}\n </Paper>\n </>\n )}\n </CardContent>\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
|