@backstage/plugin-catalog-react 0.6.7 → 0.6.11

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,48 @@
1
1
  # @backstage/plugin-catalog-react
2
2
 
3
+ ## 0.6.11
4
+
5
+ ### Patch Changes
6
+
7
+ - 5333451def: Cleaned up API exports
8
+ - Updated dependencies
9
+ - @backstage/integration@0.7.1
10
+ - @backstage/core-components@0.8.4
11
+ - @backstage/core-plugin-api@0.5.0
12
+ - @backstage/errors@0.2.0
13
+ - @backstage/catalog-client@0.5.4
14
+ - @backstage/catalog-model@0.9.9
15
+
16
+ ## 0.6.10
17
+
18
+ ### Patch Changes
19
+
20
+ - fe2a6532ff: Add Override Components for Components in @backstage/plugin-catalog-react
21
+ - 4ce51ab0f1: Internal refactor of the `react-use` imports to use `react-use/lib/*` instead.
22
+ - Updated dependencies
23
+ - @backstage/core-plugin-api@0.4.1
24
+ - @backstage/core-components@0.8.3
25
+
26
+ ## 0.6.9
27
+
28
+ ### Patch Changes
29
+
30
+ - c6fdddec77: When a user has zero owned entities when viewing an entity kind in the catalog
31
+ page, it will be automatically redirected to see all the entities. Furthermore,
32
+ for the kind User and Group there are no longer the owned selector.
33
+ - Updated dependencies
34
+ - @backstage/integration@0.7.0
35
+
36
+ ## 0.6.8
37
+
38
+ ### Patch Changes
39
+
40
+ - 3491a36ab9: added useOwnedEntities hook to get the list of entities of the logged-in user
41
+ - Updated dependencies
42
+ - @backstage/core-plugin-api@0.4.0
43
+ - @backstage/core-components@0.8.2
44
+ - @backstage/catalog-client@0.5.3
45
+
3
46
  ## 0.6.7
4
47
 
5
48
  ### Patch Changes
package/dist/index.cjs.js CHANGED
@@ -11,11 +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');
23
+ var useObservable = require('react-use/lib/useObservable');
19
24
  var jwtDecoder = require('jwt-decode');
20
25
  var CheckBoxIcon = require('@material-ui/icons/CheckBox');
21
26
  var CheckBoxOutlineBlankIcon = require('@material-ui/icons/CheckBoxOutlineBlank');
@@ -33,8 +38,14 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
33
38
 
34
39
  var ObservableImpl__default = /*#__PURE__*/_interopDefaultLegacy(ObservableImpl);
35
40
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
41
+ var useAsyncRetry__default = /*#__PURE__*/_interopDefaultLegacy(useAsyncRetry);
36
42
  var qs__default = /*#__PURE__*/_interopDefaultLegacy(qs);
43
+ var useAsyncFn__default = /*#__PURE__*/_interopDefaultLegacy(useAsyncFn);
44
+ var useDebounce__default = /*#__PURE__*/_interopDefaultLegacy(useDebounce);
45
+ var useMountedState__default = /*#__PURE__*/_interopDefaultLegacy(useMountedState);
46
+ var useAsync__default = /*#__PURE__*/_interopDefaultLegacy(useAsync);
37
47
  var isEqual__default = /*#__PURE__*/_interopDefaultLegacy(isEqual);
48
+ var useObservable__default = /*#__PURE__*/_interopDefaultLegacy(useObservable);
38
49
  var jwtDecoder__default = /*#__PURE__*/_interopDefaultLegacy(jwtDecoder);
39
50
  var CheckBoxIcon__default = /*#__PURE__*/_interopDefaultLegacy(CheckBoxIcon);
40
51
  var CheckBoxOutlineBlankIcon__default = /*#__PURE__*/_interopDefaultLegacy(CheckBoxOutlineBlankIcon);
@@ -187,7 +198,7 @@ const useEntityFromUrl = () => {
187
198
  error,
188
199
  loading,
189
200
  retry: refresh
190
- } = reactUse.useAsyncRetry(() => catalogApi.getEntityByName({ kind, namespace, name }), [catalogApi, kind, namespace, name]);
201
+ } = useAsyncRetry__default["default"](() => catalogApi.getEntityByName({ kind, namespace, name }), [catalogApi, kind, namespace, name]);
191
202
  React.useEffect(() => {
192
203
  if (!name) {
193
204
  errorApi.post(new Error("No name provided!"));
@@ -281,7 +292,7 @@ const EntityListContext = React.createContext(void 0);
281
292
  const EntityListProvider = ({
282
293
  children
283
294
  }) => {
284
- const isMounted = reactUse.useMountedState();
295
+ const isMounted = useMountedState__default["default"]();
285
296
  const catalogApi = corePluginApi.useApi(catalogApiRef);
286
297
  const [requestedFilters, setRequestedFilters] = React.useState({});
287
298
  const [outputState, setOutputState] = React.useState(() => {
@@ -296,7 +307,7 @@ const EntityListProvider = ({
296
307
  queryParameters: (_a = query.filters) != null ? _a : {}
297
308
  };
298
309
  });
299
- const [{ loading, error }, refresh] = reactUse.useAsyncFn(async () => {
310
+ const [{ loading, error }, refresh] = useAsyncFn__default["default"](async () => {
300
311
  var _a;
301
312
  const compacted = lodash.compact(Object.values(requestedFilters));
302
313
  const entityFilter = reduceEntityFilters(compacted);
@@ -336,7 +347,7 @@ const EntityListProvider = ({
336
347
  (_a = window.history) == null ? void 0 : _a.replaceState(null, document.title, newUrl);
337
348
  }
338
349
  }, [catalogApi, requestedFilters, outputState], { loading: true });
339
- reactUse.useDebounce(refresh, 10, [requestedFilters]);
350
+ useDebounce__default["default"](refresh, 10, [requestedFilters]);
340
351
  const updateFilters = React.useCallback((update) => {
341
352
  setRequestedFilters((prevFilters) => {
342
353
  const newFilters = typeof update === "function" ? update(prevFilters) : update;
@@ -546,7 +557,7 @@ function useEntityTypeFilter() {
546
557
  error,
547
558
  loading,
548
559
  value: entities
549
- } = reactUse.useAsync(async () => {
560
+ } = useAsync__default["default"](async () => {
550
561
  if (kind) {
551
562
  const items = await catalogApi.getEntities({
552
563
  filter: { kind },
@@ -603,7 +614,7 @@ function useEntityKinds() {
603
614
  error,
604
615
  loading,
605
616
  value: kinds
606
- } = reactUse.useAsync(async () => {
617
+ } = useAsync__default["default"](async () => {
607
618
  const entities = await catalogApi.getEntities({ fields: ["kind"] }).then((response) => response.items);
608
619
  return [...new Set(entities.map((e) => e.kind))].sort();
609
620
  });
@@ -613,7 +624,7 @@ function useEntityKinds() {
613
624
  function useOwnUser() {
614
625
  const catalogApi = corePluginApi.useApi(catalogApiRef);
615
626
  const identityApi = corePluginApi.useApi(corePluginApi.identityApiRef);
616
- return reactUse.useAsync(() => catalogApi.getEntityByName({
627
+ return useAsync__default["default"](() => catalogApi.getEntityByName({
617
628
  kind: "User",
618
629
  namespace: "default",
619
630
  name: identityApi.getUserId()
@@ -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 {
@@ -749,7 +760,7 @@ async function loadCatalogOwnerRefs(catalogApi, identityOwnerRefs) {
749
760
  function useEntityOwnership() {
750
761
  const identityApi = corePluginApi.useApi(corePluginApi.identityApiRef);
751
762
  const catalogApi = corePluginApi.useApi(catalogApiRef);
752
- const { loading, value: refs } = reactUse.useAsync(async () => {
763
+ const { loading, value: refs } = useAsync__default["default"](async () => {
753
764
  const identityRefs = await loadIdentityOwnerRefs(identityApi);
754
765
  const catalogRefs = await loadCatalogOwnerRefs(catalogApi, identityRefs);
755
766
  return /* @__PURE__ */ new Set([...identityRefs, ...catalogRefs]);
@@ -769,6 +780,30 @@ function useEntityOwnership() {
769
780
  return React.useMemo(() => ({ loading, isOwnedEntity }), [loading, isOwnedEntity]);
770
781
  }
771
782
 
783
+ function useOwnedEntities(allowedKinds) {
784
+ const identityApi = corePluginApi.useApi(corePluginApi.identityApiRef);
785
+ const catalogApi = corePluginApi.useApi(catalogApiRef);
786
+ const { loading, value: refs } = useAsync__default["default"](async () => {
787
+ const identityRefs = await loadIdentityOwnerRefs(identityApi);
788
+ const catalogRefs = await loadCatalogOwnerRefs(catalogApi, identityRefs);
789
+ const catalogs = await catalogApi.getEntities(allowedKinds ? {
790
+ filter: {
791
+ kind: allowedKinds,
792
+ [`relations.${catalogModel.RELATION_OWNED_BY}`]: [...identityRefs, ...catalogRefs]
793
+ }
794
+ } : {
795
+ filter: {
796
+ [`relations.${catalogModel.RELATION_OWNED_BY}`]: [...identityRefs, ...catalogRefs]
797
+ }
798
+ });
799
+ return catalogs;
800
+ }, []);
801
+ const ownedEntities = React.useMemo(() => {
802
+ return refs;
803
+ }, [refs]);
804
+ return React.useMemo(() => ({ loading, ownedEntities }), [loading, ownedEntities]);
805
+ }
806
+
772
807
  const EntityKindPicker = ({
773
808
  initialFilter,
774
809
  hidden
@@ -921,7 +956,7 @@ const EntitySearchBar = () => {
921
956
  const classes = useStyles$4();
922
957
  const { filters, updateFilters } = useEntityListProvider();
923
958
  const [search, setSearch] = React.useState((_b = (_a = filters.text) == null ? void 0 : _a.value) != null ? _b : "");
924
- reactUse.useDebounce(() => {
959
+ useDebounce__default["default"](() => {
925
960
  updateFilters({
926
961
  text: search.length ? new EntityTextFilter(search) : void 0
927
962
  });
@@ -1244,7 +1279,7 @@ function useUnregisterEntityDialogState(entity) {
1244
1279
  const locationRef = (_a = entity.metadata.annotations) == null ? void 0 : _a[catalogModel.ORIGIN_LOCATION_ANNOTATION];
1245
1280
  const uid = entity.metadata.uid;
1246
1281
  const isBootstrap = locationRef === "bootstrap:bootstrap";
1247
- const prerequisites = reactUse.useAsync(async () => {
1282
+ const prerequisites = useAsync__default["default"](async () => {
1248
1283
  const locationPromise = catalogApi.getOriginLocationByEntity(entity);
1249
1284
  let colocatedEntitiesPromise;
1250
1285
  if (!locationRef) {
@@ -1493,22 +1528,24 @@ const UserListPicker = ({
1493
1528
  const classes = useStyles();
1494
1529
  const configApi = corePluginApi.useApi(corePluginApi.configApiRef);
1495
1530
  const orgName = (_a = configApi.getOptionalString("organization.name")) != null ? _a : "Company";
1531
+ const { filters, updateFilters, backendEntities, queryParameters } = useEntityListProvider();
1532
+ const userAndGroupFilterIds = ["starred", "all"];
1496
1533
  const filterGroups = getFilterGroups(orgName).map((filterGroup) => ({
1497
1534
  ...filterGroup,
1498
- items: filterGroup.items.filter(({ id }) => !availableFilters || availableFilters.includes(id))
1535
+ items: filterGroup.items.filter(({ id }) => ["group", "user"].some((kind) => kind === queryParameters.kind) ? userAndGroupFilterIds.includes(id) : !availableFilters || availableFilters.includes(id))
1499
1536
  })).filter(({ items }) => !!items.length);
1500
- const { filters, updateFilters, backendEntities, queryParameters } = useEntityListProvider();
1501
1537
  const { isStarredEntity } = useStarredEntities();
1502
1538
  const { isOwnedEntity } = useEntityOwnership();
1503
- const [selectedUserFilter, setSelectedUserFilter] = React.useState((_b = [queryParameters.user].flat()[0]) != null ? _b : initialFilter);
1504
1539
  const ownedFilter = React.useMemo(() => new UserListFilter("owned", isOwnedEntity, isStarredEntity), [isOwnedEntity, isStarredEntity]);
1505
1540
  const starredFilter = React.useMemo(() => new UserListFilter("starred", isOwnedEntity, isStarredEntity), [isOwnedEntity, isStarredEntity]);
1541
+ const [entitiesWithoutUserFilter, setEntitiesWithoutUserFilter] = React.useState(backendEntities);
1542
+ const totalOwnedUserEntities = entitiesWithoutUserFilter.filter((entity) => ownedFilter.filterEntity(entity)).length;
1543
+ const [selectedUserFilter, setSelectedUserFilter] = React.useState(totalOwnedUserEntities > 0 ? (_b = [queryParameters.user].flat()[0]) != null ? _b : initialFilter : "all");
1506
1544
  React.useEffect(() => {
1507
1545
  updateFilters({
1508
1546
  user: selectedUserFilter ? new UserListFilter(selectedUserFilter, isOwnedEntity, isStarredEntity) : void 0
1509
1547
  });
1510
1548
  }, [selectedUserFilter, isOwnedEntity, isStarredEntity, updateFilters]);
1511
- const [entitiesWithoutUserFilter, setEntitiesWithoutUserFilter] = React.useState(backendEntities);
1512
1549
  React.useEffect(() => {
1513
1550
  const filterFn = reduceEntityFilters(lodash.compact(Object.values({ ...filters, user: void 0 })));
1514
1551
  setEntitiesWithoutUserFilter(backendEntities.filter(filterFn));
@@ -1516,7 +1553,7 @@ const UserListPicker = ({
1516
1553
  function getFilterCount(id) {
1517
1554
  switch (id) {
1518
1555
  case "owned":
1519
- return entitiesWithoutUserFilter.filter((entity) => ownedFilter.filterEntity(entity)).length;
1556
+ return totalOwnedUserEntities;
1520
1557
  case "starred":
1521
1558
  return entitiesWithoutUserFilter.filter((entity) => starredFilter.filterEntity(entity)).length;
1522
1559
  default:
@@ -1638,6 +1675,7 @@ exports.useEntityListProvider = useEntityListProvider;
1638
1675
  exports.useEntityOwnership = useEntityOwnership;
1639
1676
  exports.useEntityTypeFilter = useEntityTypeFilter;
1640
1677
  exports.useOwnUser = useOwnUser;
1678
+ exports.useOwnedEntities = useOwnedEntities;
1641
1679
  exports.useRelatedEntities = useRelatedEntities;
1642
1680
  exports.useStarredEntities = useStarredEntities;
1643
1681
  exports.useStarredEntity = useStarredEntity;