@backstage/plugin-catalog-react 0.6.8 → 0.6.12-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,51 @@
1
1
  # @backstage/plugin-catalog-react
2
2
 
3
+ ## 0.6.12-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 2916a83b9c: Deprecated `loadIdentityOwnerRefs`, since they can now be retrieved as `ownershipEntityRefs` from `identityApi.getBackstageIdentity()` instead.
8
+ - 51fbedc445: Migrated usage of deprecated `IdentityApi` methods.
9
+ - Updated dependencies
10
+ - @backstage/core-components@0.8.5-next.0
11
+ - @backstage/core-plugin-api@0.6.0-next.0
12
+ - @backstage/catalog-model@0.9.10-next.0
13
+ - @backstage/catalog-client@0.5.5-next.0
14
+ - @backstage/integration@0.7.2-next.0
15
+
16
+ ## 0.6.11
17
+
18
+ ### Patch Changes
19
+
20
+ - 5333451def: Cleaned up API exports
21
+ - Updated dependencies
22
+ - @backstage/integration@0.7.1
23
+ - @backstage/core-components@0.8.4
24
+ - @backstage/core-plugin-api@0.5.0
25
+ - @backstage/errors@0.2.0
26
+ - @backstage/catalog-client@0.5.4
27
+ - @backstage/catalog-model@0.9.9
28
+
29
+ ## 0.6.10
30
+
31
+ ### Patch Changes
32
+
33
+ - fe2a6532ff: Add Override Components for Components in @backstage/plugin-catalog-react
34
+ - 4ce51ab0f1: Internal refactor of the `react-use` imports to use `react-use/lib/*` instead.
35
+ - Updated dependencies
36
+ - @backstage/core-plugin-api@0.4.1
37
+ - @backstage/core-components@0.8.3
38
+
39
+ ## 0.6.9
40
+
41
+ ### Patch Changes
42
+
43
+ - c6fdddec77: When a user has zero owned entities when viewing an entity kind in the catalog
44
+ page, it will be automatically redirected to see all the entities. Furthermore,
45
+ for the kind User and Group there are no longer the owned selector.
46
+ - Updated dependencies
47
+ - @backstage/integration@0.7.0
48
+
3
49
  ## 0.6.8
4
50
 
5
51
  ### Patch Changes
package/dist/index.cjs.js CHANGED
@@ -11,12 +11,16 @@ var React = require('react');
11
11
  var lab = require('@material-ui/lab');
12
12
  var versionBridge = require('@backstage/version-bridge');
13
13
  var reactRouter = require('react-router');
14
- var reactUse = require('react-use');
14
+ var useAsyncRetry = require('react-use/lib/useAsyncRetry');
15
15
  var qs = require('qs');
16
+ var useAsyncFn = require('react-use/lib/useAsyncFn');
17
+ var useDebounce = require('react-use/lib/useDebounce');
18
+ var useMountedState = require('react-use/lib/useMountedState');
19
+ var useAsync = require('react-use/lib/useAsync');
16
20
  var isEqual = require('lodash/isEqual');
17
21
  var coreComponents = require('@backstage/core-components');
18
22
  var core = require('@material-ui/core');
19
- var jwtDecoder = require('jwt-decode');
23
+ var useObservable = require('react-use/lib/useObservable');
20
24
  var CheckBoxIcon = require('@material-ui/icons/CheckBox');
21
25
  var CheckBoxOutlineBlankIcon = require('@material-ui/icons/CheckBoxOutlineBlank');
22
26
  var ExpandMoreIcon = require('@material-ui/icons/ExpandMore');
@@ -33,9 +37,14 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
33
37
 
34
38
  var ObservableImpl__default = /*#__PURE__*/_interopDefaultLegacy(ObservableImpl);
35
39
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
40
+ var useAsyncRetry__default = /*#__PURE__*/_interopDefaultLegacy(useAsyncRetry);
36
41
  var qs__default = /*#__PURE__*/_interopDefaultLegacy(qs);
42
+ var useAsyncFn__default = /*#__PURE__*/_interopDefaultLegacy(useAsyncFn);
43
+ var useDebounce__default = /*#__PURE__*/_interopDefaultLegacy(useDebounce);
44
+ var useMountedState__default = /*#__PURE__*/_interopDefaultLegacy(useMountedState);
45
+ var useAsync__default = /*#__PURE__*/_interopDefaultLegacy(useAsync);
37
46
  var isEqual__default = /*#__PURE__*/_interopDefaultLegacy(isEqual);
38
- var jwtDecoder__default = /*#__PURE__*/_interopDefaultLegacy(jwtDecoder);
47
+ var useObservable__default = /*#__PURE__*/_interopDefaultLegacy(useObservable);
39
48
  var CheckBoxIcon__default = /*#__PURE__*/_interopDefaultLegacy(CheckBoxIcon);
40
49
  var CheckBoxOutlineBlankIcon__default = /*#__PURE__*/_interopDefaultLegacy(CheckBoxOutlineBlankIcon);
41
50
  var ExpandMoreIcon__default = /*#__PURE__*/_interopDefaultLegacy(ExpandMoreIcon);
@@ -187,7 +196,7 @@ const useEntityFromUrl = () => {
187
196
  error,
188
197
  loading,
189
198
  retry: refresh
190
- } = reactUse.useAsyncRetry(() => catalogApi.getEntityByName({ kind, namespace, name }), [catalogApi, kind, namespace, name]);
199
+ } = useAsyncRetry__default["default"](() => catalogApi.getEntityByName({ kind, namespace, name }), [catalogApi, kind, namespace, name]);
191
200
  React.useEffect(() => {
192
201
  if (!name) {
193
202
  errorApi.post(new Error("No name provided!"));
@@ -281,7 +290,7 @@ const EntityListContext = React.createContext(void 0);
281
290
  const EntityListProvider = ({
282
291
  children
283
292
  }) => {
284
- const isMounted = reactUse.useMountedState();
293
+ const isMounted = useMountedState__default["default"]();
285
294
  const catalogApi = corePluginApi.useApi(catalogApiRef);
286
295
  const [requestedFilters, setRequestedFilters] = React.useState({});
287
296
  const [outputState, setOutputState] = React.useState(() => {
@@ -296,7 +305,7 @@ const EntityListProvider = ({
296
305
  queryParameters: (_a = query.filters) != null ? _a : {}
297
306
  };
298
307
  });
299
- const [{ loading, error }, refresh] = reactUse.useAsyncFn(async () => {
308
+ const [{ loading, error }, refresh] = useAsyncFn__default["default"](async () => {
300
309
  var _a;
301
310
  const compacted = lodash.compact(Object.values(requestedFilters));
302
311
  const entityFilter = reduceEntityFilters(compacted);
@@ -336,7 +345,7 @@ const EntityListProvider = ({
336
345
  (_a = window.history) == null ? void 0 : _a.replaceState(null, document.title, newUrl);
337
346
  }
338
347
  }, [catalogApi, requestedFilters, outputState], { loading: true });
339
- reactUse.useDebounce(refresh, 10, [requestedFilters]);
348
+ useDebounce__default["default"](refresh, 10, [requestedFilters]);
340
349
  const updateFilters = React.useCallback((update) => {
341
350
  setRequestedFilters((prevFilters) => {
342
351
  const newFilters = typeof update === "function" ? update(prevFilters) : update;
@@ -546,7 +555,7 @@ function useEntityTypeFilter() {
546
555
  error,
547
556
  loading,
548
557
  value: entities
549
- } = reactUse.useAsync(async () => {
558
+ } = useAsync__default["default"](async () => {
550
559
  if (kind) {
551
560
  const items = await catalogApi.getEntities({
552
561
  filter: { kind },
@@ -603,7 +612,7 @@ function useEntityKinds() {
603
612
  error,
604
613
  loading,
605
614
  value: kinds
606
- } = reactUse.useAsync(async () => {
615
+ } = useAsync__default["default"](async () => {
607
616
  const entities = await catalogApi.getEntities({ fields: ["kind"] }).then((response) => response.items);
608
617
  return [...new Set(entities.map((e) => e.kind))].sort();
609
618
  });
@@ -613,11 +622,13 @@ function useEntityKinds() {
613
622
  function useOwnUser() {
614
623
  const catalogApi = corePluginApi.useApi(catalogApiRef);
615
624
  const identityApi = corePluginApi.useApi(corePluginApi.identityApiRef);
616
- return reactUse.useAsync(() => catalogApi.getEntityByName({
617
- kind: "User",
618
- namespace: "default",
619
- name: identityApi.getUserId()
620
- }), [catalogApi, identityApi]);
625
+ return useAsync__default["default"](async () => {
626
+ const identity = await identityApi.getBackstageIdentity();
627
+ return catalogApi.getEntityByName(catalogModel.parseEntityRef(identity.userEntityRef, {
628
+ defaultKind: "User",
629
+ defaultNamespace: catalogModel.ENTITY_DEFAULT_NAMESPACE
630
+ }));
631
+ }, [catalogApi, identityApi]);
621
632
  }
622
633
 
623
634
  const BATCH_SIZE = 20;
@@ -627,7 +638,7 @@ function useRelatedEntities(entity, { type, kind }) {
627
638
  loading,
628
639
  value: entities,
629
640
  error
630
- } = reactUse.useAsync(async () => {
641
+ } = useAsync__default["default"](async () => {
631
642
  const relations = entity.relations && entity.relations.filter((r) => (!type || r.type.toLocaleLowerCase("en-US") === type.toLocaleLowerCase("en-US")) && (!kind || r.target.kind.toLocaleLowerCase("en-US") === kind.toLocaleLowerCase("en-US")));
632
643
  if (!relations) {
633
644
  return [];
@@ -668,7 +679,7 @@ function getEntityRef$1(entityOrRef) {
668
679
  }
669
680
  function useStarredEntities() {
670
681
  const starredEntitiesApi = corePluginApi.useApi(starredEntitiesApiRef);
671
- const starredEntities = reactUse.useObservable(starredEntitiesApi.starredEntitie$(), /* @__PURE__ */ new Set());
682
+ const starredEntities = useObservable__default["default"](starredEntitiesApi.starredEntitie$(), /* @__PURE__ */ new Set());
672
683
  const isStarredEntity = React.useCallback((entityOrRef) => starredEntities.has(getEntityRef$1(entityOrRef)), [starredEntities]);
673
684
  const toggleStarredEntity = React.useCallback((entityOrRef) => starredEntitiesApi.toggleStarred(getEntityRef$1(entityOrRef)).then(), [starredEntitiesApi]);
674
685
  return {
@@ -701,34 +712,9 @@ function useStarredEntity(entityOrRef) {
701
712
  };
702
713
  }
703
714
 
704
- function extendUserId(id) {
705
- try {
706
- const ref = catalogModel.parseEntityRef(id, {
707
- defaultKind: "User",
708
- defaultNamespace: "default"
709
- });
710
- return catalogModel.stringifyEntityRef(ref);
711
- } catch {
712
- return id;
713
- }
714
- }
715
715
  async function loadIdentityOwnerRefs(identityApi) {
716
- const id = identityApi.getUserId();
717
- const token = await identityApi.getIdToken();
718
- const result = [];
719
- if (id) {
720
- result.push(extendUserId(id));
721
- }
722
- if (token) {
723
- try {
724
- const decoded = jwtDecoder__default["default"](token);
725
- if (decoded == null ? void 0 : decoded.ent) {
726
- [decoded.ent].flat().filter((x) => typeof x === "string").map((x) => x.toLocaleLowerCase("en-US")).forEach((x) => result.push(x));
727
- }
728
- } catch {
729
- }
730
- }
731
- return result;
716
+ const identity = await identityApi.getBackstageIdentity();
717
+ return identity.ownershipEntityRefs;
732
718
  }
733
719
  async function loadCatalogOwnerRefs(catalogApi, identityOwnerRefs) {
734
720
  const result = new Array();
@@ -749,10 +735,10 @@ async function loadCatalogOwnerRefs(catalogApi, identityOwnerRefs) {
749
735
  function useEntityOwnership() {
750
736
  const identityApi = corePluginApi.useApi(corePluginApi.identityApiRef);
751
737
  const catalogApi = corePluginApi.useApi(catalogApiRef);
752
- const { loading, value: refs } = reactUse.useAsync(async () => {
753
- const identityRefs = await loadIdentityOwnerRefs(identityApi);
754
- const catalogRefs = await loadCatalogOwnerRefs(catalogApi, identityRefs);
755
- return /* @__PURE__ */ new Set([...identityRefs, ...catalogRefs]);
738
+ const { loading, value: refs } = useAsync__default["default"](async () => {
739
+ const { ownershipEntityRefs } = await identityApi.getBackstageIdentity();
740
+ const catalogRefs = await loadCatalogOwnerRefs(catalogApi, ownershipEntityRefs);
741
+ return /* @__PURE__ */ new Set([...ownershipEntityRefs, ...catalogRefs]);
756
742
  }, []);
757
743
  const isOwnedEntity = React.useMemo(() => {
758
744
  const myOwnerRefs = new Set(refs != null ? refs : []);
@@ -772,7 +758,7 @@ function useEntityOwnership() {
772
758
  function useOwnedEntities(allowedKinds) {
773
759
  const identityApi = corePluginApi.useApi(corePluginApi.identityApiRef);
774
760
  const catalogApi = corePluginApi.useApi(catalogApiRef);
775
- const { loading, value: refs } = reactUse.useAsync(async () => {
761
+ const { loading, value: refs } = useAsync__default["default"](async () => {
776
762
  const identityRefs = await loadIdentityOwnerRefs(identityApi);
777
763
  const catalogRefs = await loadCatalogOwnerRefs(catalogApi, identityRefs);
778
764
  const catalogs = await catalogApi.getEntities(allowedKinds ? {
@@ -945,7 +931,7 @@ const EntitySearchBar = () => {
945
931
  const classes = useStyles$4();
946
932
  const { filters, updateFilters } = useEntityListProvider();
947
933
  const [search, setSearch] = React.useState((_b = (_a = filters.text) == null ? void 0 : _a.value) != null ? _b : "");
948
- reactUse.useDebounce(() => {
934
+ useDebounce__default["default"](() => {
949
935
  updateFilters({
950
936
  text: search.length ? new EntityTextFilter(search) : void 0
951
937
  });
@@ -1268,7 +1254,7 @@ function useUnregisterEntityDialogState(entity) {
1268
1254
  const locationRef = (_a = entity.metadata.annotations) == null ? void 0 : _a[catalogModel.ORIGIN_LOCATION_ANNOTATION];
1269
1255
  const uid = entity.metadata.uid;
1270
1256
  const isBootstrap = locationRef === "bootstrap:bootstrap";
1271
- const prerequisites = reactUse.useAsync(async () => {
1257
+ const prerequisites = useAsync__default["default"](async () => {
1272
1258
  const locationPromise = catalogApi.getOriginLocationByEntity(entity);
1273
1259
  let colocatedEntitiesPromise;
1274
1260
  if (!locationRef) {
@@ -1517,22 +1503,24 @@ const UserListPicker = ({
1517
1503
  const classes = useStyles();
1518
1504
  const configApi = corePluginApi.useApi(corePluginApi.configApiRef);
1519
1505
  const orgName = (_a = configApi.getOptionalString("organization.name")) != null ? _a : "Company";
1506
+ const { filters, updateFilters, backendEntities, queryParameters } = useEntityListProvider();
1507
+ const userAndGroupFilterIds = ["starred", "all"];
1520
1508
  const filterGroups = getFilterGroups(orgName).map((filterGroup) => ({
1521
1509
  ...filterGroup,
1522
- items: filterGroup.items.filter(({ id }) => !availableFilters || availableFilters.includes(id))
1510
+ items: filterGroup.items.filter(({ id }) => ["group", "user"].some((kind) => kind === queryParameters.kind) ? userAndGroupFilterIds.includes(id) : !availableFilters || availableFilters.includes(id))
1523
1511
  })).filter(({ items }) => !!items.length);
1524
- const { filters, updateFilters, backendEntities, queryParameters } = useEntityListProvider();
1525
1512
  const { isStarredEntity } = useStarredEntities();
1526
1513
  const { isOwnedEntity } = useEntityOwnership();
1527
- const [selectedUserFilter, setSelectedUserFilter] = React.useState((_b = [queryParameters.user].flat()[0]) != null ? _b : initialFilter);
1528
1514
  const ownedFilter = React.useMemo(() => new UserListFilter("owned", isOwnedEntity, isStarredEntity), [isOwnedEntity, isStarredEntity]);
1529
1515
  const starredFilter = React.useMemo(() => new UserListFilter("starred", isOwnedEntity, isStarredEntity), [isOwnedEntity, isStarredEntity]);
1516
+ const [entitiesWithoutUserFilter, setEntitiesWithoutUserFilter] = React.useState(backendEntities);
1517
+ const totalOwnedUserEntities = entitiesWithoutUserFilter.filter((entity) => ownedFilter.filterEntity(entity)).length;
1518
+ const [selectedUserFilter, setSelectedUserFilter] = React.useState(totalOwnedUserEntities > 0 ? (_b = [queryParameters.user].flat()[0]) != null ? _b : initialFilter : "all");
1530
1519
  React.useEffect(() => {
1531
1520
  updateFilters({
1532
1521
  user: selectedUserFilter ? new UserListFilter(selectedUserFilter, isOwnedEntity, isStarredEntity) : void 0
1533
1522
  });
1534
1523
  }, [selectedUserFilter, isOwnedEntity, isStarredEntity, updateFilters]);
1535
- const [entitiesWithoutUserFilter, setEntitiesWithoutUserFilter] = React.useState(backendEntities);
1536
1524
  React.useEffect(() => {
1537
1525
  const filterFn = reduceEntityFilters(lodash.compact(Object.values({ ...filters, user: void 0 })));
1538
1526
  setEntitiesWithoutUserFilter(backendEntities.filter(filterFn));
@@ -1540,7 +1528,7 @@ const UserListPicker = ({
1540
1528
  function getFilterCount(id) {
1541
1529
  switch (id) {
1542
1530
  case "owned":
1543
- return entitiesWithoutUserFilter.filter((entity) => ownedFilter.filterEntity(entity)).length;
1531
+ return totalOwnedUserEntities;
1544
1532
  case "starred":
1545
1533
  return entitiesWithoutUserFilter.filter((entity) => starredFilter.filterEntity(entity)).length;
1546
1534
  default: