@backstage/plugin-catalog-react 1.12.1-next.2 → 1.12.2-next.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,44 @@
1
1
  # @backstage/plugin-catalog-react
2
2
 
3
+ ## 1.12.2-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 2030962: Make EntityOwnerPicker display metadata.title or spec.profile.displayName for mode=only-owners instead of metadata.name
8
+ - Updated dependencies
9
+ - @backstage/core-components@0.14.9-next.0
10
+ - @backstage/frontend-plugin-api@0.6.7-next.0
11
+ - @backstage/integration-react@1.1.29-next.0
12
+ - @backstage/core-plugin-api@1.9.3
13
+ - @backstage/catalog-client@1.6.5
14
+ - @backstage/catalog-model@1.5.0
15
+ - @backstage/errors@1.2.4
16
+ - @backstage/types@1.1.1
17
+ - @backstage/version-bridge@1.0.8
18
+ - @backstage/plugin-catalog-common@1.0.24
19
+ - @backstage/plugin-permission-common@0.7.14
20
+ - @backstage/plugin-permission-react@0.4.23
21
+
22
+ ## 1.12.1
23
+
24
+ ### Patch Changes
25
+
26
+ - d44a20a: Added additional plugin metadata to `package.json`.
27
+ - fa8560e: Prevents Autocomplete dropdown from overlapping sidebar on hovering it
28
+ - Updated dependencies
29
+ - @backstage/core-components@0.14.8
30
+ - @backstage/core-plugin-api@1.9.3
31
+ - @backstage/plugin-permission-common@0.7.14
32
+ - @backstage/plugin-permission-react@0.4.23
33
+ - @backstage/plugin-catalog-common@1.0.24
34
+ - @backstage/integration-react@1.1.28
35
+ - @backstage/frontend-plugin-api@0.6.6
36
+ - @backstage/catalog-client@1.6.5
37
+ - @backstage/catalog-model@1.5.0
38
+ - @backstage/errors@1.2.4
39
+ - @backstage/types@1.1.1
40
+ - @backstage/version-bridge@1.0.8
41
+
3
42
  ## 1.12.1-next.2
4
43
 
5
44
  ### Patch Changes
@@ -1,6 +1,6 @@
1
1
  {
2
- "name": "@backstage/plugin-catalog-react",
3
- "version": "1.12.1-next.2",
2
+ "name": "@backstage/plugin-catalog-react__alpha",
3
+ "version": "1.12.2-next.0",
4
4
  "main": "../dist/alpha.esm.js",
5
5
  "module": "../dist/alpha.esm.js",
6
6
  "types": "../dist/alpha.d.ts"
@@ -68,8 +68,7 @@ const EntityKindPicker = (props) => {
68
68
  });
69
69
  }
70
70
  }, [error, alertApi]);
71
- if (error)
72
- return null;
71
+ if (error) return null;
73
72
  const options = filterKinds(allKinds, allowedKinds, selectedKind);
74
73
  const items = Object.keys(options).map((key) => ({
75
74
  value: key,
@@ -1 +1 @@
1
- {"version":3,"file":"EntityKindPicker.esm.js","sources":["../../../src/components/EntityKindPicker/EntityKindPicker.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 { Select } from '@backstage/core-components';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport Box from '@material-ui/core/Box';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { EntityKindFilter } from '../../filters';\nimport { useEntityList } from '../../hooks';\nimport { filterKinds, useAllKinds } from './kindFilterUtils';\n\nfunction useEntityKindFilter(opts: { initialFilter: string }): {\n loading: boolean;\n error?: Error;\n allKinds: string[];\n selectedKind: string;\n setSelectedKind: (kind: string) => void;\n} {\n const {\n filters,\n queryParameters: { kind: kindParameter },\n updateFilters,\n } = useEntityList();\n\n const queryParamKind = useMemo(\n () => [kindParameter].flat()[0],\n [kindParameter],\n );\n\n const [selectedKind, setSelectedKind] = useState(\n queryParamKind ?? filters.kind?.value ?? opts.initialFilter,\n );\n\n // Set selected kinds on query parameter updates; this happens at initial page load and from\n // external updates to the page location.\n useEffect(() => {\n if (queryParamKind) {\n setSelectedKind(queryParamKind);\n }\n }, [queryParamKind]);\n\n // Set selected kind from filters; this happens when the kind filter is\n // updated from another component\n useEffect(() => {\n if (filters.kind?.value) {\n setSelectedKind(filters.kind?.value);\n }\n }, [filters.kind]);\n\n useEffect(() => {\n updateFilters({\n kind: selectedKind ? new EntityKindFilter(selectedKind) : undefined,\n });\n }, [selectedKind, updateFilters]);\n\n const { allKinds, loading, error } = useAllKinds();\n\n return {\n loading,\n error,\n allKinds: allKinds ?? [],\n selectedKind,\n setSelectedKind,\n };\n}\n\n/**\n * Props for {@link EntityKindPicker}.\n *\n * @public\n */\nexport interface EntityKindPickerProps {\n /**\n * Entity kinds to show in the dropdown; by default all kinds are fetched from the catalog and\n * displayed.\n */\n allowedKinds?: string[];\n initialFilter?: string;\n hidden?: boolean;\n}\n\n/** @public */\nexport const EntityKindPicker = (props: EntityKindPickerProps) => {\n const { allowedKinds, hidden, initialFilter = 'component' } = props;\n\n const alertApi = useApi(alertApiRef);\n\n const { error, allKinds, selectedKind, setSelectedKind } =\n useEntityKindFilter({\n initialFilter: initialFilter,\n });\n\n useEffect(() => {\n if (error) {\n alertApi.post({\n message: `Failed to load entity kinds`,\n severity: 'error',\n });\n }\n }, [error, alertApi]);\n\n if (error) return null;\n\n const options = filterKinds(allKinds, allowedKinds, selectedKind);\n\n const items = Object.keys(options).map(key => ({\n value: key,\n label: options[key],\n }));\n\n return hidden ? null : (\n <Box pb={1} pt={1}>\n <Select\n label=\"Kind\"\n items={items}\n selected={selectedKind.toLocaleLowerCase('en-US')}\n onChange={value => setSelectedKind(String(value))}\n />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EntityKindPicker.esm.js","sources":["../../../src/components/EntityKindPicker/EntityKindPicker.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 { Select } from '@backstage/core-components';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport Box from '@material-ui/core/Box';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { EntityKindFilter } from '../../filters';\nimport { useEntityList } from '../../hooks';\nimport { filterKinds, useAllKinds } from './kindFilterUtils';\n\nfunction useEntityKindFilter(opts: { initialFilter: string }): {\n loading: boolean;\n error?: Error;\n allKinds: string[];\n selectedKind: string;\n setSelectedKind: (kind: string) => void;\n} {\n const {\n filters,\n queryParameters: { kind: kindParameter },\n updateFilters,\n } = useEntityList();\n\n const queryParamKind = useMemo(\n () => [kindParameter].flat()[0],\n [kindParameter],\n );\n\n const [selectedKind, setSelectedKind] = useState(\n queryParamKind ?? filters.kind?.value ?? opts.initialFilter,\n );\n\n // Set selected kinds on query parameter updates; this happens at initial page load and from\n // external updates to the page location.\n useEffect(() => {\n if (queryParamKind) {\n setSelectedKind(queryParamKind);\n }\n }, [queryParamKind]);\n\n // Set selected kind from filters; this happens when the kind filter is\n // updated from another component\n useEffect(() => {\n if (filters.kind?.value) {\n setSelectedKind(filters.kind?.value);\n }\n }, [filters.kind]);\n\n useEffect(() => {\n updateFilters({\n kind: selectedKind ? new EntityKindFilter(selectedKind) : undefined,\n });\n }, [selectedKind, updateFilters]);\n\n const { allKinds, loading, error } = useAllKinds();\n\n return {\n loading,\n error,\n allKinds: allKinds ?? [],\n selectedKind,\n setSelectedKind,\n };\n}\n\n/**\n * Props for {@link EntityKindPicker}.\n *\n * @public\n */\nexport interface EntityKindPickerProps {\n /**\n * Entity kinds to show in the dropdown; by default all kinds are fetched from the catalog and\n * displayed.\n */\n allowedKinds?: string[];\n initialFilter?: string;\n hidden?: boolean;\n}\n\n/** @public */\nexport const EntityKindPicker = (props: EntityKindPickerProps) => {\n const { allowedKinds, hidden, initialFilter = 'component' } = props;\n\n const alertApi = useApi(alertApiRef);\n\n const { error, allKinds, selectedKind, setSelectedKind } =\n useEntityKindFilter({\n initialFilter: initialFilter,\n });\n\n useEffect(() => {\n if (error) {\n alertApi.post({\n message: `Failed to load entity kinds`,\n severity: 'error',\n });\n }\n }, [error, alertApi]);\n\n if (error) return null;\n\n const options = filterKinds(allKinds, allowedKinds, selectedKind);\n\n const items = Object.keys(options).map(key => ({\n value: key,\n label: options[key],\n }));\n\n return hidden ? null : (\n <Box pb={1} pt={1}>\n <Select\n label=\"Kind\"\n items={items}\n selected={selectedKind.toLocaleLowerCase('en-US')}\n onChange={value => setSelectedKind(String(value))}\n />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { useApi } from '@backstage/core-plugin-api';
2
2
  import useAsyncFn from 'react-use/esm/useAsyncFn';
3
3
  import { catalogApiRef } from '../../api.esm.js';
4
4
  import { useState } from 'react';
5
- import { parseEntityRef } from '@backstage/catalog-model';
5
+ import get from 'lodash/get';
6
6
 
7
7
  function useFacetsEntities({ enabled }) {
8
8
  const catalogApi = useApi(catalogApiRef);
@@ -11,21 +11,21 @@ function useFacetsEntities({ enabled }) {
11
11
  return [];
12
12
  }
13
13
  const facet = "relations.ownedBy";
14
- return catalogApi.getEntityFacets({ facets: [facet] }).then(
15
- (response) => response.facets[facet].map((e) => e.value).map((ref) => {
16
- const { kind, name, namespace } = parseEntityRef(ref);
17
- return {
18
- apiVersion: "backstage.io/v1beta1",
19
- kind,
20
- metadata: { name, namespace }
21
- };
22
- }).sort(
14
+ const facetsResponse = await catalogApi.getEntityFacets({
15
+ facets: [facet]
16
+ });
17
+ const entityRefs = facetsResponse.facets[facet].map((e) => e.value);
18
+ return catalogApi.getEntitiesByRefs({ entityRefs }).then(
19
+ (resp) => resp.items.filter((entity) => entity !== void 0).map((entity) => entity).sort(
23
20
  (a, b) => (a.metadata.namespace || "").localeCompare(
24
21
  b.metadata.namespace || "",
25
22
  "en-US"
26
- ) || a.metadata.name.localeCompare(b.metadata.name, "en-US") || a.kind.localeCompare(b.kind, "en-US")
23
+ ) || (get(a, "spec.profile.displayName") || a.metadata.title || a.metadata.name).localeCompare(
24
+ get(b, "spec.profile.displayName") || b.metadata.title || b.metadata.name,
25
+ "en-US"
26
+ ) || a.kind.localeCompare(b.kind, "en-US")
27
27
  )
28
- ).catch(() => []);
28
+ ).then((entities) => entities).catch(() => []);
29
29
  });
30
30
  return useAsyncFn(
31
31
  async (request, options) => {
@@ -79,7 +79,9 @@ function encodeCursor({
79
79
  }
80
80
  function filterEntity(text, entity) {
81
81
  const normalizedText = text.trim();
82
- return entity.kind.includes(normalizedText) || entity.metadata.namespace?.includes(normalizedText) || entity.metadata.name.includes(normalizedText);
82
+ return entity.kind.includes(normalizedText) || entity.metadata.namespace?.includes(normalizedText) || entity.metadata.name.includes(normalizedText) || entity.metadata.title?.includes(normalizedText) || get(entity, "spec.profile.displayName")?.includes(
83
+ normalizedText
84
+ );
83
85
  }
84
86
 
85
87
  export { useFacetsEntities };
@@ -1 +1 @@
1
- {"version":3,"file":"useFacetsEntities.esm.js","sources":["../../../src/components/EntityOwnerPicker/useFacetsEntities.ts"],"sourcesContent":["/*\n * Copyright 2023 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 */\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport { catalogApiRef } from '../../api';\nimport { useState } from 'react';\nimport { Entity, parseEntityRef } from '@backstage/catalog-model';\n\ntype FacetsCursor = {\n start: number;\n text: string;\n};\n\ntype FacetsEntitiesResponse = {\n items: Entity[];\n cursor?: string;\n};\n\ntype FacetsInitialRequest = {\n text: string;\n};\n\n/**\n * This hook asynchronously loads the entity owners using the facets endpoint.\n * EntityOwnerPicker uses this hook when mode=\"owners-only\" is passed as prop.\n * All the owners are kept internally in memory and rendered in batches once requested\n * by the frontend. The values returned by this hook are compatible with `useQueryEntities`\n * hook, which is also used by EntityOwnerPicker.\n */\nexport function useFacetsEntities({ enabled }: { enabled: boolean }) {\n const catalogApi = useApi(catalogApiRef);\n\n const [facetsPromise] = useState(async () => {\n if (!enabled) {\n return [];\n }\n const facet = 'relations.ownedBy';\n return catalogApi\n .getEntityFacets({ facets: [facet] })\n .then(response =>\n response.facets[facet]\n .map(e => e.value)\n .map<Entity>(ref => {\n const { kind, name, namespace } = parseEntityRef(ref);\n return {\n apiVersion: 'backstage.io/v1beta1',\n kind,\n metadata: { name, namespace },\n };\n })\n .sort(\n (a, b) =>\n (a.metadata.namespace || '').localeCompare(\n b.metadata.namespace || '',\n 'en-US',\n ) ||\n a.metadata.name.localeCompare(b.metadata.name, 'en-US') ||\n a.kind.localeCompare(b.kind, 'en-US'),\n ),\n )\n .catch(() => []);\n });\n\n return useAsyncFn<\n (\n request: FacetsInitialRequest | FacetsEntitiesResponse,\n options?: { limit?: number },\n ) => Promise<FacetsEntitiesResponse>\n >(\n async (request, options) => {\n const facets = await facetsPromise;\n\n if (!facets) {\n return {\n items: [],\n };\n }\n\n const limit = options?.limit ?? 20;\n\n const { text, start } = decodeCursor(request);\n const filteredRefs = facets.filter(e => filterEntity(text, e));\n const end = start + limit;\n return {\n items: filteredRefs.slice(0, end),\n ...encodeCursor({\n entities: filteredRefs,\n limit: end,\n payload: {\n text,\n start: end,\n },\n }),\n };\n },\n [facetsPromise],\n { loading: true, value: { items: [] } },\n );\n}\n\nfunction decodeCursor(\n request: FacetsInitialRequest | FacetsEntitiesResponse,\n): FacetsCursor {\n if (isFacetsResponse(request) && request.cursor) {\n return JSON.parse(atob(request.cursor));\n }\n return {\n text: (request as FacetsInitialRequest).text || '',\n start: 0,\n };\n}\n\nfunction isFacetsResponse(\n request: FacetsInitialRequest | FacetsEntitiesResponse,\n): request is FacetsEntitiesResponse {\n return !!(request as FacetsEntitiesResponse).cursor;\n}\n\nfunction encodeCursor({\n entities,\n limit,\n payload,\n}: {\n entities: Entity[];\n limit: number;\n payload: { text: string; start: number };\n}) {\n if (entities.length > limit) {\n return { cursor: btoa(JSON.stringify(payload)) };\n }\n return {};\n}\n\nfunction filterEntity(text: string, entity: Entity) {\n const normalizedText = text.trim();\n return (\n entity.kind.includes(normalizedText) ||\n entity.metadata.namespace?.includes(normalizedText) ||\n entity.metadata.name.includes(normalizedText)\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useFacetsEntities.esm.js","sources":["../../../src/components/EntityOwnerPicker/useFacetsEntities.ts"],"sourcesContent":["/*\n * Copyright 2023 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 */\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport { catalogApiRef } from '../../api';\nimport { useState } from 'react';\nimport { Entity } from '@backstage/catalog-model';\nimport get from 'lodash/get';\n\ntype FacetsCursor = {\n start: number;\n text: string;\n};\n\ntype FacetsEntitiesResponse = {\n items: Entity[];\n cursor?: string;\n};\n\ntype FacetsInitialRequest = {\n text: string;\n};\n\n/**\n * This hook asynchronously loads the entity owners using the facets endpoint.\n * EntityOwnerPicker uses this hook when mode=\"owners-only\" is passed as prop.\n * All the owners are kept internally in memory and rendered in batches once requested\n * by the frontend. The values returned by this hook are compatible with `useQueryEntities`\n * hook, which is also used by EntityOwnerPicker.\n */\nexport function useFacetsEntities({ enabled }: { enabled: boolean }) {\n const catalogApi = useApi(catalogApiRef);\n\n const [facetsPromise] = useState(async () => {\n if (!enabled) {\n return [];\n }\n const facet = 'relations.ownedBy';\n const facetsResponse = await catalogApi.getEntityFacets({\n facets: [facet],\n });\n const entityRefs = facetsResponse.facets[facet].map(e => e.value);\n\n return catalogApi\n .getEntitiesByRefs({ entityRefs })\n .then(resp =>\n resp.items\n .filter(entity => entity !== undefined)\n .map(entity => entity as Entity)\n .sort(\n (a, b) =>\n (a.metadata.namespace || '').localeCompare(\n b.metadata.namespace || '',\n 'en-US',\n ) ||\n (\n get(a, 'spec.profile.displayName') ||\n a.metadata.title ||\n a.metadata.name\n ).localeCompare(\n get(b, 'spec.profile.displayName') ||\n b.metadata.title ||\n b.metadata.name,\n 'en-US',\n ) ||\n a.kind.localeCompare(b.kind, 'en-US'),\n ),\n )\n .then(entities => entities)\n .catch(() => []);\n });\n\n return useAsyncFn<\n (\n request: FacetsInitialRequest | FacetsEntitiesResponse,\n options?: { limit?: number },\n ) => Promise<FacetsEntitiesResponse>\n >(\n async (request, options) => {\n const facets = await facetsPromise;\n\n if (!facets) {\n return {\n items: [],\n };\n }\n\n const limit = options?.limit ?? 20;\n\n const { text, start } = decodeCursor(request);\n const filteredRefs = facets.filter(e => filterEntity(text, e));\n const end = start + limit;\n return {\n items: filteredRefs.slice(0, end),\n ...encodeCursor({\n entities: filteredRefs,\n limit: end,\n payload: {\n text,\n start: end,\n },\n }),\n };\n },\n [facetsPromise],\n { loading: true, value: { items: [] } },\n );\n}\n\nfunction decodeCursor(\n request: FacetsInitialRequest | FacetsEntitiesResponse,\n): FacetsCursor {\n if (isFacetsResponse(request) && request.cursor) {\n return JSON.parse(atob(request.cursor));\n }\n return {\n text: (request as FacetsInitialRequest).text || '',\n start: 0,\n };\n}\n\nfunction isFacetsResponse(\n request: FacetsInitialRequest | FacetsEntitiesResponse,\n): request is FacetsEntitiesResponse {\n return !!(request as FacetsEntitiesResponse).cursor;\n}\n\nfunction encodeCursor({\n entities,\n limit,\n payload,\n}: {\n entities: Entity[];\n limit: number;\n payload: { text: string; start: number };\n}) {\n if (entities.length > limit) {\n return { cursor: btoa(JSON.stringify(payload)) };\n }\n return {};\n}\n\nfunction filterEntity(text: string, entity: Entity) {\n const normalizedText = text.trim();\n return (\n entity.kind.includes(normalizedText) ||\n entity.metadata.namespace?.includes(normalizedText) ||\n entity.metadata.name.includes(normalizedText) ||\n entity.metadata.title?.includes(normalizedText) ||\n (get(entity, 'spec.profile.displayName') as unknown as string)?.includes(\n normalizedText,\n )\n );\n}\n"],"names":[],"mappings":"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"}
@@ -19,8 +19,7 @@ const EntityTypePicker = (props) => {
19
19
  setSelectedTypes([initialFilter]);
20
20
  }
21
21
  }, [error, alertApi, initialFilter, setSelectedTypes]);
22
- if (availableTypes.length === 0 || error)
23
- return null;
22
+ if (availableTypes.length === 0 || error) return null;
24
23
  const items = [
25
24
  { value: "all", label: "all" },
26
25
  ...availableTypes.map((type) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"EntityTypePicker.esm.js","sources":["../../../src/components/EntityTypePicker/EntityTypePicker.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, { useEffect } from 'react';\nimport Box from '@material-ui/core/Box';\nimport { useEntityTypeFilter } from '../../hooks/useEntityTypeFilter';\n\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Select } from '@backstage/core-components';\n\n/**\n * Props for {@link EntityTypePicker}.\n *\n * @public\n */\nexport interface EntityTypePickerProps {\n initialFilter?: string;\n hidden?: boolean;\n}\n\n/** @public */\nexport const EntityTypePicker = (props: EntityTypePickerProps) => {\n const { hidden, initialFilter } = props;\n const alertApi = useApi(alertApiRef);\n const { error, availableTypes, selectedTypes, setSelectedTypes } =\n useEntityTypeFilter();\n\n useEffect(() => {\n if (error) {\n alertApi.post({\n message: `Failed to load entity types`,\n severity: 'error',\n });\n }\n if (initialFilter) {\n setSelectedTypes([initialFilter]);\n }\n }, [error, alertApi, initialFilter, setSelectedTypes]);\n\n if (availableTypes.length === 0 || error) return null;\n\n const items = [\n { value: 'all', label: 'all' },\n ...availableTypes.map((type: string) => ({\n value: type,\n label: type,\n })),\n ];\n\n return hidden ? null : (\n <Box pb={1} pt={1}>\n <Select\n label=\"Type\"\n items={items}\n selected={(items.length > 1 ? selectedTypes[0] : undefined) ?? 'all'}\n onChange={value =>\n setSelectedTypes(value === 'all' ? [] : [String(value)])\n }\n />\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;AAkCa,MAAA,gBAAA,GAAmB,CAAC,KAAiC,KAAA;AAChE,EAAM,MAAA,EAAE,MAAQ,EAAA,aAAA,EAAkB,GAAA,KAAA,CAAA;AAClC,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA,CAAA;AACnC,EAAA,MAAM,EAAE,KAAO,EAAA,cAAA,EAAgB,aAAe,EAAA,gBAAA,KAC5C,mBAAoB,EAAA,CAAA;AAEtB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,OAAS,EAAA,CAAA,2BAAA,CAAA;AAAA,QACT,QAAU,EAAA,OAAA;AAAA,OACX,CAAA,CAAA;AAAA,KACH;AACA,IAAA,IAAI,aAAe,EAAA;AACjB,MAAiB,gBAAA,CAAA,CAAC,aAAa,CAAC,CAAA,CAAA;AAAA,KAClC;AAAA,KACC,CAAC,KAAA,EAAO,QAAU,EAAA,aAAA,EAAe,gBAAgB,CAAC,CAAA,CAAA;AAErD,EAAI,IAAA,cAAA,CAAe,WAAW,CAAK,IAAA,KAAA;AAAO,IAAO,OAAA,IAAA,CAAA;AAEjD,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,EAAE,KAAA,EAAO,KAAO,EAAA,KAAA,EAAO,KAAM,EAAA;AAAA,IAC7B,GAAG,cAAA,CAAe,GAAI,CAAA,CAAC,IAAkB,MAAA;AAAA,MACvC,KAAO,EAAA,IAAA;AAAA,MACP,KAAO,EAAA,IAAA;AAAA,KACP,CAAA,CAAA;AAAA,GACJ,CAAA;AAEA,EAAA,OAAO,SAAS,IACd,mBAAA,KAAA,CAAA,aAAA,CAAC,OAAI,EAAI,EAAA,CAAA,EAAG,IAAI,CACd,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAM,EAAA,MAAA;AAAA,MACN,KAAA;AAAA,MACA,WAAW,KAAM,CAAA,MAAA,GAAS,IAAI,aAAc,CAAA,CAAC,IAAI,KAAc,CAAA,KAAA,KAAA;AAAA,MAC/D,QAAA,EAAU,CACR,KAAA,KAAA,gBAAA,CAAiB,KAAU,KAAA,KAAA,GAAQ,EAAC,GAAI,CAAC,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,KAAA;AAAA,GAG7D,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"EntityTypePicker.esm.js","sources":["../../../src/components/EntityTypePicker/EntityTypePicker.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, { useEffect } from 'react';\nimport Box from '@material-ui/core/Box';\nimport { useEntityTypeFilter } from '../../hooks/useEntityTypeFilter';\n\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Select } from '@backstage/core-components';\n\n/**\n * Props for {@link EntityTypePicker}.\n *\n * @public\n */\nexport interface EntityTypePickerProps {\n initialFilter?: string;\n hidden?: boolean;\n}\n\n/** @public */\nexport const EntityTypePicker = (props: EntityTypePickerProps) => {\n const { hidden, initialFilter } = props;\n const alertApi = useApi(alertApiRef);\n const { error, availableTypes, selectedTypes, setSelectedTypes } =\n useEntityTypeFilter();\n\n useEffect(() => {\n if (error) {\n alertApi.post({\n message: `Failed to load entity types`,\n severity: 'error',\n });\n }\n if (initialFilter) {\n setSelectedTypes([initialFilter]);\n }\n }, [error, alertApi, initialFilter, setSelectedTypes]);\n\n if (availableTypes.length === 0 || error) return null;\n\n const items = [\n { value: 'all', label: 'all' },\n ...availableTypes.map((type: string) => ({\n value: type,\n label: type,\n })),\n ];\n\n return hidden ? null : (\n <Box pb={1} pt={1}>\n <Select\n label=\"Type\"\n items={items}\n selected={(items.length > 1 ? selectedTypes[0] : undefined) ?? 'all'}\n onChange={value =>\n setSelectedTypes(value === 'all' ? [] : [String(value)])\n }\n />\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;AAkCa,MAAA,gBAAA,GAAmB,CAAC,KAAiC,KAAA;AAChE,EAAM,MAAA,EAAE,MAAQ,EAAA,aAAA,EAAkB,GAAA,KAAA,CAAA;AAClC,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA,CAAA;AACnC,EAAA,MAAM,EAAE,KAAO,EAAA,cAAA,EAAgB,aAAe,EAAA,gBAAA,KAC5C,mBAAoB,EAAA,CAAA;AAEtB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,OAAS,EAAA,CAAA,2BAAA,CAAA;AAAA,QACT,QAAU,EAAA,OAAA;AAAA,OACX,CAAA,CAAA;AAAA,KACH;AACA,IAAA,IAAI,aAAe,EAAA;AACjB,MAAiB,gBAAA,CAAA,CAAC,aAAa,CAAC,CAAA,CAAA;AAAA,KAClC;AAAA,KACC,CAAC,KAAA,EAAO,QAAU,EAAA,aAAA,EAAe,gBAAgB,CAAC,CAAA,CAAA;AAErD,EAAA,IAAI,cAAe,CAAA,MAAA,KAAW,CAAK,IAAA,KAAA,EAAc,OAAA,IAAA,CAAA;AAEjD,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,EAAE,KAAA,EAAO,KAAO,EAAA,KAAA,EAAO,KAAM,EAAA;AAAA,IAC7B,GAAG,cAAA,CAAe,GAAI,CAAA,CAAC,IAAkB,MAAA;AAAA,MACvC,KAAO,EAAA,IAAA;AAAA,MACP,KAAO,EAAA,IAAA;AAAA,KACP,CAAA,CAAA;AAAA,GACJ,CAAA;AAEA,EAAA,OAAO,SAAS,IACd,mBAAA,KAAA,CAAA,aAAA,CAAC,OAAI,EAAI,EAAA,CAAA,EAAG,IAAI,CACd,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAM,EAAA,MAAA;AAAA,MACN,KAAA;AAAA,MACA,WAAW,KAAM,CAAA,MAAA,GAAS,IAAI,aAAc,CAAA,CAAC,IAAI,KAAc,CAAA,KAAA,KAAA;AAAA,MAC/D,QAAA,EAAU,CACR,KAAA,KAAA,gBAAA,CAAiB,KAAU,KAAA,KAAA,GAAQ,EAAC,GAAI,CAAC,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,KAAA;AAAA,GAG7D,CAAA,CAAA;AAEJ;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-catalog-react",
3
- "version": "1.12.1-next.2",
3
+ "version": "1.12.2-next.0",
4
4
  "description": "A frontend library that helps other Backstage plugins interact with the catalog",
5
5
  "backstage": {
6
6
  "role": "web-library",
@@ -58,14 +58,14 @@
58
58
  "dependencies": {
59
59
  "@backstage/catalog-client": "^1.6.5",
60
60
  "@backstage/catalog-model": "^1.5.0",
61
- "@backstage/core-components": "^0.14.8-next.2",
62
- "@backstage/core-plugin-api": "^1.9.3-next.0",
61
+ "@backstage/core-components": "^0.14.9-next.0",
62
+ "@backstage/core-plugin-api": "^1.9.3",
63
63
  "@backstage/errors": "^1.2.4",
64
- "@backstage/frontend-plugin-api": "^0.6.6-next.2",
65
- "@backstage/integration-react": "^1.1.28-next.1",
66
- "@backstage/plugin-catalog-common": "^1.0.24-next.0",
67
- "@backstage/plugin-permission-common": "^0.7.14-next.0",
68
- "@backstage/plugin-permission-react": "^0.4.23-next.1",
64
+ "@backstage/frontend-plugin-api": "^0.6.7-next.0",
65
+ "@backstage/integration-react": "^1.1.29-next.0",
66
+ "@backstage/plugin-catalog-common": "^1.0.24",
67
+ "@backstage/plugin-permission-common": "^0.7.14",
68
+ "@backstage/plugin-permission-react": "^0.4.23",
69
69
  "@backstage/types": "^1.1.1",
70
70
  "@backstage/version-bridge": "^1.0.8",
71
71
  "@material-ui/core": "^4.12.2",
@@ -82,11 +82,11 @@
82
82
  "zen-observable": "^0.10.0"
83
83
  },
84
84
  "devDependencies": {
85
- "@backstage/cli": "^0.26.7-next.3",
86
- "@backstage/core-app-api": "^1.12.6-next.0",
87
- "@backstage/plugin-catalog-common": "^1.0.24-next.0",
88
- "@backstage/plugin-scaffolder-common": "^1.5.3-next.1",
89
- "@backstage/test-utils": "^1.5.6-next.2",
85
+ "@backstage/cli": "^0.26.10-next.0",
86
+ "@backstage/core-app-api": "^1.13.0-next.0",
87
+ "@backstage/plugin-catalog-common": "^1.0.24",
88
+ "@backstage/plugin-scaffolder-common": "^1.5.3",
89
+ "@backstage/test-utils": "^1.5.7-next.0",
90
90
  "@testing-library/dom": "^10.0.0",
91
91
  "@testing-library/jest-dom": "^6.0.0",
92
92
  "@testing-library/react": "^15.0.0",