@kyverno/backstage-plugin-policy-reporter 2.3.0 → 2.4.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @kyverno/backstage-plugin-policy-reporter
2
2
 
3
+ ## 2.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 0d6cf4b: Add Status and Severity filter to `PolicyReportsPage` component and updates the UI to now be 1 big table that by default show all failing policies
8
+
9
+ ### Patch Changes
10
+
11
+ - 0d6cf4b: Update the `PolicyReportsPage` component's exported name to match the documentation. It was previously set to `PolicyReporterPage` by mistake and has now been corrected to `PolicyReportsPage`.
12
+
3
13
  ## 2.3.0
4
14
 
5
15
  ### Minor Changes
@@ -4,6 +4,9 @@ import { useEnvironments } from '../../hooks/useEnvironments.esm.js';
4
4
  import { SelectEnvironment } from '../SelectEnvironment/SelectEnvironment.esm.js';
5
5
  import { Grid } from '@material-ui/core';
6
6
  import { PolicyReportsTable } from '../PolicyReportsTable/PolicyReportsTable.esm.js';
7
+ import { useState } from 'react';
8
+ import { SelectStatus } from '../SelectStatus/SelectStatus.esm.js';
9
+ import { SelectSeverity } from '../SelectSeverity/SelectSeverity.esm.js';
7
10
 
8
11
  const PolicyReportsPage = ({
9
12
  title = "Policy Reports",
@@ -16,57 +19,45 @@ const PolicyReportsPage = ({
16
19
  setCurrentEnvironment,
17
20
  currentEnvironment
18
21
  } = useEnvironments();
22
+ const [status, setStatus] = useState(["fail"]);
23
+ const [severity, setSeverity] = useState([]);
19
24
  if (environmentsLoading) return /* @__PURE__ */ jsx(Progress, {});
20
25
  if (environments === void 0 || !currentEnvironment) return null;
21
26
  return /* @__PURE__ */ jsxs(Page, { themeId: "tool", children: [
22
27
  /* @__PURE__ */ jsx(Header, { title, subtitle }),
23
28
  /* @__PURE__ */ jsxs(Content, { children: [
24
- /* @__PURE__ */ jsx(ContentHeader, { children: /* @__PURE__ */ jsx(
25
- SelectEnvironment,
26
- {
27
- environments,
28
- currentEnvironment,
29
- setCurrentEnvironment
30
- }
31
- ) }),
32
- /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, children: [
33
- /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
34
- PolicyReportsTable,
35
- {
36
- currentEnvironment,
37
- filter: {
38
- status: ["fail", "warn", "error"]
39
- },
40
- title: "Failing Policy Results",
41
- emptyContentText: "No failing policies",
42
- policyDocumentationUrl
43
- }
44
- ) }),
45
- /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
46
- PolicyReportsTable,
29
+ /* @__PURE__ */ jsxs(ContentHeader, { children: [
30
+ /* @__PURE__ */ jsx(SelectStatus, { currentStatus: status, setStatus }),
31
+ /* @__PURE__ */ jsx(
32
+ SelectSeverity,
47
33
  {
48
- currentEnvironment,
49
- filter: {
50
- status: ["pass"]
51
- },
52
- title: "Passing Policy Results",
53
- emptyContentText: "No passing policies",
54
- policyDocumentationUrl
34
+ currentSeverity: severity,
35
+ setSeverity
55
36
  }
56
- ) }),
57
- /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
58
- PolicyReportsTable,
37
+ ),
38
+ /* @__PURE__ */ jsx(
39
+ SelectEnvironment,
59
40
  {
41
+ environments,
60
42
  currentEnvironment,
61
- filter: {
62
- status: ["skip"]
63
- },
64
- title: "Skipped Policy Results",
65
- emptyContentText: "No skipped policies",
66
- policyDocumentationUrl
43
+ setCurrentEnvironment
67
44
  }
68
- ) })
69
- ] })
45
+ )
46
+ ] }),
47
+ /* @__PURE__ */ jsx(Grid, { container: true, spacing: 2, children: /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
48
+ PolicyReportsTable,
49
+ {
50
+ currentEnvironment,
51
+ filter: {
52
+ status,
53
+ severities: severity
54
+ },
55
+ title: "Policy Results",
56
+ emptyContentText: "No policies found",
57
+ policyDocumentationUrl,
58
+ pagination: { offset: 25 }
59
+ }
60
+ ) }) })
70
61
  ] })
71
62
  ] });
72
63
  };
@@ -1 +1 @@
1
- {"version":3,"file":"PolicyReportsPage.esm.js","sources":["../../../src/components/PolicyReportsPage/PolicyReportsPage.tsx"],"sourcesContent":["import {\n Content,\n ContentHeader,\n Header,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { useEnvironments } from '../../hooks/useEnvironments';\nimport { SelectEnvironment } from '../SelectEnvironment';\nimport { Grid } from '@material-ui/core';\nimport { PolicyReportsTable } from '../PolicyReportsTable';\n\nexport interface PolicyReportsPageProps {\n title?: string;\n policyDocumentationUrl?: string;\n subtitle?: string;\n}\n\nexport const PolicyReportsPage = ({\n title = 'Policy Reports',\n subtitle = 'View all policy reports from a Kubernetes cluster',\n policyDocumentationUrl,\n}: PolicyReportsPageProps) => {\n const {\n environments,\n environmentsLoading,\n setCurrentEnvironment,\n currentEnvironment,\n } = useEnvironments();\n\n // Fetching environments\n if (environmentsLoading) return <Progress />;\n\n // Environments missing\n if (environments === undefined || !currentEnvironment) return null; // TODO: display missing kubernetes environments\n\n return (\n <Page themeId=\"tool\">\n <Header title={title} subtitle={subtitle} />\n <Content>\n <ContentHeader>\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 status: ['fail', 'warn', 'error'],\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 status: ['pass'],\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 status: ['skip'],\n }}\n title=\"Skipped Policy Results\"\n emptyContentText=\"No skipped policies\"\n policyDocumentationUrl={policyDocumentationUrl}\n />\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAkBO,MAAM,oBAAoB,CAAC;AAAA,EAChC,KAAQ,GAAA,gBAAA;AAAA,EACR,QAAW,GAAA,mDAAA;AAAA,EACX;AACF,CAA8B,KAAA;AAC5B,EAAM,MAAA;AAAA,IACJ,YAAA;AAAA,IACA,mBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,MACE,eAAgB,EAAA;AAGpB,EAAI,IAAA,mBAAA,EAA4B,uBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,CAAA;AAG1C,EAAA,IAAI,YAAiB,KAAA,KAAA,CAAA,IAAa,CAAC,kBAAA,EAA2B,OAAA,IAAA;AAE9D,EACE,uBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,MACZ,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,MAAA,EAAA,EAAO,OAAc,QAAoB,EAAA,CAAA;AAAA,yBACzC,OACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,aACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACC,YAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA;AAAA,OAEJ,EAAA,CAAA;AAAA,sBACC,IAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,SAAS,CACvB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,kBAAA;AAAA,YACA,MAAQ,EAAA;AAAA,cACN,MAAQ,EAAA,CAAC,MAAQ,EAAA,MAAA,EAAQ,OAAO;AAAA,aAClC;AAAA,YACA,KAAM,EAAA,wBAAA;AAAA,YACN,gBAAiB,EAAA,qBAAA;AAAA,YACjB;AAAA;AAAA,SAEJ,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,kBAAA;AAAA,YACA,MAAQ,EAAA;AAAA,cACN,MAAA,EAAQ,CAAC,MAAM;AAAA,aACjB;AAAA,YACA,KAAM,EAAA,wBAAA;AAAA,YACN,gBAAiB,EAAA,qBAAA;AAAA,YACjB;AAAA;AAAA,SAEJ,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,kBAAA;AAAA,YACA,MAAQ,EAAA;AAAA,cACN,MAAA,EAAQ,CAAC,MAAM;AAAA,aACjB;AAAA,YACA,KAAM,EAAA,wBAAA;AAAA,YACN,gBAAiB,EAAA,qBAAA;AAAA,YACjB;AAAA;AAAA,SAEJ,EAAA;AAAA,OACF,EAAA;AAAA,KACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"PolicyReportsPage.esm.js","sources":["../../../src/components/PolicyReportsPage/PolicyReportsPage.tsx"],"sourcesContent":["import {\n Content,\n ContentHeader,\n Header,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { useEnvironments } from '../../hooks/useEnvironments';\nimport { SelectEnvironment } from '../SelectEnvironment';\nimport { Grid } from '@material-ui/core';\nimport { PolicyReportsTable } from '../PolicyReportsTable';\nimport { useState } from 'react';\nimport {\n Severity,\n Status,\n} from '@kyverno/backstage-plugin-policy-reporter-common';\nimport { SelectStatus } from '../SelectStatus';\nimport { SelectSeverity } from '../SelectSeverity';\n\nexport interface PolicyReportsPageProps {\n title?: string;\n policyDocumentationUrl?: string;\n subtitle?: string;\n}\n\nexport const PolicyReportsPage = ({\n title = 'Policy Reports',\n subtitle = 'View all policy reports from a Kubernetes cluster',\n policyDocumentationUrl,\n}: PolicyReportsPageProps) => {\n const {\n environments,\n environmentsLoading,\n setCurrentEnvironment,\n currentEnvironment,\n } = useEnvironments();\n\n const [status, setStatus] = useState<Status[]>(['fail']);\n const [severity, setSeverity] = useState<Severity[]>([]);\n\n // Fetching environments\n if (environmentsLoading) return <Progress />;\n\n // Environments missing\n if (environments === undefined || !currentEnvironment) return null; // TODO: display missing kubernetes environments\n\n return (\n <Page themeId=\"tool\">\n <Header title={title} subtitle={subtitle} />\n <Content>\n <ContentHeader>\n <SelectStatus currentStatus={status} setStatus={setStatus} />\n <SelectSeverity\n currentSeverity={severity}\n setSeverity={setSeverity}\n />\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 status: status,\n severities: severity,\n }}\n title=\"Policy Results\"\n emptyContentText=\"No policies found\"\n policyDocumentationUrl={policyDocumentationUrl}\n pagination={{ offset: 25 }}\n />\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAyBO,MAAM,oBAAoB,CAAC;AAAA,EAChC,KAAQ,GAAA,gBAAA;AAAA,EACR,QAAW,GAAA,mDAAA;AAAA,EACX;AACF,CAA8B,KAAA;AAC5B,EAAM,MAAA;AAAA,IACJ,YAAA;AAAA,IACA,mBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,MACE,eAAgB,EAAA;AAEpB,EAAA,MAAM,CAAC,MAAQ,EAAA,SAAS,IAAI,QAAmB,CAAA,CAAC,MAAM,CAAC,CAAA;AACvD,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,CAAI,GAAA,QAAA,CAAqB,EAAE,CAAA;AAGvD,EAAI,IAAA,mBAAA,EAA4B,uBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,CAAA;AAG1C,EAAA,IAAI,YAAiB,KAAA,KAAA,CAAA,IAAa,CAAC,kBAAA,EAA2B,OAAA,IAAA;AAE9D,EACE,uBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,MACZ,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,MAAA,EAAA,EAAO,OAAc,QAAoB,EAAA,CAAA;AAAA,yBACzC,OACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,aACC,EAAA,EAAA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,YAAA,EAAA,EAAa,aAAe,EAAA,MAAA,EAAQ,SAAsB,EAAA,CAAA;AAAA,wBAC3D,GAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,eAAiB,EAAA,QAAA;AAAA,YACjB;AAAA;AAAA,SACF;AAAA,wBACA,GAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,YAAA;AAAA,YACA,kBAAA;AAAA,YACA;AAAA;AAAA;AACF,OACF,EAAA,CAAA;AAAA,sBACA,GAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,CACvB,EAAA,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,kBAAA;AAAA,UACA,MAAQ,EAAA;AAAA,YACN,MAAA;AAAA,YACA,UAAY,EAAA;AAAA,WACd;AAAA,UACA,KAAM,EAAA,gBAAA;AAAA,UACN,gBAAiB,EAAA,mBAAA;AAAA,UACjB,sBAAA;AAAA,UACA,UAAA,EAAY,EAAE,MAAA,EAAQ,EAAG;AAAA;AAAA,SAE7B,CACF,EAAA;AAAA,KACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
@@ -15,7 +15,9 @@ const PolicyReportsTable = ({
15
15
  currentEnvironment,
16
16
  filter,
17
17
  policyDocumentationUrl,
18
- enableSearch
18
+ enableSearch,
19
+ pagination,
20
+ pageSizeOptions
19
21
  }) => {
20
22
  const useStyles = makeStyles((theme) => ({
21
23
  empty: {
@@ -98,10 +100,11 @@ const PolicyReportsTable = ({
98
100
  policies,
99
101
  policiesError,
100
102
  currentPage,
103
+ currentOffset,
101
104
  setCurrentPage,
102
105
  setCurrentOffset,
103
106
  initialLoading
104
- } = usePaginatedPolicies(currentEnvironment, mergedFilter);
107
+ } = usePaginatedPolicies(currentEnvironment, mergedFilter, pagination);
105
108
  if (policiesError) return /* @__PURE__ */ jsx(ResponseErrorPanel, { error: policiesError });
106
109
  if (initialLoading)
107
110
  return /* @__PURE__ */ jsx(
@@ -130,7 +133,9 @@ const PolicyReportsTable = ({
130
133
  options: {
131
134
  sorting: true,
132
135
  padding: "dense",
133
- search: enableSearch
136
+ search: enableSearch,
137
+ pageSize: currentOffset,
138
+ pageSizeOptions
134
139
  },
135
140
  onRowClick: (event, rowData) => {
136
141
  event?.preventDefault();
@@ -1 +1 @@
1
- {"version":3,"file":"PolicyReportsTable.esm.js","sources":["../../../src/components/PolicyReportsTable/PolicyReportsTable.tsx"],"sourcesContent":["import {\n ResponseErrorPanel,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport { useMemo, useState } from 'react';\nimport {\n Filter,\n ListResult,\n} from '@kyverno/backstage-plugin-policy-reporter-common';\nimport { Drawer, makeStyles } from '@material-ui/core';\nimport Chip from '@material-ui/core/Chip';\nimport { StatusComponent } from '../StatusComponent';\nimport { SeverityComponent } from '../SeverityComponent';\nimport Launch from '@material-ui/icons/Launch';\nimport { Environment } from '@kyverno/backstage-plugin-policy-reporter-common';\nimport { usePaginatedPolicies } from '../../hooks/usePaginatedPolicies';\nimport { PolicyReportsDrawerComponent } from '../PolicyReportsDrawerComponent/PolicyReportsDrawerComponent';\n\ninterface PolicyReportsTableProps {\n currentEnvironment: Environment;\n filter: Filter;\n title: string;\n emptyContentText: string;\n policyDocumentationUrl?: string;\n enableSearch?: boolean;\n}\n\nexport const PolicyReportsTable = ({\n title,\n emptyContentText,\n currentEnvironment,\n filter,\n policyDocumentationUrl,\n enableSearch,\n}: PolicyReportsTableProps) => {\n const useStyles = makeStyles(theme => ({\n empty: {\n padding: theme.spacing(2),\n display: 'flex',\n justifyContent: 'center',\n },\n }));\n\n const [search, setSearch] = useState<string | undefined>(undefined);\n const mergedFilter = useMemo(\n () => ({\n ...filter,\n search: search ?? filter.search, // override search if search state is defined\n }),\n [filter, search],\n );\n\n const [showDrawer, setShowDrawer] = useState<boolean>(false);\n const [drawerContent, setDrawerContent] = useState<ListResult | undefined>(\n undefined,\n );\n const classes = useStyles();\n\n const columns: TableColumn<ListResult>[] = [\n {\n title: 'name',\n field: 'name',\n },\n {\n title: 'namespace',\n field: 'namespace',\n },\n {\n title: 'kind',\n field: 'kind',\n },\n {\n title: 'policy',\n field: 'policy',\n render: (listResult: ListResult) => {\n // When policyDocumentationUrl is provided create link to the Policy section\n if (policyDocumentationUrl)\n return (\n <Chip\n label={listResult.policy}\n component=\"a\"\n target=\"_blank\"\n href={`${policyDocumentationUrl}#${listResult.policy}`}\n clickable\n icon={<Launch fontSize=\"small\" />}\n />\n );\n\n return <Chip label={listResult.policy} />;\n },\n },\n {\n title: 'rule',\n field: 'rule',\n render: (listResult: ListResult) => {\n return <Chip label={listResult.rule} />;\n },\n },\n {\n title: 'status',\n field: 'status',\n width: '30',\n render: (listResult: ListResult) => {\n return <StatusComponent status={listResult.status} />;\n },\n },\n {\n title: 'severity',\n field: 'severity',\n width: '30',\n render: (listResult: ListResult) => {\n return <SeverityComponent severity={listResult.severity} />;\n },\n },\n ];\n\n const {\n policies,\n policiesError,\n currentPage,\n setCurrentPage,\n setCurrentOffset,\n initialLoading,\n } = usePaginatedPolicies(currentEnvironment, mergedFilter);\n\n if (policiesError) return <ResponseErrorPanel error={policiesError} />;\n\n // Return loading table\n if (initialLoading)\n return (\n <Table\n options={{ paging: false, padding: 'dense' }}\n data={[]}\n columns={columns}\n isLoading\n title={title}\n />\n );\n\n return (\n <>\n <Drawer\n anchor=\"right\"\n open={showDrawer}\n onClose={() => setShowDrawer(false)}\n >\n <PolicyReportsDrawerComponent content={drawerContent} />\n </Drawer>\n <Table\n options={{\n sorting: true,\n padding: 'dense',\n search: enableSearch,\n }}\n onRowClick={(\n event?: React.MouseEvent<Element, MouseEvent>,\n rowData?: ListResult,\n ) => {\n event?.preventDefault();\n setShowDrawer(true);\n setDrawerContent(rowData);\n }}\n data={policies?.items ?? []}\n columns={columns}\n title={title}\n totalCount={policies?.count}\n page={currentPage}\n onRowsPerPageChange={page => setCurrentOffset(page)}\n onPageChange={page => setCurrentPage(page)}\n emptyContent={<div className={classes.empty}>{emptyContentText}</div>}\n onSearchChange={searchText => setSearch(searchText)}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PolicyReportsTable.esm.js","sources":["../../../src/components/PolicyReportsTable/PolicyReportsTable.tsx"],"sourcesContent":["import {\n ResponseErrorPanel,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport { useMemo, useState } from 'react';\nimport {\n Filter,\n ListResult,\n Pagination,\n} from '@kyverno/backstage-plugin-policy-reporter-common';\nimport { Drawer, makeStyles } from '@material-ui/core';\nimport Chip from '@material-ui/core/Chip';\nimport { StatusComponent } from '../StatusComponent';\nimport { SeverityComponent } from '../SeverityComponent';\nimport Launch from '@material-ui/icons/Launch';\nimport { Environment } from '@kyverno/backstage-plugin-policy-reporter-common';\nimport { usePaginatedPolicies } from '../../hooks/usePaginatedPolicies';\nimport { PolicyReportsDrawerComponent } from '../PolicyReportsDrawerComponent/PolicyReportsDrawerComponent';\n\ninterface PolicyReportsTableProps {\n currentEnvironment: Environment;\n filter: Filter;\n title: string;\n emptyContentText: string;\n policyDocumentationUrl?: string;\n enableSearch?: boolean;\n pagination?: Partial<Pagination>;\n pageSizeOptions?: number[];\n}\n\nexport const PolicyReportsTable = ({\n title,\n emptyContentText,\n currentEnvironment,\n filter,\n policyDocumentationUrl,\n enableSearch,\n pagination,\n pageSizeOptions,\n}: PolicyReportsTableProps) => {\n const useStyles = makeStyles(theme => ({\n empty: {\n padding: theme.spacing(2),\n display: 'flex',\n justifyContent: 'center',\n },\n }));\n\n const [search, setSearch] = useState<string | undefined>(undefined);\n const mergedFilter = useMemo(\n () => ({\n ...filter,\n search: search ?? filter.search, // override search if search state is defined\n }),\n [filter, search],\n );\n\n const [showDrawer, setShowDrawer] = useState<boolean>(false);\n const [drawerContent, setDrawerContent] = useState<ListResult | undefined>(\n undefined,\n );\n const classes = useStyles();\n\n const columns: TableColumn<ListResult>[] = [\n {\n title: 'name',\n field: 'name',\n },\n {\n title: 'namespace',\n field: 'namespace',\n },\n {\n title: 'kind',\n field: 'kind',\n },\n {\n title: 'policy',\n field: 'policy',\n render: (listResult: ListResult) => {\n // When policyDocumentationUrl is provided create link to the Policy section\n if (policyDocumentationUrl)\n return (\n <Chip\n label={listResult.policy}\n component=\"a\"\n target=\"_blank\"\n href={`${policyDocumentationUrl}#${listResult.policy}`}\n clickable\n icon={<Launch fontSize=\"small\" />}\n />\n );\n\n return <Chip label={listResult.policy} />;\n },\n },\n {\n title: 'rule',\n field: 'rule',\n render: (listResult: ListResult) => {\n return <Chip label={listResult.rule} />;\n },\n },\n {\n title: 'status',\n field: 'status',\n width: '30',\n render: (listResult: ListResult) => {\n return <StatusComponent status={listResult.status} />;\n },\n },\n {\n title: 'severity',\n field: 'severity',\n width: '30',\n render: (listResult: ListResult) => {\n return <SeverityComponent severity={listResult.severity} />;\n },\n },\n ];\n\n const {\n policies,\n policiesError,\n currentPage,\n currentOffset,\n setCurrentPage,\n setCurrentOffset,\n initialLoading,\n } = usePaginatedPolicies(currentEnvironment, mergedFilter, pagination);\n\n if (policiesError) return <ResponseErrorPanel error={policiesError} />;\n\n // Return loading table\n if (initialLoading)\n return (\n <Table\n options={{ paging: false, padding: 'dense' }}\n data={[]}\n columns={columns}\n isLoading\n title={title}\n />\n );\n\n return (\n <>\n <Drawer\n anchor=\"right\"\n open={showDrawer}\n onClose={() => setShowDrawer(false)}\n >\n <PolicyReportsDrawerComponent content={drawerContent} />\n </Drawer>\n <Table\n options={{\n sorting: true,\n padding: 'dense',\n search: enableSearch,\n pageSize: currentOffset,\n pageSizeOptions: pageSizeOptions,\n }}\n onRowClick={(\n event?: React.MouseEvent<Element, MouseEvent>,\n rowData?: ListResult,\n ) => {\n event?.preventDefault();\n setShowDrawer(true);\n setDrawerContent(rowData);\n }}\n data={policies?.items ?? []}\n columns={columns}\n title={title}\n totalCount={policies?.count}\n page={currentPage}\n onRowsPerPageChange={page => setCurrentOffset(page)}\n onPageChange={page => setCurrentPage(page)}\n emptyContent={<div className={classes.empty}>{emptyContentText}</div>}\n onSearchChange={searchText => setSearch(searchText)}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import MenuItem from '@material-ui/core/MenuItem';
3
+ import InputLabel from '@material-ui/core/InputLabel';
4
+ import FormControl from '@material-ui/core/FormControl';
5
+ import Select from '@material-ui/core/Select';
6
+ import { makeStyles } from '@material-ui/core/styles';
7
+ import { Checkbox, ListItemText } from '@material-ui/core';
8
+
9
+ const SEVERITY_VALUES = [
10
+ "unknown",
11
+ "low",
12
+ "medium",
13
+ "high",
14
+ "critical",
15
+ "info"
16
+ ];
17
+ const useStyles = makeStyles({
18
+ formControl: {
19
+ margin: 8,
20
+ minWidth: 150
21
+ }
22
+ });
23
+ const SelectSeverity = ({
24
+ currentSeverity,
25
+ setSeverity
26
+ }) => {
27
+ const classes = useStyles();
28
+ const handleChange = (event) => {
29
+ setSeverity(event.target.value);
30
+ };
31
+ return /* @__PURE__ */ jsxs(FormControl, { className: classes.formControl, children: [
32
+ /* @__PURE__ */ jsx(InputLabel, { id: "select-severity-label", shrink: true, children: "Severity" }),
33
+ /* @__PURE__ */ jsx(
34
+ Select,
35
+ {
36
+ labelId: "select-severity-label",
37
+ id: "select-severity",
38
+ multiple: true,
39
+ displayEmpty: true,
40
+ value: currentSeverity,
41
+ renderValue: (selected) => {
42
+ if (selected.length === 0) {
43
+ return "All";
44
+ }
45
+ return selected.join(", ");
46
+ },
47
+ onChange: handleChange,
48
+ children: SEVERITY_VALUES.map((severity) => /* @__PURE__ */ jsxs(MenuItem, { value: severity, children: [
49
+ /* @__PURE__ */ jsx(Checkbox, { checked: currentSeverity.includes(severity) }),
50
+ /* @__PURE__ */ jsx(ListItemText, { primary: severity })
51
+ ] }, severity))
52
+ }
53
+ )
54
+ ] });
55
+ };
56
+
57
+ export { SelectSeverity };
58
+ //# sourceMappingURL=SelectSeverity.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectSeverity.esm.js","sources":["../../../src/components/SelectSeverity/SelectSeverity.tsx"],"sourcesContent":["import MenuItem from '@material-ui/core/MenuItem';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport { Severity } from '@kyverno/backstage-plugin-policy-reporter-common';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Checkbox, ListItemText } from '@material-ui/core';\n\n// This could be moved into the common package if needed in multiple places\nconst SEVERITY_VALUES: Severity[] = [\n 'unknown',\n 'low',\n 'medium',\n 'high',\n 'critical',\n 'info',\n];\n\nconst useStyles = makeStyles({\n formControl: {\n margin: 8,\n minWidth: 150,\n },\n});\n\nexport type SelectSeverityProps = {\n currentSeverity: Severity[];\n setSeverity: (Status: Severity[]) => void;\n};\n\nexport const SelectSeverity = ({\n currentSeverity: currentSeverity,\n setSeverity: setSeverity,\n}: SelectSeverityProps) => {\n const classes = useStyles();\n\n const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n setSeverity(event.target.value as Severity[]);\n };\n\n return (\n <FormControl className={classes.formControl}>\n <InputLabel id=\"select-severity-label\" shrink>\n Severity\n </InputLabel>\n <Select\n labelId=\"select-severity-label\"\n id=\"select-severity\"\n multiple\n displayEmpty\n value={currentSeverity}\n renderValue={selected => {\n if ((selected as Severity[]).length === 0) {\n return 'All';\n }\n\n return (selected as Severity[]).join(', ');\n }}\n onChange={handleChange}\n >\n {SEVERITY_VALUES.map(severity => (\n <MenuItem key={severity} value={severity}>\n <Checkbox checked={currentSeverity.includes(severity)} />\n <ListItemText primary={severity} />\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AASA,MAAM,eAA8B,GAAA;AAAA,EAClC,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AAEA,MAAM,YAAY,UAAW,CAAA;AAAA,EAC3B,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,CAAA;AAAA,IACR,QAAU,EAAA;AAAA;AAEd,CAAC,CAAA;AAOM,MAAM,iBAAiB,CAAC;AAAA,EAC7B,eAAA;AAAA,EACA;AACF,CAA2B,KAAA;AACzB,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EAAM,MAAA,YAAA,GAAe,CAAC,KAAiD,KAAA;AACrE,IAAY,WAAA,CAAA,KAAA,CAAM,OAAO,KAAmB,CAAA;AAAA,GAC9C;AAEA,EAAA,uBACG,IAAA,CAAA,WAAA,EAAA,EAAY,SAAW,EAAA,OAAA,CAAQ,WAC9B,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,EAAA,EAAG,uBAAwB,EAAA,MAAA,EAAM,MAAC,QAE9C,EAAA,UAAA,EAAA,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,uBAAA;AAAA,QACR,EAAG,EAAA,iBAAA;AAAA,QACH,QAAQ,EAAA,IAAA;AAAA,QACR,YAAY,EAAA,IAAA;AAAA,QACZ,KAAO,EAAA,eAAA;AAAA,QACP,aAAa,CAAY,QAAA,KAAA;AACvB,UAAK,IAAA,QAAA,CAAwB,WAAW,CAAG,EAAA;AACzC,YAAO,OAAA,KAAA;AAAA;AAGT,UAAQ,OAAA,QAAA,CAAwB,KAAK,IAAI,CAAA;AAAA,SAC3C;AAAA,QACA,QAAU,EAAA,YAAA;AAAA,QAET,0BAAgB,GAAI,CAAA,CAAA,QAAA,qBAClB,IAAA,CAAA,QAAA,EAAA,EAAwB,OAAO,QAC9B,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAS,EAAA,EAAA,OAAA,EAAS,eAAgB,CAAA,QAAA,CAAS,QAAQ,CAAG,EAAA,CAAA;AAAA,0BACvD,GAAA,CAAC,YAAa,EAAA,EAAA,OAAA,EAAS,QAAU,EAAA;AAAA,SAAA,EAAA,EAFpB,QAGf,CACD;AAAA;AAAA;AACH,GACF,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,58 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import MenuItem from '@material-ui/core/MenuItem';
3
+ import InputLabel from '@material-ui/core/InputLabel';
4
+ import FormControl from '@material-ui/core/FormControl';
5
+ import Select from '@material-ui/core/Select';
6
+ import { makeStyles } from '@material-ui/core/styles';
7
+ import { Checkbox, ListItemText } from '@material-ui/core';
8
+
9
+ const STATUS_VALUES = [
10
+ "fail",
11
+ "skip",
12
+ "pass",
13
+ "warn",
14
+ "error",
15
+ "summary"
16
+ ];
17
+ const useStyles = makeStyles({
18
+ formControl: {
19
+ margin: 8,
20
+ minWidth: 150
21
+ }
22
+ });
23
+ const SelectStatus = ({
24
+ currentStatus,
25
+ setStatus
26
+ }) => {
27
+ const classes = useStyles();
28
+ const handleChange = (event) => {
29
+ setStatus(event.target.value);
30
+ };
31
+ return /* @__PURE__ */ jsxs(FormControl, { className: classes.formControl, children: [
32
+ /* @__PURE__ */ jsx(InputLabel, { id: "select-status-label", shrink: true, children: "Status" }),
33
+ /* @__PURE__ */ jsx(
34
+ Select,
35
+ {
36
+ labelId: "select-status-label",
37
+ id: "select-status",
38
+ multiple: true,
39
+ displayEmpty: true,
40
+ value: currentStatus,
41
+ renderValue: (selected) => {
42
+ if (selected.length === 0) {
43
+ return "All";
44
+ }
45
+ return selected.join(", ");
46
+ },
47
+ onChange: handleChange,
48
+ children: STATUS_VALUES.map((status) => /* @__PURE__ */ jsxs(MenuItem, { value: status, children: [
49
+ /* @__PURE__ */ jsx(Checkbox, { checked: currentStatus.includes(status) }),
50
+ /* @__PURE__ */ jsx(ListItemText, { primary: status })
51
+ ] }, status))
52
+ }
53
+ )
54
+ ] });
55
+ };
56
+
57
+ export { SelectStatus };
58
+ //# sourceMappingURL=SelectStatus.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectStatus.esm.js","sources":["../../../src/components/SelectStatus/SelectStatus.tsx"],"sourcesContent":["import MenuItem from '@material-ui/core/MenuItem';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport { Status } from '@kyverno/backstage-plugin-policy-reporter-common';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Checkbox, ListItemText } from '@material-ui/core';\n\n// This could be moved into the common package if needed in multiple places\nconst STATUS_VALUES: Status[] = [\n 'fail',\n 'skip',\n 'pass',\n 'warn',\n 'error',\n 'summary',\n];\n\nconst useStyles = makeStyles({\n formControl: {\n margin: 8,\n minWidth: 150,\n },\n});\n\nexport type SelectStatusProps = {\n currentStatus: Status[];\n setStatus: (Status: Status[]) => void;\n};\n\nexport const SelectStatus = ({\n currentStatus,\n setStatus,\n}: SelectStatusProps) => {\n const classes = useStyles();\n\n const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n setStatus(event.target.value as Status[]);\n };\n\n return (\n <FormControl className={classes.formControl}>\n <InputLabel id=\"select-status-label\" shrink>\n Status\n </InputLabel>\n <Select\n labelId=\"select-status-label\"\n id=\"select-status\"\n multiple\n displayEmpty\n value={currentStatus}\n renderValue={selected => {\n if ((selected as Status[]).length === 0) {\n return 'All';\n }\n\n return (selected as Status[]).join(', ');\n }}\n onChange={handleChange}\n >\n {STATUS_VALUES.map(status => (\n <MenuItem key={status} value={status}>\n <Checkbox checked={currentStatus.includes(status)} />\n <ListItemText primary={status} />\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AASA,MAAM,aAA0B,GAAA;AAAA,EAC9B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA;AAEA,MAAM,YAAY,UAAW,CAAA;AAAA,EAC3B,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,CAAA;AAAA,IACR,QAAU,EAAA;AAAA;AAEd,CAAC,CAAA;AAOM,MAAM,eAAe,CAAC;AAAA,EAC3B,aAAA;AAAA,EACA;AACF,CAAyB,KAAA;AACvB,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EAAM,MAAA,YAAA,GAAe,CAAC,KAAiD,KAAA;AACrE,IAAU,SAAA,CAAA,KAAA,CAAM,OAAO,KAAiB,CAAA;AAAA,GAC1C;AAEA,EAAA,uBACG,IAAA,CAAA,WAAA,EAAA,EAAY,SAAW,EAAA,OAAA,CAAQ,WAC9B,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,EAAA,EAAG,qBAAsB,EAAA,MAAA,EAAM,MAAC,QAE5C,EAAA,QAAA,EAAA,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,qBAAA;AAAA,QACR,EAAG,EAAA,eAAA;AAAA,QACH,QAAQ,EAAA,IAAA;AAAA,QACR,YAAY,EAAA,IAAA;AAAA,QACZ,KAAO,EAAA,aAAA;AAAA,QACP,aAAa,CAAY,QAAA,KAAA;AACvB,UAAK,IAAA,QAAA,CAAsB,WAAW,CAAG,EAAA;AACvC,YAAO,OAAA,KAAA;AAAA;AAGT,UAAQ,OAAA,QAAA,CAAsB,KAAK,IAAI,CAAA;AAAA,SACzC;AAAA,QACA,QAAU,EAAA,YAAA;AAAA,QAET,wBAAc,GAAI,CAAA,CAAA,MAAA,qBAChB,IAAA,CAAA,QAAA,EAAA,EAAsB,OAAO,MAC5B,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAS,EAAA,EAAA,OAAA,EAAS,aAAc,CAAA,QAAA,CAAS,MAAM,CAAG,EAAA,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAa,EAAA,EAAA,OAAA,EAAS,MAAQ,EAAA;AAAA,SAAA,EAAA,EAFlB,MAGf,CACD;AAAA;AAAA;AACH,GACF,EAAA,CAAA;AAEJ;;;;"}
@@ -5,10 +5,14 @@ import { useState, useEffect } from 'react';
5
5
 
6
6
  const DEFAULT_OFFSET = 5;
7
7
  const DEFAULT_PAGE = 0;
8
- const usePaginatedPolicies = (currentEnvironment, filter) => {
8
+ const usePaginatedPolicies = (currentEnvironment, filter, pagination) => {
9
9
  const policyReporterApi = useApi(policyReporterApiRef);
10
- const [currentPage, setCurrentPage] = useState(DEFAULT_PAGE);
11
- const [currentOffset, setCurrentOffset] = useState(DEFAULT_OFFSET);
10
+ const [currentPage, setCurrentPage] = useState(
11
+ pagination?.page ?? DEFAULT_PAGE
12
+ );
13
+ const [currentOffset, setCurrentOffset] = useState(
14
+ pagination?.offset ?? DEFAULT_OFFSET
15
+ );
12
16
  const [initialLoading, setInitialLoading] = useState(true);
13
17
  useEffect(() => {
14
18
  setInitialLoading(true);
@@ -1 +1 @@
1
- {"version":3,"file":"usePaginatedPolicies.esm.js","sources":["../../src/hooks/usePaginatedPolicies.ts"],"sourcesContent":["import { useAsync } from 'react-use';\nimport { Environment } from '@kyverno/backstage-plugin-policy-reporter-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { policyReporterApiRef } from '../api';\nimport {\n Filter,\n ResultList,\n} from '@kyverno/backstage-plugin-policy-reporter-common';\nimport { useEffect, useState } from 'react';\n\nconst DEFAULT_OFFSET = 5;\nconst DEFAULT_PAGE = 0;\n\nexport const usePaginatedPolicies = (\n currentEnvironment: Environment,\n filter: Filter,\n) => {\n const policyReporterApi = useApi(policyReporterApiRef);\n const [currentPage, setCurrentPage] = useState<number>(DEFAULT_PAGE);\n const [currentOffset, setCurrentOffset] = useState<number>(DEFAULT_OFFSET);\n const [initialLoading, setInitialLoading] = useState<boolean>(true);\n\n useEffect(() => {\n setInitialLoading(true);\n }, [currentEnvironment]);\n\n const {\n value: policies,\n loading: policiesLoading,\n error: policiesError,\n } = useAsync(async (): Promise<ResultList> => {\n const data = await policyReporterApi.namespacedResults(\n currentEnvironment.entityRef,\n filter,\n {\n // Material UI expects the first page to be 0. But the Policy Reporter API expects the first page to be 1\n // This increments the currentPage with 1 to match the expected page by the Policy Reporter API\n page: currentPage + 1,\n offset: currentOffset,\n },\n );\n setInitialLoading(false);\n return data;\n }, [currentEnvironment, filter, currentPage, currentOffset]);\n\n return {\n policies,\n policiesLoading,\n policiesError,\n currentPage,\n setCurrentPage,\n currentOffset,\n setCurrentOffset,\n initialLoading,\n };\n};\n"],"names":[],"mappings":";;;;;AAUA,MAAM,cAAiB,GAAA,CAAA;AACvB,MAAM,YAAe,GAAA,CAAA;AAER,MAAA,oBAAA,GAAuB,CAClC,kBAAA,EACA,MACG,KAAA;AACH,EAAM,MAAA,iBAAA,GAAoB,OAAO,oBAAoB,CAAA;AACrD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAiB,YAAY,CAAA;AACnE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAiB,cAAc,CAAA;AACzE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAkB,IAAI,CAAA;AAElE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,GACxB,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAEvB,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,QAAA;AAAA,IACP,OAAS,EAAA,eAAA;AAAA,IACT,KAAO,EAAA;AAAA,GACT,GAAI,SAAS,YAAiC;AAC5C,IAAM,MAAA,IAAA,GAAO,MAAM,iBAAkB,CAAA,iBAAA;AAAA,MACnC,kBAAmB,CAAA,SAAA;AAAA,MACnB,MAAA;AAAA,MACA;AAAA;AAAA;AAAA,QAGE,MAAM,WAAc,GAAA,CAAA;AAAA,QACpB,MAAQ,EAAA;AAAA;AACV,KACF;AACA,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAO,OAAA,IAAA;AAAA,KACN,CAAC,kBAAA,EAAoB,MAAQ,EAAA,WAAA,EAAa,aAAa,CAAC,CAAA;AAE3D,EAAO,OAAA;AAAA,IACL,QAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"usePaginatedPolicies.esm.js","sources":["../../src/hooks/usePaginatedPolicies.ts"],"sourcesContent":["import { useAsync } from 'react-use';\nimport {\n Environment,\n Pagination,\n} from '@kyverno/backstage-plugin-policy-reporter-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { policyReporterApiRef } from '../api';\nimport {\n Filter,\n ResultList,\n} from '@kyverno/backstage-plugin-policy-reporter-common';\nimport { useEffect, useState } from 'react';\n\nconst DEFAULT_OFFSET = 5;\nconst DEFAULT_PAGE = 0;\n\nexport const usePaginatedPolicies = (\n currentEnvironment: Environment,\n filter: Filter,\n pagination?: Partial<Pagination>,\n) => {\n const policyReporterApi = useApi(policyReporterApiRef);\n const [currentPage, setCurrentPage] = useState<number>(\n pagination?.page ?? DEFAULT_PAGE,\n );\n const [currentOffset, setCurrentOffset] = useState<number>(\n pagination?.offset ?? DEFAULT_OFFSET,\n );\n const [initialLoading, setInitialLoading] = useState<boolean>(true);\n\n useEffect(() => {\n setInitialLoading(true);\n }, [currentEnvironment]);\n\n const {\n value: policies,\n loading: policiesLoading,\n error: policiesError,\n } = useAsync(async (): Promise<ResultList> => {\n const data = await policyReporterApi.namespacedResults(\n currentEnvironment.entityRef,\n filter,\n {\n // Material UI expects the first page to be 0. But the Policy Reporter API expects the first page to be 1\n // This increments the currentPage with 1 to match the expected page by the Policy Reporter API\n page: currentPage + 1,\n offset: currentOffset,\n },\n );\n setInitialLoading(false);\n return data;\n }, [currentEnvironment, filter, currentPage, currentOffset]);\n\n return {\n policies,\n policiesLoading,\n policiesError,\n currentPage,\n setCurrentPage,\n currentOffset,\n setCurrentOffset,\n initialLoading,\n };\n};\n"],"names":[],"mappings":";;;;;AAaA,MAAM,cAAiB,GAAA,CAAA;AACvB,MAAM,YAAe,GAAA,CAAA;AAEd,MAAM,oBAAuB,GAAA,CAClC,kBACA,EAAA,MAAA,EACA,UACG,KAAA;AACH,EAAM,MAAA,iBAAA,GAAoB,OAAO,oBAAoB,CAAA;AACrD,EAAM,MAAA,CAAC,WAAa,EAAA,cAAc,CAAI,GAAA,QAAA;AAAA,IACpC,YAAY,IAAQ,IAAA;AAAA,GACtB;AACA,EAAM,MAAA,CAAC,aAAe,EAAA,gBAAgB,CAAI,GAAA,QAAA;AAAA,IACxC,YAAY,MAAU,IAAA;AAAA,GACxB;AACA,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAkB,IAAI,CAAA;AAElE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,GACxB,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAEvB,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,QAAA;AAAA,IACP,OAAS,EAAA,eAAA;AAAA,IACT,KAAO,EAAA;AAAA,GACT,GAAI,SAAS,YAAiC;AAC5C,IAAM,MAAA,IAAA,GAAO,MAAM,iBAAkB,CAAA,iBAAA;AAAA,MACnC,kBAAmB,CAAA,SAAA;AAAA,MACnB,MAAA;AAAA,MACA;AAAA;AAAA;AAAA,QAGE,MAAM,WAAc,GAAA,CAAA;AAAA,QACpB,MAAQ,EAAA;AAAA;AACV,KACF;AACA,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAO,OAAA,IAAA;AAAA,KACN,CAAC,kBAAA,EAAoB,MAAQ,EAAA,WAAA,EAAa,aAAa,CAAC,CAAA;AAE3D,EAAO,OAAA;AAAA,IACL,QAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
package/dist/index.d.ts CHANGED
@@ -18,6 +18,6 @@ declare const EntityCustomPoliciesContent: ({ annotationsDocumentationUrl, polic
18
18
  sources: string[];
19
19
  title: string;
20
20
  }) => react_jsx_runtime.JSX.Element;
21
- declare const PolicyReporterPage: ({ title, subtitle, policyDocumentationUrl, }: PolicyReportsPageProps) => react_jsx_runtime.JSX.Element | null;
21
+ declare const PolicyReportsPage: ({ title, subtitle, policyDocumentationUrl, }: PolicyReportsPageProps) => react_jsx_runtime.JSX.Element | null;
22
22
 
23
- export { EntityCustomPoliciesContent, EntityKyvernoPoliciesContent, PolicyReporterPage, policyReporterPlugin };
23
+ export { EntityCustomPoliciesContent, EntityKyvernoPoliciesContent, PolicyReportsPage, policyReporterPlugin };
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- export { EntityCustomPoliciesContent, EntityKyvernoPoliciesContent, PolicyReporterPage, policyReporterPlugin } from './plugin.esm.js';
1
+ export { EntityCustomPoliciesContent, EntityKyvernoPoliciesContent, PolicyReportsPage, policyReporterPlugin } from './plugin.esm.js';
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -31,13 +31,13 @@ const EntityCustomPoliciesContent = policyReporterPlugin.provide(
31
31
  mountPoint: rootRouteRef
32
32
  })
33
33
  );
34
- const PolicyReporterPage = policyReporterPlugin.provide(
34
+ const PolicyReportsPage = policyReporterPlugin.provide(
35
35
  createRoutableExtension({
36
- name: "PolicyReporterPage",
36
+ name: "PolicyReportsPage",
37
37
  component: () => import('./components/PolicyReportsPage/index.esm.js').then((m) => m.PolicyReportsPage),
38
38
  mountPoint: rootRouteRef
39
39
  })
40
40
  );
41
41
 
42
- export { EntityCustomPoliciesContent, EntityKyvernoPoliciesContent, PolicyReporterPage, policyReporterPlugin };
42
+ export { EntityCustomPoliciesContent, EntityKyvernoPoliciesContent, PolicyReportsPage, policyReporterPlugin };
43
43
  //# sourceMappingURL=plugin.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport { policyReporterApiRef } from './api/PolicyReporterApi';\nimport { PolicyReporterApiClient } from './api/PolicyReporterClient';\n\nimport { rootRouteRef } from './routes';\n\nexport const policyReporterPlugin = createPlugin({\n id: 'policy-reporter',\n apis: [\n createApiFactory({\n api: policyReporterApiRef,\n deps: { fetchApi: fetchApiRef, discoveryApi: discoveryApiRef },\n factory: ({ discoveryApi, fetchApi }) =>\n new PolicyReporterApiClient({ discoveryApi, fetchApi }),\n }),\n ],\n});\n\nexport const EntityKyvernoPoliciesContent = policyReporterPlugin.provide(\n createRoutableExtension({\n name: 'EntityKyvernoPoliciesContent',\n component: () =>\n import('./components/EntityKyvernoPoliciesContent').then(\n m => m.EntityKyvernoPoliciesContent,\n ),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityCustomPoliciesContent = policyReporterPlugin.provide(\n createRoutableExtension({\n name: 'EntityCustomPoliciesContent',\n component: () =>\n import('./components/EntityCustomPoliciesContent').then(\n m => m.EntityCustomPoliciesContent,\n ),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const PolicyReporterPage = policyReporterPlugin.provide(\n createRoutableExtension({\n name: 'PolicyReporterPage',\n component: () =>\n import('./components/PolicyReportsPage').then(m => m.PolicyReportsPage),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;AAYO,MAAM,uBAAuB,YAAa,CAAA;AAAA,EAC/C,EAAI,EAAA,iBAAA;AAAA,EACJ,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,oBAAA;AAAA,MACL,IAAM,EAAA,EAAE,QAAU,EAAA,WAAA,EAAa,cAAc,eAAgB,EAAA;AAAA,MAC7D,OAAA,EAAS,CAAC,EAAE,YAAc,EAAA,QAAA,EACxB,KAAA,IAAI,uBAAwB,CAAA,EAAE,YAAc,EAAA,QAAA,EAAU;AAAA,KACzD;AAAA;AAEL,CAAC;AAEM,MAAM,+BAA+B,oBAAqB,CAAA,OAAA;AAAA,EAC/D,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,8BAAA;AAAA,IACN,SAAW,EAAA,MACT,OAAO,wDAA2C,CAAE,CAAA,IAAA;AAAA,MAClD,OAAK,CAAE,CAAA;AAAA,KACT;AAAA,IACF,UAAY,EAAA;AAAA,GACb;AACH;AAEO,MAAM,8BAA8B,oBAAqB,CAAA,OAAA;AAAA,EAC9D,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,6BAAA;AAAA,IACN,SAAW,EAAA,MACT,OAAO,uDAA0C,CAAE,CAAA,IAAA;AAAA,MACjD,OAAK,CAAE,CAAA;AAAA,KACT;AAAA,IACF,UAAY,EAAA;AAAA,GACb;AACH;AAEO,MAAM,qBAAqB,oBAAqB,CAAA,OAAA;AAAA,EACrD,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,oBAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,6CAAgC,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,iBAAiB,CAAA;AAAA,IACxE,UAAY,EAAA;AAAA,GACb;AACH;;;;"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport { policyReporterApiRef } from './api/PolicyReporterApi';\nimport { PolicyReporterApiClient } from './api/PolicyReporterClient';\n\nimport { rootRouteRef } from './routes';\n\nexport const policyReporterPlugin = createPlugin({\n id: 'policy-reporter',\n apis: [\n createApiFactory({\n api: policyReporterApiRef,\n deps: { fetchApi: fetchApiRef, discoveryApi: discoveryApiRef },\n factory: ({ discoveryApi, fetchApi }) =>\n new PolicyReporterApiClient({ discoveryApi, fetchApi }),\n }),\n ],\n});\n\nexport const EntityKyvernoPoliciesContent = policyReporterPlugin.provide(\n createRoutableExtension({\n name: 'EntityKyvernoPoliciesContent',\n component: () =>\n import('./components/EntityKyvernoPoliciesContent').then(\n m => m.EntityKyvernoPoliciesContent,\n ),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityCustomPoliciesContent = policyReporterPlugin.provide(\n createRoutableExtension({\n name: 'EntityCustomPoliciesContent',\n component: () =>\n import('./components/EntityCustomPoliciesContent').then(\n m => m.EntityCustomPoliciesContent,\n ),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const PolicyReportsPage = policyReporterPlugin.provide(\n createRoutableExtension({\n name: 'PolicyReportsPage',\n component: () =>\n import('./components/PolicyReportsPage').then(m => m.PolicyReportsPage),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;AAYO,MAAM,uBAAuB,YAAa,CAAA;AAAA,EAC/C,EAAI,EAAA,iBAAA;AAAA,EACJ,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,oBAAA;AAAA,MACL,IAAM,EAAA,EAAE,QAAU,EAAA,WAAA,EAAa,cAAc,eAAgB,EAAA;AAAA,MAC7D,OAAA,EAAS,CAAC,EAAE,YAAc,EAAA,QAAA,EACxB,KAAA,IAAI,uBAAwB,CAAA,EAAE,YAAc,EAAA,QAAA,EAAU;AAAA,KACzD;AAAA;AAEL,CAAC;AAEM,MAAM,+BAA+B,oBAAqB,CAAA,OAAA;AAAA,EAC/D,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,8BAAA;AAAA,IACN,SAAW,EAAA,MACT,OAAO,wDAA2C,CAAE,CAAA,IAAA;AAAA,MAClD,OAAK,CAAE,CAAA;AAAA,KACT;AAAA,IACF,UAAY,EAAA;AAAA,GACb;AACH;AAEO,MAAM,8BAA8B,oBAAqB,CAAA,OAAA;AAAA,EAC9D,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,6BAAA;AAAA,IACN,SAAW,EAAA,MACT,OAAO,uDAA0C,CAAE,CAAA,IAAA;AAAA,MACjD,OAAK,CAAE,CAAA;AAAA,KACT;AAAA,IACF,UAAY,EAAA;AAAA,GACb;AACH;AAEO,MAAM,oBAAoB,oBAAqB,CAAA,OAAA;AAAA,EACpD,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,mBAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,6CAAgC,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,iBAAiB,CAAA;AAAA,IACxE,UAAY,EAAA;AAAA,GACb;AACH;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kyverno/backstage-plugin-policy-reporter",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "main": "dist/index.esm.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",