@backstage-community/plugin-tech-insights 0.3.31 → 0.3.33

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,19 @@
1
1
  # @backstage-community/plugin-tech-insights
2
2
 
3
+ ## 0.3.33
4
+
5
+ ### Patch Changes
6
+
7
+ - 00d148d: Backstage version bump to v1.30.2
8
+ - Updated dependencies [00d148d]
9
+ - @backstage-community/plugin-tech-insights-common@0.2.16
10
+
11
+ ## 0.3.32
12
+
13
+ ### Patch Changes
14
+
15
+ - 83a5e80: Refactor `ScorecardInfo` to accordion to display categories and fail counts.
16
+
3
17
  ## 0.3.31
4
18
 
5
19
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"TechInsightsApi.esm.js","sources":["../../src/api/TechInsightsApi.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createApiRef } from '@backstage/core-plugin-api';\nimport {\n CheckResult,\n BulkCheckResponse,\n FactSchema,\n} from '@backstage-community/plugin-tech-insights-common';\nimport { Check, InsightFacts } from './types';\nimport { CheckResultRenderer } from '../components/CheckResultRenderer';\nimport { CompoundEntityRef } from '@backstage/catalog-model';\n\n/**\n * {@link @backstage/core-plugin-api#ApiRef} for the {@link TechInsightsApi}\n *\n * @public\n */\nexport const techInsightsApiRef = createApiRef<TechInsightsApi>({\n id: 'plugin.techinsights.service',\n});\n\n/**\n * API client interface for the Tech Insights plugin\n *\n * @public\n */\nexport interface TechInsightsApi {\n getCheckResultRenderers: (types: string[]) => CheckResultRenderer[];\n getAllChecks(): Promise<Check[]>;\n runChecks(\n entityParams: CompoundEntityRef,\n checks?: string[],\n ): Promise<CheckResult[]>;\n runBulkChecks(\n entities: CompoundEntityRef[],\n checks?: Check[],\n ): Promise<BulkCheckResponse>;\n getFacts(entity: CompoundEntityRef, facts: string[]): Promise<InsightFacts>;\n getFactSchemas(): Promise<FactSchema[]>;\n}\n"],"names":[],"mappings":";;AA+BO,MAAM,qBAAqB,YAA8B,CAAA;AAAA,EAC9D,EAAI,EAAA,6BAAA;AACN,CAAC;;;;"}
1
+ {"version":3,"file":"TechInsightsApi.esm.js","sources":["../../src/api/TechInsightsApi.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createApiRef } from '@backstage/core-plugin-api';\nimport {\n CheckResult,\n BulkCheckResponse,\n FactSchema,\n} from '@backstage-community/plugin-tech-insights-common';\nimport { Check, InsightFacts } from './types';\nimport { CheckResultRenderer } from '../components/CheckResultRenderer';\nimport { CompoundEntityRef } from '@backstage/catalog-model';\n\n/**\n * {@link @backstage/core-plugin-api#ApiRef} for the {@link TechInsightsApi}\n *\n * @public\n */\nexport const techInsightsApiRef = createApiRef<TechInsightsApi>({\n id: 'plugin.techinsights.service',\n});\n\n/**\n * API client interface for the Tech Insights plugin\n *\n * @public\n */\nexport interface TechInsightsApi {\n getCheckResultRenderers: (types: string[]) => CheckResultRenderer[];\n isCheckResultFailed: (check: CheckResult) => boolean;\n getAllChecks(): Promise<Check[]>;\n runChecks(\n entityParams: CompoundEntityRef,\n checks?: string[],\n ): Promise<CheckResult[]>;\n runBulkChecks(\n entities: CompoundEntityRef[],\n checks?: Check[],\n ): Promise<BulkCheckResponse>;\n getFacts(entity: CompoundEntityRef, facts: string[]): Promise<InsightFacts>;\n getFactSchemas(): Promise<FactSchema[]>;\n}\n"],"names":[],"mappings":";;AA+BO,MAAM,qBAAqB,YAA8B,CAAA;AAAA,EAC9D,EAAI,EAAA,6BAAA;AACN,CAAC;;;;"}
@@ -23,6 +23,15 @@ class TechInsightsClient {
23
23
  const renderers = this.renderers ?? [jsonRulesEngineCheckResultRenderer];
24
24
  return renderers.filter((d) => types.includes(d.type));
25
25
  }
26
+ isCheckResultFailed(check) {
27
+ const checkResultRenderers = this.getCheckResultRenderers([
28
+ check.check.type
29
+ ]);
30
+ if (checkResultRenderers[0] && checkResultRenderers[0].isFailed) {
31
+ return checkResultRenderers[0].isFailed(check);
32
+ }
33
+ return true;
34
+ }
26
35
  async getAllChecks() {
27
36
  return this.api("/checks");
28
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TechInsightsClient.esm.js","sources":["../../src/api/TechInsightsClient.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TechInsightsApi } from './TechInsightsApi';\nimport {\n BulkCheckResponse,\n CheckResult,\n FactSchema,\n} from '@backstage-community/plugin-tech-insights-common';\nimport { Check, InsightFacts } from './types';\nimport { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport {\n CompoundEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\n\nimport {\n CheckResultRenderer,\n jsonRulesEngineCheckResultRenderer,\n} from '../components/CheckResultRenderer';\nimport qs from 'qs';\n\n/** @public */\nexport class TechInsightsClient implements TechInsightsApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly identityApi: IdentityApi;\n private readonly renderers?: CheckResultRenderer[];\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n identityApi: IdentityApi;\n renderers?: CheckResultRenderer[];\n }) {\n this.discoveryApi = options.discoveryApi;\n this.identityApi = options.identityApi;\n this.renderers = options.renderers;\n }\n\n async getFacts(\n entity: CompoundEntityRef,\n facts: string[],\n ): Promise<InsightFacts> {\n const query = qs.stringify({\n entity: stringifyEntityRef(entity),\n ids: facts,\n });\n return await this.api<InsightFacts>(`/facts/latest?${query}`);\n }\n\n getCheckResultRenderers(types: string[]): CheckResultRenderer[] {\n const renderers = this.renderers ?? [jsonRulesEngineCheckResultRenderer];\n return renderers.filter(d => types.includes(d.type));\n }\n\n async getAllChecks(): Promise<Check[]> {\n return this.api('/checks');\n }\n\n async getFactSchemas(): Promise<FactSchema[]> {\n return this.api('/fact-schemas');\n }\n\n async runChecks(\n entityParams: CompoundEntityRef,\n checks?: string[],\n ): Promise<CheckResult[]> {\n const { namespace, kind, name } = entityParams;\n const requestBody = { checks };\n return this.api(\n `/checks/run/${encodeURIComponent(namespace)}/${encodeURIComponent(\n kind,\n )}/${encodeURIComponent(name)}`,\n {\n method: 'POST',\n body: JSON.stringify(requestBody),\n },\n );\n }\n\n async runBulkChecks(\n entities: CompoundEntityRef[],\n checks?: Check[],\n ): Promise<BulkCheckResponse> {\n const checkIds = checks ? checks.map(check => check.id) : [];\n const requestBody = {\n entities,\n checks: checkIds.length > 0 ? checkIds : undefined,\n };\n return this.api('/checks/run', {\n method: 'POST',\n body: JSON.stringify(requestBody),\n });\n }\n\n private async api<T>(path: string, init?: RequestInit): Promise<T> {\n const url = await this.discoveryApi.getBaseUrl('tech-insights');\n const { token } = await this.identityApi.getCredentials();\n\n const headers: HeadersInit = new Headers(init?.headers);\n if (!headers.has('content-type'))\n headers.set('content-type', 'application/json');\n if (token && !headers.has('authorization')) {\n headers.set('authorization', `Bearer ${token}`);\n }\n\n const request = new Request(`${url}${path}`, {\n ...init,\n headers,\n });\n\n return fetch(request).then(async response => {\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n return response.json() as Promise<T>;\n });\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TechInsightsClient.esm.js","sources":["../../src/api/TechInsightsClient.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TechInsightsApi } from './TechInsightsApi';\nimport {\n BulkCheckResponse,\n CheckResult,\n FactSchema,\n} from '@backstage-community/plugin-tech-insights-common';\nimport { Check, InsightFacts } from './types';\nimport { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport {\n CompoundEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\n\nimport {\n CheckResultRenderer,\n jsonRulesEngineCheckResultRenderer,\n} from '../components/CheckResultRenderer';\nimport qs from 'qs';\n\n/** @public */\nexport class TechInsightsClient implements TechInsightsApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly identityApi: IdentityApi;\n private readonly renderers?: CheckResultRenderer[];\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n identityApi: IdentityApi;\n renderers?: CheckResultRenderer[];\n }) {\n this.discoveryApi = options.discoveryApi;\n this.identityApi = options.identityApi;\n this.renderers = options.renderers;\n }\n\n async getFacts(\n entity: CompoundEntityRef,\n facts: string[],\n ): Promise<InsightFacts> {\n const query = qs.stringify({\n entity: stringifyEntityRef(entity),\n ids: facts,\n });\n return await this.api<InsightFacts>(`/facts/latest?${query}`);\n }\n\n getCheckResultRenderers(types: string[]): CheckResultRenderer[] {\n const renderers = this.renderers ?? [jsonRulesEngineCheckResultRenderer];\n return renderers.filter(d => types.includes(d.type));\n }\n\n isCheckResultFailed(check: CheckResult) {\n const checkResultRenderers = this.getCheckResultRenderers([\n check.check.type,\n ]);\n if (checkResultRenderers[0] && checkResultRenderers[0].isFailed) {\n return checkResultRenderers[0].isFailed(check);\n }\n return true;\n }\n\n async getAllChecks(): Promise<Check[]> {\n return this.api('/checks');\n }\n\n async getFactSchemas(): Promise<FactSchema[]> {\n return this.api('/fact-schemas');\n }\n\n async runChecks(\n entityParams: CompoundEntityRef,\n checks?: string[],\n ): Promise<CheckResult[]> {\n const { namespace, kind, name } = entityParams;\n const requestBody = { checks };\n return this.api(\n `/checks/run/${encodeURIComponent(namespace)}/${encodeURIComponent(\n kind,\n )}/${encodeURIComponent(name)}`,\n {\n method: 'POST',\n body: JSON.stringify(requestBody),\n },\n );\n }\n\n async runBulkChecks(\n entities: CompoundEntityRef[],\n checks?: Check[],\n ): Promise<BulkCheckResponse> {\n const checkIds = checks ? checks.map(check => check.id) : [];\n const requestBody = {\n entities,\n checks: checkIds.length > 0 ? checkIds : undefined,\n };\n return this.api('/checks/run', {\n method: 'POST',\n body: JSON.stringify(requestBody),\n });\n }\n\n private async api<T>(path: string, init?: RequestInit): Promise<T> {\n const url = await this.discoveryApi.getBaseUrl('tech-insights');\n const { token } = await this.identityApi.getCredentials();\n\n const headers: HeadersInit = new Headers(init?.headers);\n if (!headers.has('content-type'))\n headers.set('content-type', 'application/json');\n if (token && !headers.has('authorization')) {\n headers.set('authorization', `Bearer ${token}`);\n }\n\n const request = new Request(`${url}${path}`, {\n ...init,\n headers,\n });\n\n return fetch(request).then(async response => {\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n return response.json() as Promise<T>;\n });\n }\n}\n"],"names":[],"mappings":"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"}
@@ -4,11 +4,15 @@ import { Progress, ErrorPanel } from '@backstage/core-components';
4
4
  import { useApi } from '@backstage/core-plugin-api';
5
5
  import { ScorecardInfo } from '../ScorecardsInfo/ScorecardInfo.esm.js';
6
6
  import { techInsightsApiRef } from '../../api/TechInsightsApi.esm.js';
7
- import { useEntity } from '@backstage/plugin-catalog-react';
7
+ import '@backstage/errors';
8
8
  import { getCompoundEntityRef } from '@backstage/catalog-model';
9
+ import '@material-ui/icons/CheckCircleOutline';
10
+ import '@material-ui/icons/ErrorOutline';
11
+ import 'qs';
12
+ import { useEntity } from '@backstage/plugin-catalog-react';
9
13
 
10
14
  const ScorecardsCard = (props) => {
11
- const { title, description, checksId, onlyFailed } = props;
15
+ const { title, description, checksId, onlyFailed, expanded = true } = props;
12
16
  const api = useApi(techInsightsApiRef);
13
17
  const { entity } = useEntity();
14
18
  const { value, loading, error } = useAsync(
@@ -37,7 +41,8 @@ const ScorecardsCard = (props) => {
37
41
  title,
38
42
  description,
39
43
  checkResults: filteredValue,
40
- noWarning: onlyFailed
44
+ noWarning: onlyFailed,
45
+ expanded
41
46
  }
42
47
  );
43
48
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ScorecardsCard.esm.js","sources":["../../../src/components/ScorecardsCard/ScorecardsCard.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useMemo } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { ErrorPanel, Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { ScorecardInfo } from '../ScorecardsInfo';\nimport { techInsightsApiRef } from '../../api/TechInsightsApi';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { getCompoundEntityRef } from '@backstage/catalog-model';\n\nexport const ScorecardsCard = (props: {\n title: string;\n description?: string;\n checksId?: string[];\n onlyFailed?: boolean;\n}) => {\n const { title, description, checksId, onlyFailed } = props;\n const api = useApi(techInsightsApiRef);\n const { entity } = useEntity();\n const { value, loading, error } = useAsync(\n async () => await api.runChecks(getCompoundEntityRef(entity), checksId),\n [api, entity, JSON.stringify(checksId)],\n );\n\n const checkResultRenderers = useMemo(() => {\n if (!onlyFailed || !value) return {};\n\n const types = [...new Set(value.map(({ check }) => check.type))];\n const renderers = api.getCheckResultRenderers(types);\n return Object.fromEntries(\n renderers.map(renderer => [renderer.type, renderer]),\n );\n }, [api, value, onlyFailed]);\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <ErrorPanel error={error} />;\n }\n\n const filteredValue = !onlyFailed\n ? value || []\n : (value || []).filter(val =>\n checkResultRenderers[val.check.type]?.isFailed?.(val),\n );\n\n return (\n <ScorecardInfo\n title={title}\n description={description}\n checkResults={filteredValue}\n noWarning={onlyFailed}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAyBa,MAAA,cAAA,GAAiB,CAAC,KAKzB,KAAA;AACJ,EAAA,MAAM,EAAE,KAAA,EAAO,WAAa,EAAA,QAAA,EAAU,YAAe,GAAA,KAAA,CAAA;AACrD,EAAM,MAAA,GAAA,GAAM,OAAO,kBAAkB,CAAA,CAAA;AACrC,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA,CAAA;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,KAAA,EAAU,GAAA,QAAA;AAAA,IAChC,YAAY,MAAM,GAAA,CAAI,UAAU,oBAAqB,CAAA,MAAM,GAAG,QAAQ,CAAA;AAAA,IACtE,CAAC,GAAK,EAAA,MAAA,EAAQ,IAAK,CAAA,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,GACxC,CAAA;AAEA,EAAM,MAAA,oBAAA,GAAuB,QAAQ,MAAM;AACzC,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,KAAA,SAAc,EAAC,CAAA;AAEnC,IAAA,MAAM,KAAQ,GAAA,CAAC,GAAG,IAAI,IAAI,KAAM,CAAA,GAAA,CAAI,CAAC,EAAE,KAAM,EAAA,KAAM,KAAM,CAAA,IAAI,CAAC,CAAC,CAAA,CAAA;AAC/D,IAAM,MAAA,SAAA,GAAY,GAAI,CAAA,uBAAA,CAAwB,KAAK,CAAA,CAAA;AACnD,IAAA,OAAO,MAAO,CAAA,WAAA;AAAA,MACZ,UAAU,GAAI,CAAA,CAAA,QAAA,KAAY,CAAC,QAAS,CAAA,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,KACrD,CAAA;AAAA,GACC,EAAA,CAAC,GAAK,EAAA,KAAA,EAAO,UAAU,CAAC,CAAA,CAAA;AAE3B,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2CAAQ,QAAS,EAAA,IAAA,CAAA,CAAA;AAAA,aACR,KAAO,EAAA;AAChB,IAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,KAAc,EAAA,CAAA,CAAA;AAAA,GACnC;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,UACnB,GAAA,KAAA,IAAS,EACR,GAAA,CAAA,KAAA,IAAS,EAAI,EAAA,MAAA;AAAA,IAAO,SACnB,oBAAqB,CAAA,GAAA,CAAI,MAAM,IAAI,CAAA,EAAG,WAAW,GAAG,CAAA;AAAA,GACtD,CAAA;AAEJ,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAc,EAAA,aAAA;AAAA,MACd,SAAW,EAAA,UAAA;AAAA,KAAA;AAAA,GACb,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ScorecardsCard.esm.js","sources":["../../../src/components/ScorecardsCard/ScorecardsCard.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useMemo } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { ErrorPanel, Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { ScorecardInfo } from '../ScorecardsInfo';\nimport { techInsightsApiRef } from '../../api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { getCompoundEntityRef } from '@backstage/catalog-model';\n\nexport const ScorecardsCard = (props: {\n title: string;\n description?: string;\n checksId?: string[];\n onlyFailed?: boolean;\n expanded?: boolean;\n}) => {\n const { title, description, checksId, onlyFailed, expanded = true } = props;\n const api = useApi(techInsightsApiRef);\n const { entity } = useEntity();\n const { value, loading, error } = useAsync(\n async () => await api.runChecks(getCompoundEntityRef(entity), checksId),\n [api, entity, JSON.stringify(checksId)],\n );\n\n const checkResultRenderers = useMemo(() => {\n if (!onlyFailed || !value) return {};\n\n const types = [...new Set(value.map(({ check }) => check.type))];\n const renderers = api.getCheckResultRenderers(types);\n return Object.fromEntries(\n renderers.map(renderer => [renderer.type, renderer]),\n );\n }, [api, value, onlyFailed]);\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <ErrorPanel error={error} />;\n }\n\n const filteredValue = !onlyFailed\n ? value || []\n : (value || []).filter(val =>\n checkResultRenderers[val.check.type]?.isFailed?.(val),\n );\n\n return (\n <ScorecardInfo\n title={title}\n description={description}\n checkResults={filteredValue}\n noWarning={onlyFailed}\n expanded={expanded}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AAyBa,MAAA,cAAA,GAAiB,CAAC,KAMzB,KAAA;AACJ,EAAA,MAAM,EAAE,KAAO,EAAA,WAAA,EAAa,UAAU,UAAY,EAAA,QAAA,GAAW,MAAS,GAAA,KAAA,CAAA;AACtE,EAAM,MAAA,GAAA,GAAM,OAAO,kBAAkB,CAAA,CAAA;AACrC,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA,CAAA;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,KAAA,EAAU,GAAA,QAAA;AAAA,IAChC,YAAY,MAAM,GAAA,CAAI,UAAU,oBAAqB,CAAA,MAAM,GAAG,QAAQ,CAAA;AAAA,IACtE,CAAC,GAAK,EAAA,MAAA,EAAQ,IAAK,CAAA,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,GACxC,CAAA;AAEA,EAAM,MAAA,oBAAA,GAAuB,QAAQ,MAAM;AACzC,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,KAAA,SAAc,EAAC,CAAA;AAEnC,IAAA,MAAM,KAAQ,GAAA,CAAC,GAAG,IAAI,IAAI,KAAM,CAAA,GAAA,CAAI,CAAC,EAAE,KAAM,EAAA,KAAM,KAAM,CAAA,IAAI,CAAC,CAAC,CAAA,CAAA;AAC/D,IAAM,MAAA,SAAA,GAAY,GAAI,CAAA,uBAAA,CAAwB,KAAK,CAAA,CAAA;AACnD,IAAA,OAAO,MAAO,CAAA,WAAA;AAAA,MACZ,UAAU,GAAI,CAAA,CAAA,QAAA,KAAY,CAAC,QAAS,CAAA,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,KACrD,CAAA;AAAA,GACC,EAAA,CAAC,GAAK,EAAA,KAAA,EAAO,UAAU,CAAC,CAAA,CAAA;AAE3B,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2CAAQ,QAAS,EAAA,IAAA,CAAA,CAAA;AAAA,aACR,KAAO,EAAA;AAChB,IAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,KAAc,EAAA,CAAA,CAAA;AAAA,GACnC;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,UACnB,GAAA,KAAA,IAAS,EACR,GAAA,CAAA,KAAA,IAAS,EAAI,EAAA,MAAA;AAAA,IAAO,SACnB,oBAAqB,CAAA,GAAA,CAAI,MAAM,IAAI,CAAA,EAAG,WAAW,GAAG,CAAA;AAAA,GACtD,CAAA;AAEJ,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAc,EAAA,aAAA;AAAA,MACd,SAAW,EAAA,UAAA;AAAA,MACX,QAAA;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ;;;;"}
@@ -2,41 +2,85 @@ import React from 'react';
2
2
  import Grid from '@material-ui/core/Grid';
3
3
  import Typography from '@material-ui/core/Typography';
4
4
  import { makeStyles } from '@material-ui/core/styles';
5
- import { InfoCard } from '@backstage/core-components';
6
5
  import Alert from '@material-ui/lab/Alert';
7
6
  import { ScorecardsList } from '../ScorecardsList/ScorecardsList.esm.js';
7
+ import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
8
+ import Accordion from '@material-ui/core/Accordion';
9
+ import AccordionDetails from '@material-ui/core/AccordionDetails';
10
+ import AccordionSummary from '@material-ui/core/AccordionSummary';
11
+ import { useApi } from '@backstage/core-plugin-api';
12
+ import { techInsightsApiRef } from '../../api/TechInsightsApi.esm.js';
13
+ import '@backstage/errors';
14
+ import '@backstage/catalog-model';
15
+ import '@material-ui/icons/CheckCircleOutline';
16
+ import '@material-ui/icons/ErrorOutline';
17
+ import 'qs';
8
18
 
9
19
  const useStyles = makeStyles((theme) => ({
10
20
  subheader: {
11
- fontWeight: "bold",
12
21
  paddingLeft: theme.spacing(0.5)
22
+ },
23
+ accordionHeader: {
24
+ borderBottom: `1px solid ${theme.palette.border}`
25
+ },
26
+ accordionHeaderContent: {
27
+ margin: `${theme.spacing(2)}px 0 !important`
13
28
  }
14
29
  }));
15
- const infoCard = (title, description, className, element) => /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(InfoCard, { title }, description && /* @__PURE__ */ React.createElement(Typography, { className, variant: "body1", gutterBottom: true }, description), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, element)));
30
+ const infoCard = (title, description, classes, element, expanded, summary) => /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(Accordion, { defaultExpanded: expanded }, /* @__PURE__ */ React.createElement(
31
+ AccordionSummary,
32
+ {
33
+ expandIcon: /* @__PURE__ */ React.createElement(ExpandMoreIcon, null),
34
+ className: classes.accordionHeader,
35
+ classes: {
36
+ content: classes.accordionHeaderContent
37
+ }
38
+ },
39
+ /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "space-between", alignItems: "center" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, title)), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, null, summary)))
40
+ ), /* @__PURE__ */ React.createElement(AccordionDetails, null, /* @__PURE__ */ React.createElement(Grid, { container: true }, description && /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
41
+ Typography,
42
+ {
43
+ className: classes.subheader,
44
+ variant: "body1",
45
+ gutterBottom: true
46
+ },
47
+ description
48
+ )), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, element)))));
16
49
  const ScorecardInfo = (props) => {
17
- const { checkResults, title, description, noWarning } = props;
50
+ const {
51
+ checkResults,
52
+ title,
53
+ description,
54
+ noWarning,
55
+ expanded = true
56
+ } = props;
18
57
  const classes = useStyles();
58
+ const api = useApi(techInsightsApiRef);
19
59
  if (!checkResults.length) {
20
60
  if (noWarning) {
21
61
  return infoCard(
22
62
  title,
23
63
  description,
24
- classes.subheader,
25
- /* @__PURE__ */ React.createElement(Alert, { severity: "info" }, "All checks passed, or no checks have been performed yet")
64
+ classes,
65
+ /* @__PURE__ */ React.createElement(Alert, { severity: "info" }, "All checks passed, or no checks have been performed yet"),
66
+ expanded
26
67
  );
27
68
  }
28
69
  return infoCard(
29
70
  title,
30
71
  description,
31
- classes.subheader,
32
- /* @__PURE__ */ React.createElement(Alert, { severity: "warning" }, "No checks have any data yet.")
72
+ classes,
73
+ /* @__PURE__ */ React.createElement(Alert, { severity: "warning" }, "No checks have any data yet."),
74
+ expanded
33
75
  );
34
76
  }
35
77
  return infoCard(
36
78
  title,
37
79
  description,
38
- classes.subheader,
39
- /* @__PURE__ */ React.createElement(ScorecardsList, { checkResults })
80
+ classes,
81
+ /* @__PURE__ */ React.createElement(ScorecardsList, { checkResults }),
82
+ expanded,
83
+ `${checkResults.filter((checkResult) => !api.isCheckResultFailed(checkResult)).length}/${checkResults.length}`
40
84
  );
41
85
  };
42
86
 
@@ -1 +1 @@
1
- {"version":3,"file":"ScorecardInfo.esm.js","sources":["../../../src/components/ScorecardsInfo/ScorecardInfo.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ReactElement, ReactNode } from 'react';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { InfoCard } from '@backstage/core-components';\nimport { CheckResult } from '@backstage-community/plugin-tech-insights-common';\nimport Alert from '@material-ui/lab/Alert';\nimport { ScorecardsList } from '../ScorecardsList';\n\nconst useStyles = makeStyles(theme => ({\n subheader: {\n fontWeight: 'bold',\n paddingLeft: theme.spacing(0.5),\n },\n}));\n\nconst infoCard = (\n title: ReactNode,\n description: string | undefined,\n className: string,\n element: ReactElement,\n) => (\n <Grid item xs={12}>\n <InfoCard title={title}>\n {description && (\n <Typography className={className} variant=\"body1\" gutterBottom>\n {description}\n </Typography>\n )}\n <Grid item xs={12}>\n {element}\n </Grid>\n </InfoCard>\n </Grid>\n);\n\nexport const ScorecardInfo = (props: {\n checkResults: CheckResult[];\n title: ReactNode;\n description?: string;\n noWarning?: boolean;\n}) => {\n const { checkResults, title, description, noWarning } = props;\n const classes = useStyles();\n\n if (!checkResults.length) {\n if (noWarning) {\n return infoCard(\n title,\n description,\n classes.subheader,\n <Alert severity=\"info\">\n All checks passed, or no checks have been performed yet\n </Alert>,\n );\n }\n return infoCard(\n title,\n description,\n classes.subheader,\n <Alert severity=\"warning\">No checks have any data yet.</Alert>,\n );\n }\n\n return infoCard(\n title,\n description,\n classes.subheader,\n <ScorecardsList checkResults={checkResults} />,\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAyBA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,SAAW,EAAA;AAAA,IACT,UAAY,EAAA,MAAA;AAAA,IACZ,WAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,GAChC;AACF,CAAE,CAAA,CAAA,CAAA;AAEF,MAAM,QAAW,GAAA,CACf,KACA,EAAA,WAAA,EACA,WACA,OAEA,qBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,YAAS,KACP,EAAA,EAAA,WAAA,oBACE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,SAAsB,EAAA,OAAA,EAAQ,OAAQ,EAAA,YAAA,EAAY,QAC3D,WACH,CAAA,kBAED,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,EACZ,EAAA,EAAA,OACH,CACF,CACF,CAAA,CAAA;AAGW,MAAA,aAAA,GAAgB,CAAC,KAKxB,KAAA;AACJ,EAAA,MAAM,EAAE,YAAA,EAAc,KAAO,EAAA,WAAA,EAAa,WAAc,GAAA,KAAA,CAAA;AACxD,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAE1B,EAAI,IAAA,CAAC,aAAa,MAAQ,EAAA;AACxB,IAAA,IAAI,SAAW,EAAA;AACb,MAAO,OAAA,QAAA;AAAA,QACL,KAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAQ,CAAA,SAAA;AAAA,wBACP,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,MAAA,EAAA,EAAO,yDAEvB,CAAA;AAAA,OACF,CAAA;AAAA,KACF;AACA,IAAO,OAAA,QAAA;AAAA,MACL,KAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAQ,CAAA,SAAA;AAAA,sBACP,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,SAAA,EAAA,EAAU,8BAA4B,CAAA;AAAA,KACxD,CAAA;AAAA,GACF;AAEA,EAAO,OAAA,QAAA;AAAA,IACL,KAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAQ,CAAA,SAAA;AAAA,oBACR,KAAA,CAAA,aAAA,CAAC,kBAAe,YAA4B,EAAA,CAAA;AAAA,GAC9C,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"ScorecardInfo.esm.js","sources":["../../../src/components/ScorecardsInfo/ScorecardInfo.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ReactNode } from 'react';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { CheckResult } from '@backstage-community/plugin-tech-insights-common';\nimport Alert from '@material-ui/lab/Alert';\nimport { ScorecardsList } from '../ScorecardsList';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { techInsightsApiRef } from '../../api';\n\nconst useStyles = makeStyles(theme => ({\n subheader: {\n paddingLeft: theme.spacing(0.5),\n },\n accordionHeader: {\n borderBottom: `1px solid ${theme.palette.border}`,\n },\n accordionHeaderContent: {\n margin: `${theme.spacing(2)}px 0 !important`,\n },\n}));\n\nconst infoCard = (\n title: React.ReactNode,\n description: string | undefined,\n classes: ReturnType<typeof useStyles>,\n element: React.ReactElement,\n expanded: boolean,\n summary?: string,\n) => (\n <Grid item xs={12}>\n <Accordion defaultExpanded={expanded}>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n className={classes.accordionHeader}\n classes={{\n content: classes.accordionHeaderContent,\n }}\n >\n <Grid container justifyContent=\"space-between\" alignItems=\"center\">\n <Grid item>\n <Typography variant=\"h5\">{title}</Typography>\n </Grid>\n <Grid item>\n <Typography>{summary}</Typography>\n </Grid>\n </Grid>\n </AccordionSummary>\n <AccordionDetails>\n <Grid container>\n {description && (\n <Grid item xs={12}>\n <Typography\n className={classes.subheader}\n variant=\"body1\"\n gutterBottom\n >\n {description}\n </Typography>\n </Grid>\n )}\n <Grid item xs={12}>\n {element}\n </Grid>\n </Grid>\n </AccordionDetails>\n </Accordion>\n </Grid>\n);\n\nexport const ScorecardInfo = (props: {\n checkResults: CheckResult[];\n title: ReactNode;\n description?: string;\n noWarning?: boolean;\n expanded?: boolean;\n}) => {\n const {\n checkResults,\n title,\n description,\n noWarning,\n expanded = true,\n } = props;\n const classes = useStyles();\n const api = useApi(techInsightsApiRef);\n\n if (!checkResults.length) {\n if (noWarning) {\n return infoCard(\n title,\n description,\n classes,\n <Alert severity=\"info\">\n All checks passed, or no checks have been performed yet\n </Alert>,\n expanded,\n );\n }\n return infoCard(\n title,\n description,\n classes,\n <Alert severity=\"warning\">No checks have any data yet.</Alert>,\n expanded,\n );\n }\n\n return infoCard(\n title,\n description,\n classes,\n <ScorecardsList checkResults={checkResults} />,\n expanded,\n `${\n checkResults.filter(checkResult => !api.isCheckResultFailed(checkResult))\n .length\n }/${checkResults.length}`,\n );\n};\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -22,6 +22,7 @@ declare const ScorecardInfo: (props: {
22
22
  title: react.ReactNode;
23
23
  description?: string | undefined;
24
24
  noWarning?: boolean | undefined;
25
+ expanded?: boolean | undefined;
25
26
  }) => react.JSX.Element;
26
27
  /**
27
28
  * @public
@@ -45,6 +46,7 @@ declare const EntityTechInsightsScorecardCard: (props: {
45
46
  description?: string | undefined;
46
47
  checksId?: string[] | undefined;
47
48
  onlyFailed?: boolean | undefined;
49
+ expanded?: boolean | undefined;
48
50
  }) => react.JSX.Element;
49
51
  /**
50
52
  * @public
@@ -138,6 +140,7 @@ declare const techInsightsApiRef: _backstage_core_plugin_api.ApiRef<TechInsights
138
140
  */
139
141
  interface TechInsightsApi {
140
142
  getCheckResultRenderers: (types: string[]) => CheckResultRenderer[];
143
+ isCheckResultFailed: (check: CheckResult) => boolean;
141
144
  getAllChecks(): Promise<Check[]>;
142
145
  runChecks(entityParams: CompoundEntityRef, checks?: string[]): Promise<CheckResult[]>;
143
146
  runBulkChecks(entities: CompoundEntityRef[], checks?: Check[]): Promise<BulkCheckResponse>;
@@ -157,6 +160,7 @@ declare class TechInsightsClient implements TechInsightsApi {
157
160
  });
158
161
  getFacts(entity: CompoundEntityRef, facts: string[]): Promise<InsightFacts>;
159
162
  getCheckResultRenderers(types: string[]): CheckResultRenderer[];
163
+ isCheckResultFailed(check: CheckResult): boolean;
160
164
  getAllChecks(): Promise<Check[]>;
161
165
  getFactSchemas(): Promise<FactSchema[]>;
162
166
  runChecks(entityParams: CompoundEntityRef, checks?: string[]): Promise<CheckResult[]>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-tech-insights",
3
- "version": "0.3.31",
3
+ "version": "0.3.33",
4
4
  "backstage": {
5
5
  "role": "frontend-plugin",
6
6
  "pluginId": "tech-insights",
@@ -39,12 +39,12 @@
39
39
  "test": "backstage-cli package test"
40
40
  },
41
41
  "dependencies": {
42
- "@backstage-community/plugin-tech-insights-common": "^0.2.15",
43
- "@backstage/catalog-model": "^1.5.0",
44
- "@backstage/core-components": "^0.14.9",
42
+ "@backstage-community/plugin-tech-insights-common": "^0.2.16",
43
+ "@backstage/catalog-model": "^1.6.0",
44
+ "@backstage/core-components": "^0.14.10",
45
45
  "@backstage/core-plugin-api": "^1.9.3",
46
46
  "@backstage/errors": "^1.2.4",
47
- "@backstage/plugin-catalog-react": "^1.12.2",
47
+ "@backstage/plugin-catalog-react": "^1.12.3",
48
48
  "@backstage/types": "^1.1.1",
49
49
  "@material-table/exporters": "^1.2.19",
50
50
  "@material-ui/core": "^4.12.2",
@@ -55,8 +55,8 @@
55
55
  "react-use": "^17.2.4"
56
56
  },
57
57
  "devDependencies": {
58
- "@backstage/cli": "^0.26.11",
59
- "@backstage/dev-utils": "^1.0.36",
58
+ "@backstage/cli": "^0.27.0",
59
+ "@backstage/dev-utils": "^1.0.37",
60
60
  "@testing-library/dom": "^10.0.0",
61
61
  "@testing-library/jest-dom": "^6.0.0",
62
62
  "@testing-library/react": "^15.0.0",