@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 +43 -0
- package/dist/index.cjs.js +56 -18
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +47 -10
- package/dist/index.esm.js +38 -7
- package/dist/index.esm.js.map +1 -1
- package/package.json +11 -11
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
|
|
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
|
-
} =
|
|
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 =
|
|
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] =
|
|
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
|
-
|
|
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
|
-
} =
|
|
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
|
-
} =
|
|
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
|
|
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
|
-
} =
|
|
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 =
|
|
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 } =
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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;
|