@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 +46 -0
- package/dist/index.cjs.js +43 -55
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +32 -9
- package/dist/index.esm.js +25 -42
- package/dist/index.esm.js.map +1 -1
- package/package.json +11 -11
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
|
|
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
|
|
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
|
|
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
|
-
} =
|
|
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 =
|
|
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] =
|
|
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
|
-
|
|
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
|
-
} =
|
|
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
|
-
} =
|
|
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
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
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
|
-
} =
|
|
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 {
|
|
@@ -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
|
|
717
|
-
|
|
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 } =
|
|
753
|
-
const
|
|
754
|
-
const catalogRefs = await loadCatalogOwnerRefs(catalogApi,
|
|
755
|
-
return /* @__PURE__ */ new Set([...
|
|
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 } =
|
|
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
|
-
|
|
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 =
|
|
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
|
|
1531
|
+
return totalOwnedUserEntities;
|
|
1544
1532
|
case "starred":
|
|
1545
1533
|
return entitiesWithoutUserFilter.filter((entity) => starredFilter.filterEntity(entity)).length;
|
|
1546
1534
|
default:
|