@backstage/plugin-catalog-react 1.21.6 → 1.22.0-next.1
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 +36 -8
- package/dist/alpha/blueprints/extensionData.esm.js +0 -1
- package/dist/alpha/blueprints/extensionData.esm.js.map +1 -1
- package/dist/alpha.d.ts +3 -3
- package/dist/components/UnregisterEntityDialog/UnregisterEntityDialog.esm.js +235 -168
- package/dist/components/UnregisterEntityDialog/UnregisterEntityDialog.esm.js.map +1 -1
- package/dist/hooks/useEntityListProvider.esm.js +4 -2
- package/dist/hooks/useEntityListProvider.esm.js.map +1 -1
- package/package.json +21 -20
package/CHANGELOG.md
CHANGED
|
@@ -1,17 +1,45 @@
|
|
|
1
1
|
# @backstage/plugin-catalog-react
|
|
2
2
|
|
|
3
|
-
## 1.
|
|
3
|
+
## 1.22.0-next.1
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 0e9578d: Migrated `UnregisterEntityDialog` from Material UI to Backstage UI components.
|
|
8
|
+
- e8258d0: **BREAKING**: Removed the 'summary' entity card type from `EntityCardType`. Users should migrate to using 'content' or 'info' card types instead.
|
|
9
|
+
|
|
10
|
+
TypeScript will now show errors if you try to use `type: 'summary'` when creating entity cards.
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- Updated dependencies
|
|
15
|
+
- @backstage/frontend-test-utils@0.4.6-next.1
|
|
16
|
+
- @backstage/ui@0.12.0-next.1
|
|
17
|
+
- @backstage/frontend-plugin-api@0.14.0-next.1
|
|
18
|
+
- @backstage/core-compat-api@0.5.8-next.1
|
|
19
|
+
- @backstage/core-components@0.18.7-next.1
|
|
20
|
+
- @backstage/integration-react@1.2.15-next.1
|
|
21
|
+
|
|
22
|
+
## 1.21.6-next.0
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
|
6
25
|
|
|
7
|
-
-
|
|
26
|
+
- f523983: Fixes a bug where the `EntityListProvider` would not correctly hydrate query parameters if more than 20 were provided for the same key.
|
|
27
|
+
- 69d880e: Bump to latest zod to ensure it has the latest features
|
|
8
28
|
- Updated dependencies
|
|
9
|
-
- @backstage/
|
|
10
|
-
- @backstage/
|
|
11
|
-
- @backstage/plugin-
|
|
12
|
-
- @backstage/
|
|
13
|
-
- @backstage/core-
|
|
14
|
-
- @backstage/
|
|
29
|
+
- @backstage/core-components@0.18.6-next.0
|
|
30
|
+
- @backstage/core-compat-api@0.5.7-next.0
|
|
31
|
+
- @backstage/frontend-plugin-api@0.14.0-next.0
|
|
32
|
+
- @backstage/frontend-test-utils@0.4.5-next.0
|
|
33
|
+
- @backstage/core-plugin-api@1.12.2-next.0
|
|
34
|
+
- @backstage/plugin-permission-common@0.9.5-next.0
|
|
35
|
+
- @backstage/catalog-client@1.12.1
|
|
36
|
+
- @backstage/catalog-model@1.7.6
|
|
37
|
+
- @backstage/errors@1.2.7
|
|
38
|
+
- @backstage/integration-react@1.2.15-next.0
|
|
39
|
+
- @backstage/types@1.2.2
|
|
40
|
+
- @backstage/version-bridge@1.0.11
|
|
41
|
+
- @backstage/plugin-catalog-common@1.1.8-next.0
|
|
42
|
+
- @backstage/plugin-permission-react@0.4.40-next.0
|
|
15
43
|
|
|
16
44
|
## 1.21.5
|
|
17
45
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensionData.esm.js","sources":["../../../src/alpha/blueprints/extensionData.tsx"],"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 */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { createExtensionDataRef } from '@backstage/frontend-plugin-api';\n\n/** @internal */\nexport const entityContentTitleDataRef = createExtensionDataRef<string>().with({\n id: 'catalog.entity-content-title',\n});\n\n/** @internal */\nexport const entityFilterFunctionDataRef = createExtensionDataRef<\n (entity: Entity) => boolean\n>().with({ id: 'catalog.entity-filter-function' });\n\n/** @internal */\nexport const entityFilterExpressionDataRef =\n createExtensionDataRef<string>().with({\n id: 'catalog.entity-filter-expression',\n });\n\n/**\n * @alpha\n * Default entity content groups.\n */\nexport const defaultEntityContentGroups = {\n overview: 'Overview',\n documentation: 'Documentation',\n development: 'Development',\n deployment: 'Deployment',\n operation: 'Operation',\n observability: 'Observability',\n};\n\n/** @internal */\nexport const entityContentGroupDataRef = createExtensionDataRef<string>().with({\n id: 'catalog.entity-content-group',\n});\n\n/**\n * @internal\n * Available entity card types\n */\nexport const entityCardTypes = [\n '
|
|
1
|
+
{"version":3,"file":"extensionData.esm.js","sources":["../../../src/alpha/blueprints/extensionData.tsx"],"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 */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { createExtensionDataRef } from '@backstage/frontend-plugin-api';\n\n/** @internal */\nexport const entityContentTitleDataRef = createExtensionDataRef<string>().with({\n id: 'catalog.entity-content-title',\n});\n\n/** @internal */\nexport const entityFilterFunctionDataRef = createExtensionDataRef<\n (entity: Entity) => boolean\n>().with({ id: 'catalog.entity-filter-function' });\n\n/** @internal */\nexport const entityFilterExpressionDataRef =\n createExtensionDataRef<string>().with({\n id: 'catalog.entity-filter-expression',\n });\n\n/**\n * @alpha\n * Default entity content groups.\n */\nexport const defaultEntityContentGroups = {\n overview: 'Overview',\n documentation: 'Documentation',\n development: 'Development',\n deployment: 'Deployment',\n operation: 'Operation',\n observability: 'Observability',\n};\n\n/** @internal */\nexport const entityContentGroupDataRef = createExtensionDataRef<string>().with({\n id: 'catalog.entity-content-group',\n});\n\n/**\n * @internal\n * Available entity card types\n */\nexport const entityCardTypes = [\n 'info',\n 'content',\n] as const satisfies readonly EntityCardType[];\n\n/** @alpha */\nexport type EntityCardType = 'info' | 'content';\n\n/** @internal */\nexport const entityCardTypeDataRef =\n createExtensionDataRef<EntityCardType>().with({\n id: 'catalog.entity-card-type',\n });\n"],"names":[],"mappings":";;AAoBO,MAAM,yBAAA,GAA4B,sBAAA,EAA+B,CAAE,IAAA,CAAK;AAAA,EAC7E,EAAA,EAAI;AACN,CAAC;AAGM,MAAM,8BAA8B,sBAAA,EAEzC,CAAE,KAAK,EAAE,EAAA,EAAI,kCAAkC;AAG1C,MAAM,6BAAA,GACX,sBAAA,EAA+B,CAAE,IAAA,CAAK;AAAA,EACpC,EAAA,EAAI;AACN,CAAC;AAMI,MAAM,0BAAA,GAA6B;AAAA,EACxC,QAAA,EAAU,UAAA;AAAA,EACV,aAAA,EAAe,eAAA;AAAA,EACf,WAAA,EAAa,aAAA;AAAA,EACb,UAAA,EAAY,YAAA;AAAA,EACZ,SAAA,EAAW,WAAA;AAAA,EACX,aAAA,EAAe;AACjB;AAGO,MAAM,yBAAA,GAA4B,sBAAA,EAA+B,CAAE,IAAA,CAAK;AAAA,EAC7E,EAAA,EAAI;AACN,CAAC;AAMM,MAAM,eAAA,GAAkB;AAAA,EAC7B,MAAA;AAAA,EACA;AACF;AAMO,MAAM,qBAAA,GACX,sBAAA,EAAuC,CAAE,IAAA,CAAK;AAAA,EAC5C,EAAA,EAAI;AACN,CAAC;;;;"}
|
package/dist/alpha.d.ts
CHANGED
|
@@ -47,7 +47,7 @@ declare const defaultEntityContentGroups: {
|
|
|
47
47
|
observability: string;
|
|
48
48
|
};
|
|
49
49
|
/** @alpha */
|
|
50
|
-
type EntityCardType = '
|
|
50
|
+
type EntityCardType = 'info' | 'content';
|
|
51
51
|
|
|
52
52
|
/** @alpha */
|
|
53
53
|
type EntityPredicate = EntityPredicateExpression | EntityPredicatePrimitive | {
|
|
@@ -101,11 +101,11 @@ declare const EntityCardBlueprint: _backstage_frontend_plugin_api.ExtensionBluep
|
|
|
101
101
|
inputs: {};
|
|
102
102
|
config: {
|
|
103
103
|
filter: EntityPredicate | undefined;
|
|
104
|
-
type: "content" | "
|
|
104
|
+
type: "content" | "info" | undefined;
|
|
105
105
|
};
|
|
106
106
|
configInput: {
|
|
107
107
|
filter?: EntityPredicate | undefined;
|
|
108
|
-
type?: "content" | "
|
|
108
|
+
type?: "content" | "info" | undefined;
|
|
109
109
|
};
|
|
110
110
|
dataRefs: {
|
|
111
111
|
filterFunction: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: Entity) => boolean, "catalog.entity-filter-function", {}>;
|
|
@@ -1,206 +1,273 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { EntityRefLink } from '../EntityRefLink/EntityRefLink.esm.js';
|
|
3
3
|
import '@backstage/catalog-model';
|
|
4
4
|
import { useState, useCallback } from 'react';
|
|
5
5
|
import 'lodash/get';
|
|
6
|
-
import Box from '@material-ui/core/Box';
|
|
7
|
-
import Button from '@material-ui/core/Button';
|
|
8
|
-
import Dialog from '@material-ui/core/Dialog';
|
|
9
|
-
import DialogActions from '@material-ui/core/DialogActions';
|
|
10
|
-
import DialogContent from '@material-ui/core/DialogContent';
|
|
11
|
-
import DialogContentText from '@material-ui/core/DialogContentText';
|
|
12
|
-
import DialogTitle from '@material-ui/core/DialogTitle';
|
|
13
|
-
import Divider from '@material-ui/core/Divider';
|
|
14
6
|
import { makeStyles } from '@material-ui/core/styles';
|
|
15
|
-
import Alert from '@material-ui/lab/Alert';
|
|
16
7
|
import { useUnregisterEntityDialogState } from './useUnregisterEntityDialogState.esm.js';
|
|
17
|
-
import { useApi,
|
|
18
|
-
import {
|
|
8
|
+
import { useApi, configApiRef, alertApiRef } from '@backstage/core-plugin-api';
|
|
9
|
+
import { ResponseErrorPanel, Progress } from '@backstage/core-components';
|
|
19
10
|
import { assertError } from '@backstage/errors';
|
|
20
11
|
import { catalogReactTranslationRef } from '../../translation.esm.js';
|
|
21
12
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
13
|
+
import { Dialog, DialogHeader, DialogBody, DialogFooter, Button, Alert, Text, Box, Accordion, AccordionTrigger, AccordionPanel } from '@backstage/ui';
|
|
22
14
|
|
|
23
15
|
const useStyles = makeStyles({
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
},
|
|
27
|
-
dialogActions: {
|
|
28
|
-
display: "inline-block"
|
|
16
|
+
bodyContent: {
|
|
17
|
+
overflowWrap: "break-word"
|
|
29
18
|
}
|
|
30
19
|
});
|
|
31
|
-
|
|
32
|
-
entity,
|
|
33
|
-
onConfirm,
|
|
34
|
-
onClose
|
|
35
|
-
}) => {
|
|
20
|
+
function useUnregisterDialogHandlers(entity, onConfirm, onClose) {
|
|
36
21
|
const alertApi = useApi(alertApiRef);
|
|
37
|
-
const configApi = useApi(configApiRef);
|
|
38
|
-
const classes = useStyles();
|
|
39
22
|
const state = useUnregisterEntityDialogState(entity);
|
|
40
|
-
const [
|
|
41
|
-
|
|
42
|
-
|
|
23
|
+
const [busyAction, setBusyAction] = useState(
|
|
24
|
+
null
|
|
25
|
+
);
|
|
43
26
|
const { t } = useTranslationRef(catalogReactTranslationRef);
|
|
44
|
-
const onUnregister = useCallback(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
setBusy(false);
|
|
56
|
-
}
|
|
27
|
+
const onUnregister = useCallback(async () => {
|
|
28
|
+
if ("unregisterLocation" in state) {
|
|
29
|
+
setBusyAction("unregister");
|
|
30
|
+
try {
|
|
31
|
+
await state.unregisterLocation();
|
|
32
|
+
onConfirm();
|
|
33
|
+
} catch (err) {
|
|
34
|
+
assertError(err);
|
|
35
|
+
alertApi.post({ message: err.message });
|
|
36
|
+
} finally {
|
|
37
|
+
setBusyAction(null);
|
|
57
38
|
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
} finally {
|
|
80
|
-
setBusy(false);
|
|
81
|
-
}
|
|
39
|
+
}
|
|
40
|
+
}, [alertApi, onConfirm, state]);
|
|
41
|
+
const onDelete = useCallback(async () => {
|
|
42
|
+
if ("deleteEntity" in state) {
|
|
43
|
+
setBusyAction("delete");
|
|
44
|
+
try {
|
|
45
|
+
await state.deleteEntity();
|
|
46
|
+
const entityName = entity.metadata.title ?? entity.metadata.name;
|
|
47
|
+
onConfirm();
|
|
48
|
+
alertApi.post({
|
|
49
|
+
message: t("unregisterEntityDialog.deleteEntitySuccessMessage", {
|
|
50
|
+
entityName
|
|
51
|
+
}),
|
|
52
|
+
severity: "success",
|
|
53
|
+
display: "transient"
|
|
54
|
+
});
|
|
55
|
+
} catch (err) {
|
|
56
|
+
assertError(err);
|
|
57
|
+
alertApi.post({ message: err.message });
|
|
58
|
+
} finally {
|
|
59
|
+
setBusyAction(null);
|
|
82
60
|
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
/* @__PURE__ */ jsxs(Box, { marginTop: 2, children: [
|
|
100
|
-
!showDelete && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
101
|
-
/* @__PURE__ */ jsx(
|
|
102
|
-
Button,
|
|
103
|
-
{
|
|
104
|
-
variant: "text",
|
|
105
|
-
size: "small",
|
|
106
|
-
color: "primary",
|
|
107
|
-
className: classes.advancedButton,
|
|
108
|
-
onClick: () => setShowDelete(true),
|
|
109
|
-
children: t("unregisterEntityDialog.bootstrapState.advancedOptions")
|
|
110
|
-
}
|
|
111
|
-
),
|
|
112
|
-
/* @__PURE__ */ jsx(DialogActionsPanel, {})
|
|
113
|
-
] }),
|
|
114
|
-
showDelete && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
115
|
-
/* @__PURE__ */ jsx(DialogContentText, { children: t("unregisterEntityDialog.bootstrapState.advancedDescription") }),
|
|
116
|
-
/* @__PURE__ */ jsx(
|
|
117
|
-
Button,
|
|
118
|
-
{
|
|
119
|
-
variant: "contained",
|
|
120
|
-
color: "secondary",
|
|
121
|
-
disabled: busy,
|
|
122
|
-
onClick: onDelete,
|
|
123
|
-
children: t("unregisterEntityDialog.deleteButtonTitle")
|
|
124
|
-
}
|
|
125
|
-
),
|
|
126
|
-
/* @__PURE__ */ jsx(DialogActionsPanel, {})
|
|
127
|
-
] })
|
|
128
|
-
] })
|
|
129
|
-
] });
|
|
130
|
-
}
|
|
131
|
-
if (state.type === "only-delete") {
|
|
132
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
133
|
-
/* @__PURE__ */ jsx(DialogContentText, { children: t("unregisterEntityDialog.onlyDeleteStateTitle") }),
|
|
134
|
-
/* @__PURE__ */ jsx(
|
|
61
|
+
}
|
|
62
|
+
}, [alertApi, onConfirm, state, entity, t]);
|
|
63
|
+
return { state, busyAction, onUnregister, onDelete, onClose };
|
|
64
|
+
}
|
|
65
|
+
function AdvancedDeleteAccordion({
|
|
66
|
+
triggerTitle,
|
|
67
|
+
description,
|
|
68
|
+
onDelete,
|
|
69
|
+
busyAction
|
|
70
|
+
}) {
|
|
71
|
+
const { t } = useTranslationRef(catalogReactTranslationRef);
|
|
72
|
+
return /* @__PURE__ */ jsx(Box, { mt: "4", children: /* @__PURE__ */ jsxs(Accordion, { children: [
|
|
73
|
+
/* @__PURE__ */ jsx(AccordionTrigger, { title: triggerTitle }),
|
|
74
|
+
/* @__PURE__ */ jsxs(AccordionPanel, { children: [
|
|
75
|
+
/* @__PURE__ */ jsx(Text, { as: "p", children: description }),
|
|
76
|
+
/* @__PURE__ */ jsx(Box, { mt: "4", children: /* @__PURE__ */ jsx(
|
|
135
77
|
Button,
|
|
136
78
|
{
|
|
137
|
-
variant: "
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
79
|
+
variant: "primary",
|
|
80
|
+
destructive: true,
|
|
81
|
+
loading: busyAction === "delete",
|
|
82
|
+
isDisabled: busyAction !== null && busyAction !== "delete",
|
|
83
|
+
onPress: onDelete,
|
|
141
84
|
children: t("unregisterEntityDialog.deleteButtonTitle")
|
|
142
85
|
}
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
86
|
+
) })
|
|
87
|
+
] })
|
|
88
|
+
] }) });
|
|
89
|
+
}
|
|
90
|
+
function BootstrapBody({
|
|
91
|
+
location,
|
|
92
|
+
appTitle,
|
|
93
|
+
onDelete,
|
|
94
|
+
busyAction
|
|
95
|
+
}) {
|
|
96
|
+
const { t } = useTranslationRef(catalogReactTranslationRef);
|
|
97
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
98
|
+
/* @__PURE__ */ jsx(
|
|
99
|
+
Alert,
|
|
100
|
+
{
|
|
101
|
+
status: "info",
|
|
102
|
+
icon: true,
|
|
103
|
+
description: t("unregisterEntityDialog.bootstrapState.title", {
|
|
104
|
+
appTitle,
|
|
105
|
+
location
|
|
106
|
+
})
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
/* @__PURE__ */ jsx(
|
|
110
|
+
AdvancedDeleteAccordion,
|
|
111
|
+
{
|
|
112
|
+
triggerTitle: t(
|
|
113
|
+
"unregisterEntityDialog.bootstrapState.advancedOptions"
|
|
114
|
+
),
|
|
115
|
+
description: t(
|
|
116
|
+
"unregisterEntityDialog.bootstrapState.advancedDescription"
|
|
117
|
+
),
|
|
118
|
+
onDelete,
|
|
119
|
+
busyAction
|
|
120
|
+
}
|
|
121
|
+
)
|
|
122
|
+
] });
|
|
123
|
+
}
|
|
124
|
+
function OnlyDeleteBody() {
|
|
125
|
+
const { t } = useTranslationRef(catalogReactTranslationRef);
|
|
126
|
+
return /* @__PURE__ */ jsx(Text, { as: "p", children: t("unregisterEntityDialog.onlyDeleteStateTitle") });
|
|
127
|
+
}
|
|
128
|
+
function UnregisterBody({
|
|
129
|
+
state,
|
|
130
|
+
appTitle,
|
|
131
|
+
onDelete,
|
|
132
|
+
busyAction
|
|
133
|
+
}) {
|
|
134
|
+
const { t } = useTranslationRef(catalogReactTranslationRef);
|
|
135
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
136
|
+
/* @__PURE__ */ jsx(Text, { as: "p", children: t("unregisterEntityDialog.unregisterState.title") }),
|
|
137
|
+
/* @__PURE__ */ jsx("ul", { children: state.colocatedEntities.map((e) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(EntityRefLink, { entityRef: e }) }, `${e.kind}:${e.namespace}/${e.name}`)) }),
|
|
138
|
+
/* @__PURE__ */ jsx(Text, { as: "p", children: t("unregisterEntityDialog.unregisterState.subTitle") }),
|
|
139
|
+
/* @__PURE__ */ jsx("ul", { children: /* @__PURE__ */ jsx("li", { children: state.location }) }),
|
|
140
|
+
/* @__PURE__ */ jsx(Text, { as: "p", children: t("unregisterEntityDialog.unregisterState.description", {
|
|
141
|
+
appTitle
|
|
142
|
+
}) }),
|
|
143
|
+
/* @__PURE__ */ jsx(
|
|
144
|
+
AdvancedDeleteAccordion,
|
|
145
|
+
{
|
|
146
|
+
triggerTitle: t(
|
|
147
|
+
"unregisterEntityDialog.unregisterState.advancedOptions"
|
|
148
|
+
),
|
|
149
|
+
description: t(
|
|
150
|
+
"unregisterEntityDialog.unregisterState.advancedDescription"
|
|
151
|
+
),
|
|
152
|
+
onDelete,
|
|
153
|
+
busyAction
|
|
154
|
+
}
|
|
155
|
+
)
|
|
156
|
+
] });
|
|
157
|
+
}
|
|
158
|
+
function useDialogContent(handlers, appTitle) {
|
|
159
|
+
const { t } = useTranslationRef(catalogReactTranslationRef);
|
|
160
|
+
const { state, busyAction, onUnregister, onDelete } = handlers;
|
|
161
|
+
switch (state.type) {
|
|
162
|
+
case "loading":
|
|
163
|
+
return { body: /* @__PURE__ */ jsx(Progress, {}), actionButton: null };
|
|
164
|
+
case "error":
|
|
165
|
+
return {
|
|
166
|
+
body: /* @__PURE__ */ jsx(ResponseErrorPanel, { error: state.error }),
|
|
167
|
+
actionButton: null
|
|
168
|
+
};
|
|
169
|
+
case "bootstrap":
|
|
170
|
+
return {
|
|
171
|
+
body: /* @__PURE__ */ jsx(
|
|
172
|
+
BootstrapBody,
|
|
159
173
|
{
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
children: t("unregisterEntityDialog.unregisterState.unregisterButtonTitle")
|
|
174
|
+
location: state.location,
|
|
175
|
+
appTitle,
|
|
176
|
+
onDelete,
|
|
177
|
+
busyAction
|
|
165
178
|
}
|
|
166
179
|
),
|
|
167
|
-
|
|
180
|
+
actionButton: null
|
|
181
|
+
};
|
|
182
|
+
case "only-delete":
|
|
183
|
+
return {
|
|
184
|
+
body: /* @__PURE__ */ jsx(OnlyDeleteBody, {}),
|
|
185
|
+
actionButton: /* @__PURE__ */ jsx(
|
|
168
186
|
Button,
|
|
169
187
|
{
|
|
170
|
-
variant: "
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
children: t("unregisterEntityDialog.
|
|
188
|
+
variant: "primary",
|
|
189
|
+
destructive: true,
|
|
190
|
+
loading: busyAction === "delete",
|
|
191
|
+
isDisabled: busyAction !== null && busyAction !== "delete",
|
|
192
|
+
onPress: onDelete,
|
|
193
|
+
children: t("unregisterEntityDialog.deleteButtonTitle")
|
|
194
|
+
}
|
|
195
|
+
)
|
|
196
|
+
};
|
|
197
|
+
case "unregister":
|
|
198
|
+
return {
|
|
199
|
+
body: /* @__PURE__ */ jsx(
|
|
200
|
+
UnregisterBody,
|
|
201
|
+
{
|
|
202
|
+
state,
|
|
203
|
+
appTitle,
|
|
204
|
+
onDelete,
|
|
205
|
+
busyAction
|
|
176
206
|
}
|
|
177
|
-
)
|
|
178
|
-
|
|
179
|
-
showDelete && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
180
|
-
/* @__PURE__ */ jsx(Box, { paddingTop: 4, paddingBottom: 4, children: /* @__PURE__ */ jsx(Divider, {}) }),
|
|
181
|
-
/* @__PURE__ */ jsx(DialogContentText, { children: t("unregisterEntityDialog.unregisterState.advancedDescription") }),
|
|
182
|
-
/* @__PURE__ */ jsx(
|
|
207
|
+
),
|
|
208
|
+
actionButton: /* @__PURE__ */ jsx(
|
|
183
209
|
Button,
|
|
184
210
|
{
|
|
185
|
-
variant: "
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
211
|
+
variant: "primary",
|
|
212
|
+
destructive: true,
|
|
213
|
+
loading: busyAction === "unregister",
|
|
214
|
+
isDisabled: busyAction !== null && busyAction !== "unregister",
|
|
215
|
+
onPress: onUnregister,
|
|
216
|
+
children: t("unregisterEntityDialog.unregisterState.unregisterButtonTitle")
|
|
190
217
|
}
|
|
191
218
|
)
|
|
192
|
-
|
|
193
|
-
|
|
219
|
+
};
|
|
220
|
+
default:
|
|
221
|
+
return {
|
|
222
|
+
body: /* @__PURE__ */ jsx(
|
|
223
|
+
Alert,
|
|
224
|
+
{
|
|
225
|
+
status: "danger",
|
|
226
|
+
description: t("unregisterEntityDialog.errorStateTitle")
|
|
227
|
+
}
|
|
228
|
+
),
|
|
229
|
+
actionButton: null
|
|
230
|
+
};
|
|
194
231
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
232
|
+
}
|
|
233
|
+
function DialogContents({
|
|
234
|
+
entity,
|
|
235
|
+
onConfirm,
|
|
236
|
+
onClose
|
|
237
|
+
}) {
|
|
238
|
+
const classes = useStyles();
|
|
199
239
|
const { t } = useTranslationRef(catalogReactTranslationRef);
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
240
|
+
const configApi = useApi(configApiRef);
|
|
241
|
+
const appTitle = configApi.getOptionalString("app.title") ?? "Backstage";
|
|
242
|
+
const handlers = useUnregisterDialogHandlers(entity, onConfirm, onClose);
|
|
243
|
+
const { body, actionButton } = useDialogContent(handlers, appTitle);
|
|
244
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
245
|
+
/* @__PURE__ */ jsx(DialogHeader, { children: t("unregisterEntityDialog.title") }),
|
|
246
|
+
/* @__PURE__ */ jsx(DialogBody, { className: classes.bodyContent, children: body }),
|
|
247
|
+
/* @__PURE__ */ jsxs(DialogFooter, { children: [
|
|
248
|
+
/* @__PURE__ */ jsx(Button, { variant: "secondary", onPress: onClose, children: t("unregisterEntityDialog.cancelButtonTitle") }),
|
|
249
|
+
actionButton
|
|
250
|
+
] })
|
|
203
251
|
] });
|
|
252
|
+
}
|
|
253
|
+
const UnregisterEntityDialog = (props) => {
|
|
254
|
+
const { open, onConfirm, onClose, entity } = props;
|
|
255
|
+
return /* @__PURE__ */ jsx(
|
|
256
|
+
Dialog,
|
|
257
|
+
{
|
|
258
|
+
isOpen: open,
|
|
259
|
+
onOpenChange: (isOpen) => !isOpen && onClose(),
|
|
260
|
+
width: 600,
|
|
261
|
+
children: open && /* @__PURE__ */ jsx(
|
|
262
|
+
DialogContents,
|
|
263
|
+
{
|
|
264
|
+
entity,
|
|
265
|
+
onConfirm,
|
|
266
|
+
onClose
|
|
267
|
+
}
|
|
268
|
+
)
|
|
269
|
+
}
|
|
270
|
+
);
|
|
204
271
|
};
|
|
205
272
|
|
|
206
273
|
export { UnregisterEntityDialog };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnregisterEntityDialog.esm.js","sources":["../../../src/components/UnregisterEntityDialog/UnregisterEntityDialog.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 { Entity } from '@backstage/catalog-model';\nimport { EntityRefLink } from '../EntityRefLink';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Divider from '@material-ui/core/Divider';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Alert from '@material-ui/lab/Alert';\nimport { useCallback, useState } from 'react';\nimport { useUnregisterEntityDialogState } from './useUnregisterEntityDialogState';\n\nimport { alertApiRef, configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Progress, ResponseErrorPanel } from '@backstage/core-components';\nimport { assertError } from '@backstage/errors';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst useStyles = makeStyles({\n advancedButton: {\n fontSize: '0.7em',\n },\n dialogActions: {\n display: 'inline-block',\n },\n});\n\nconst Contents = ({\n entity,\n onConfirm,\n onClose,\n}: {\n entity: Entity;\n onConfirm: () => any;\n onClose: () => any;\n}) => {\n const alertApi = useApi(alertApiRef);\n const configApi = useApi(configApiRef);\n const classes = useStyles();\n const state = useUnregisterEntityDialogState(entity);\n const [showDelete, setShowDelete] = useState(false);\n const [busy, setBusy] = useState(false);\n const appTitle = configApi.getOptionalString('app.title') ?? 'Backstage';\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n const onUnregister = useCallback(\n async function onUnregisterFn() {\n if ('unregisterLocation' in state) {\n setBusy(true);\n try {\n await state.unregisterLocation();\n onConfirm();\n } catch (err) {\n assertError(err);\n alertApi.post({ message: err.message });\n } finally {\n setBusy(false);\n }\n }\n },\n [alertApi, onConfirm, state],\n );\n\n const onDelete = useCallback(\n async function onDeleteFn() {\n if ('deleteEntity' in state) {\n setBusy(true);\n try {\n await state.deleteEntity();\n const entityName = entity.metadata.title ?? entity.metadata.name;\n onConfirm();\n alertApi.post({\n message: t('unregisterEntityDialog.deleteEntitySuccessMessage', {\n entityName,\n }),\n severity: 'success',\n display: 'transient',\n });\n } catch (err) {\n assertError(err);\n alertApi.post({ message: err.message });\n } finally {\n setBusy(false);\n }\n }\n },\n [alertApi, onConfirm, state, entity, t],\n );\n\n const DialogActionsPanel = () => (\n <DialogActions className={classes.dialogActions}>\n <Button onClick={onClose} color=\"primary\">\n {t('unregisterEntityDialog.cancelButtonTitle')}\n </Button>\n </DialogActions>\n );\n\n if (state.type === 'loading') {\n return <Progress />;\n }\n\n if (state.type === 'error') {\n return <ResponseErrorPanel error={state.error} />;\n }\n\n if (state.type === 'bootstrap') {\n return (\n <>\n <Alert severity=\"info\">\n {t('unregisterEntityDialog.bootstrapState.title', {\n appTitle,\n location: state.location,\n })}\n </Alert>\n\n <Box marginTop={2}>\n {!showDelete && (\n <>\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"primary\"\n className={classes.advancedButton}\n onClick={() => setShowDelete(true)}\n >\n {t('unregisterEntityDialog.bootstrapState.advancedOptions')}\n </Button>\n <DialogActionsPanel />\n </>\n )}\n\n {showDelete && (\n <>\n <DialogContentText>\n {t('unregisterEntityDialog.bootstrapState.advancedDescription')}\n </DialogContentText>\n <Button\n variant=\"contained\"\n color=\"secondary\"\n disabled={busy}\n onClick={onDelete}\n >\n {t('unregisterEntityDialog.deleteButtonTitle')}\n </Button>\n <DialogActionsPanel />\n </>\n )}\n </Box>\n </>\n );\n }\n\n if (state.type === 'only-delete') {\n return (\n <>\n <DialogContentText>\n {t('unregisterEntityDialog.onlyDeleteStateTitle')}\n </DialogContentText>\n <Button\n variant=\"contained\"\n color=\"secondary\"\n disabled={busy}\n onClick={onDelete}\n >\n {t('unregisterEntityDialog.deleteButtonTitle')}\n </Button>\n <DialogActionsPanel />\n </>\n );\n }\n\n if (state.type === 'unregister') {\n return (\n <>\n <DialogContentText>\n {t('unregisterEntityDialog.unregisterState.title')}\n </DialogContentText>\n <DialogContentText component=\"ul\">\n {state.colocatedEntities.map(e => (\n <li key={`${e.kind}:${e.namespace}/${e.name}`}>\n <EntityRefLink entityRef={e} />\n </li>\n ))}\n </DialogContentText>\n <DialogContentText>\n {t('unregisterEntityDialog.unregisterState.subTitle')}\n </DialogContentText>\n <DialogContentText component=\"ul\">\n <li>{state.location}</li>\n </DialogContentText>\n <DialogContentText>\n {t('unregisterEntityDialog.unregisterState.description', {\n appTitle,\n })}\n </DialogContentText>\n <Box marginTop={2}>\n <Button\n variant=\"contained\"\n color=\"secondary\"\n disabled={busy}\n onClick={onUnregister}\n >\n {t('unregisterEntityDialog.unregisterState.unregisterButtonTitle')}\n </Button>\n {!showDelete && (\n <Box component=\"span\" marginLeft={2}>\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"primary\"\n className={classes.advancedButton}\n onClick={() => setShowDelete(true)}\n >\n {t('unregisterEntityDialog.unregisterState.advancedOptions')}\n </Button>\n </Box>\n )}\n </Box>\n\n {showDelete && (\n <>\n <Box paddingTop={4} paddingBottom={4}>\n <Divider />\n </Box>\n <DialogContentText>\n {t('unregisterEntityDialog.unregisterState.advancedDescription')}\n </DialogContentText>\n <Button\n variant=\"contained\"\n color=\"secondary\"\n disabled={busy}\n onClick={onDelete}\n >\n {t('unregisterEntityDialog.deleteButtonTitle')}\n </Button>\n </>\n )}\n </>\n );\n }\n\n return (\n <Alert severity=\"error\">\n {t('unregisterEntityDialog.errorStateTitle')}\n </Alert>\n );\n};\n\n/** @public */\nexport type UnregisterEntityDialogProps = {\n open: boolean;\n onConfirm: () => any;\n onClose: () => any;\n entity: Entity;\n};\n\n/** @public */\nexport const UnregisterEntityDialog = (props: UnregisterEntityDialogProps) => {\n const { open, onConfirm, onClose, entity } = props;\n const { t } = useTranslationRef(catalogReactTranslationRef);\n return (\n <Dialog open={open} onClose={onClose}>\n <DialogTitle id=\"responsive-dialog-title\">\n {t('unregisterEntityDialog.title')}\n </DialogTitle>\n <DialogContent>\n <Contents entity={entity} onConfirm={onConfirm} onClose={onClose} />\n </DialogContent>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UnregisterEntityDialog.esm.js","sources":["../../../src/components/UnregisterEntityDialog/UnregisterEntityDialog.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 { CompoundEntityRef, Entity } from '@backstage/catalog-model';\nimport { EntityRefLink } from '../EntityRefLink';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { ReactNode, useCallback, useState } from 'react';\nimport {\n UseUnregisterEntityDialogState,\n useUnregisterEntityDialogState,\n} from './useUnregisterEntityDialogState';\n\nimport { alertApiRef, configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Progress, ResponseErrorPanel } from '@backstage/core-components';\nimport { assertError } from '@backstage/errors';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n Accordion,\n AccordionPanel,\n AccordionTrigger,\n Alert,\n Box,\n Button,\n Dialog,\n DialogBody,\n DialogFooter,\n DialogHeader,\n Text,\n} from '@backstage/ui';\n\nconst useStyles = makeStyles({\n bodyContent: {\n overflowWrap: 'break-word',\n },\n});\n\ntype DialogHandlers = {\n state: UseUnregisterEntityDialogState;\n busyAction: 'unregister' | 'delete' | null;\n onUnregister: () => Promise<void>;\n onDelete: () => Promise<void>;\n onClose: () => void;\n};\n\nfunction useUnregisterDialogHandlers(\n entity: Entity,\n onConfirm: () => void,\n onClose: () => void,\n): DialogHandlers {\n const alertApi = useApi(alertApiRef);\n const state = useUnregisterEntityDialogState(entity);\n const [busyAction, setBusyAction] = useState<'unregister' | 'delete' | null>(\n null,\n );\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n const onUnregister = useCallback(async () => {\n if ('unregisterLocation' in state) {\n setBusyAction('unregister');\n try {\n await state.unregisterLocation();\n onConfirm();\n } catch (err) {\n assertError(err);\n alertApi.post({ message: err.message });\n } finally {\n setBusyAction(null);\n }\n }\n }, [alertApi, onConfirm, state]);\n\n const onDelete = useCallback(async () => {\n if ('deleteEntity' in state) {\n setBusyAction('delete');\n try {\n await state.deleteEntity();\n const entityName = entity.metadata.title ?? entity.metadata.name;\n onConfirm();\n alertApi.post({\n message: t('unregisterEntityDialog.deleteEntitySuccessMessage', {\n entityName,\n }),\n severity: 'success',\n display: 'transient',\n });\n } catch (err) {\n assertError(err);\n alertApi.post({ message: err.message });\n } finally {\n setBusyAction(null);\n }\n }\n }, [alertApi, onConfirm, state, entity, t]);\n\n return { state, busyAction, onUnregister, onDelete, onClose };\n}\n\nfunction AdvancedDeleteAccordion({\n triggerTitle,\n description,\n onDelete,\n busyAction,\n}: {\n triggerTitle: string;\n description: string;\n onDelete: () => void;\n busyAction: 'unregister' | 'delete' | null;\n}) {\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n return (\n <Box mt=\"4\">\n <Accordion>\n <AccordionTrigger title={triggerTitle} />\n <AccordionPanel>\n <Text as=\"p\">{description}</Text>\n <Box mt=\"4\">\n <Button\n variant=\"primary\"\n destructive\n loading={busyAction === 'delete'}\n isDisabled={busyAction !== null && busyAction !== 'delete'}\n onPress={onDelete}\n >\n {t('unregisterEntityDialog.deleteButtonTitle')}\n </Button>\n </Box>\n </AccordionPanel>\n </Accordion>\n </Box>\n );\n}\n\nfunction BootstrapBody({\n location,\n appTitle,\n onDelete,\n busyAction,\n}: {\n location: string;\n appTitle: string;\n onDelete: () => void;\n busyAction: 'unregister' | 'delete' | null;\n}) {\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n return (\n <>\n <Alert\n status=\"info\"\n icon\n description={t('unregisterEntityDialog.bootstrapState.title', {\n appTitle,\n location,\n })}\n />\n <AdvancedDeleteAccordion\n triggerTitle={t(\n 'unregisterEntityDialog.bootstrapState.advancedOptions',\n )}\n description={t(\n 'unregisterEntityDialog.bootstrapState.advancedDescription',\n )}\n onDelete={onDelete}\n busyAction={busyAction}\n />\n </>\n );\n}\n\nfunction OnlyDeleteBody() {\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n return <Text as=\"p\">{t('unregisterEntityDialog.onlyDeleteStateTitle')}</Text>;\n}\n\nfunction UnregisterBody({\n state,\n appTitle,\n onDelete,\n busyAction,\n}: {\n state: Extract<UseUnregisterEntityDialogState, { type: 'unregister' }>;\n appTitle: string;\n onDelete: () => void;\n busyAction: 'unregister' | 'delete' | null;\n}) {\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n return (\n <>\n <Text as=\"p\">{t('unregisterEntityDialog.unregisterState.title')}</Text>\n <ul>\n {state.colocatedEntities.map((e: CompoundEntityRef) => (\n <li key={`${e.kind}:${e.namespace}/${e.name}`}>\n <EntityRefLink entityRef={e} />\n </li>\n ))}\n </ul>\n <Text as=\"p\">{t('unregisterEntityDialog.unregisterState.subTitle')}</Text>\n <ul>\n <li>{state.location}</li>\n </ul>\n <Text as=\"p\">\n {t('unregisterEntityDialog.unregisterState.description', {\n appTitle,\n })}\n </Text>\n <AdvancedDeleteAccordion\n triggerTitle={t(\n 'unregisterEntityDialog.unregisterState.advancedOptions',\n )}\n description={t(\n 'unregisterEntityDialog.unregisterState.advancedDescription',\n )}\n onDelete={onDelete}\n busyAction={busyAction}\n />\n </>\n );\n}\n\nfunction useDialogContent(\n handlers: DialogHandlers,\n appTitle: string,\n): { body: ReactNode; actionButton: ReactNode | null } {\n const { t } = useTranslationRef(catalogReactTranslationRef);\n const { state, busyAction, onUnregister, onDelete } = handlers;\n\n switch (state.type) {\n case 'loading':\n return { body: <Progress />, actionButton: null };\n case 'error':\n return {\n body: <ResponseErrorPanel error={state.error} />,\n actionButton: null,\n };\n case 'bootstrap':\n return {\n body: (\n <BootstrapBody\n location={state.location}\n appTitle={appTitle}\n onDelete={onDelete}\n busyAction={busyAction}\n />\n ),\n actionButton: null,\n };\n case 'only-delete':\n return {\n body: <OnlyDeleteBody />,\n actionButton: (\n <Button\n variant=\"primary\"\n destructive\n loading={busyAction === 'delete'}\n isDisabled={busyAction !== null && busyAction !== 'delete'}\n onPress={onDelete}\n >\n {t('unregisterEntityDialog.deleteButtonTitle')}\n </Button>\n ),\n };\n case 'unregister':\n return {\n body: (\n <UnregisterBody\n state={state}\n appTitle={appTitle}\n onDelete={onDelete}\n busyAction={busyAction}\n />\n ),\n actionButton: (\n <Button\n variant=\"primary\"\n destructive\n loading={busyAction === 'unregister'}\n isDisabled={busyAction !== null && busyAction !== 'unregister'}\n onPress={onUnregister}\n >\n {t('unregisterEntityDialog.unregisterState.unregisterButtonTitle')}\n </Button>\n ),\n };\n default:\n return {\n body: (\n <Alert\n status=\"danger\"\n description={t('unregisterEntityDialog.errorStateTitle')}\n />\n ),\n actionButton: null,\n };\n }\n}\n\n/** @public */\nexport type UnregisterEntityDialogProps = {\n open: boolean;\n onConfirm: () => any;\n onClose: () => any;\n entity: Entity;\n};\n\nfunction DialogContents({\n entity,\n onConfirm,\n onClose,\n}: {\n entity: Entity;\n onConfirm: () => void;\n onClose: () => void;\n}) {\n const classes = useStyles();\n const { t } = useTranslationRef(catalogReactTranslationRef);\n const configApi = useApi(configApiRef);\n const appTitle = configApi.getOptionalString('app.title') ?? 'Backstage';\n\n const handlers = useUnregisterDialogHandlers(entity, onConfirm, onClose);\n const { body, actionButton } = useDialogContent(handlers, appTitle);\n\n return (\n <>\n <DialogHeader>{t('unregisterEntityDialog.title')}</DialogHeader>\n <DialogBody className={classes.bodyContent}>{body}</DialogBody>\n <DialogFooter>\n <Button variant=\"secondary\" onPress={onClose}>\n {t('unregisterEntityDialog.cancelButtonTitle')}\n </Button>\n {actionButton}\n </DialogFooter>\n </>\n );\n}\n\n/** @public */\nexport const UnregisterEntityDialog = (props: UnregisterEntityDialogProps) => {\n const { open, onConfirm, onClose, entity } = props;\n\n return (\n <Dialog\n isOpen={open}\n onOpenChange={isOpen => !isOpen && onClose()}\n width={600}\n >\n {open && (\n <DialogContents\n entity={entity}\n onConfirm={onConfirm}\n onClose={onClose}\n />\n )}\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,8 @@ const EntityListProvider = (props) => {
|
|
|
35
35
|
limit: initialLimit
|
|
36
36
|
} = useMemo(() => {
|
|
37
37
|
const parsed = qs.parse(location.search, {
|
|
38
|
-
ignoreQueryPrefix: true
|
|
38
|
+
ignoreQueryPrefix: true,
|
|
39
|
+
arrayLimit: 1e4
|
|
39
40
|
});
|
|
40
41
|
let limit2 = paginationLimit;
|
|
41
42
|
if (typeof parsed.limit === "string") {
|
|
@@ -188,7 +189,8 @@ const EntityListProvider = (props) => {
|
|
|
188
189
|
{}
|
|
189
190
|
);
|
|
190
191
|
const oldParams = qs.parse(location.search, {
|
|
191
|
-
ignoreQueryPrefix: true
|
|
192
|
+
ignoreQueryPrefix: true,
|
|
193
|
+
arrayLimit: 1e4
|
|
192
194
|
});
|
|
193
195
|
const newParams = qs.stringify(
|
|
194
196
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEntityListProvider.esm.js","sources":["../../src/hooks/useEntityListProvider.tsx"],"sourcesContent":["/*\n * Copyright 2020 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 { QueryEntitiesResponse } from '@backstage/catalog-client';\nimport { Entity } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n createVersionedContext,\n createVersionedValueMap,\n useVersionedContext,\n} from '@backstage/version-bridge';\nimport { compact, isEqual } from 'lodash';\nimport qs from 'qs';\nimport {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { useLocation } from 'react-router-dom';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport useDebounce from 'react-use/esm/useDebounce';\nimport useMountedState from 'react-use/esm/useMountedState';\nimport { catalogApiRef } from '../api';\nimport {\n EntityErrorFilter,\n EntityKindFilter,\n EntityLifecycleFilter,\n EntityNamespaceFilter,\n EntityOrderFilter,\n EntityOrphanFilter,\n EntityOwnerFilter,\n EntityTagFilter,\n EntityTextFilter,\n EntityTypeFilter,\n EntityUserFilter,\n UserListFilter,\n} from '../filters';\nimport { EntityFilter, EntityListPagination } from '../types';\nimport {\n reduceBackendCatalogFilters,\n reduceCatalogFilters,\n reduceEntityFilters,\n} from '../utils/filters';\n\n/** @public */\nexport type DefaultEntityFilters = {\n kind?: EntityKindFilter;\n type?: EntityTypeFilter;\n user?: UserListFilter | EntityUserFilter;\n owners?: EntityOwnerFilter;\n lifecycles?: EntityLifecycleFilter;\n tags?: EntityTagFilter;\n text?: EntityTextFilter;\n orphan?: EntityOrphanFilter;\n error?: EntityErrorFilter;\n namespace?: EntityNamespaceFilter;\n order?: EntityOrderFilter;\n};\n\n/** @public */\nexport type PaginationMode = 'cursor' | 'offset' | 'none';\n\n/** @public */\nexport type EntityListContextProps<\n EntityFilters extends DefaultEntityFilters = DefaultEntityFilters,\n> = {\n /**\n * The currently registered filters, adhering to the shape of DefaultEntityFilters or an extension\n * of that default (to add custom filter types).\n */\n filters: EntityFilters;\n\n /**\n * The resolved list of catalog entities, after all filters are applied.\n */\n entities: Entity[];\n\n /**\n * The resolved list of catalog entities, after _only catalog-backend_ filters are applied.\n */\n backendEntities: Entity[];\n\n /**\n * Update one or more of the registered filters. Optional filters can be set to `undefined` to\n * reset the filter.\n */\n updateFilters: (\n filters:\n | Partial<EntityFilters>\n | ((prevFilters: EntityFilters) => Partial<EntityFilters>),\n ) => void;\n\n /**\n * Filter values from query parameters.\n */\n queryParameters: Partial<Record<keyof EntityFilters, string | string[]>>;\n\n loading: boolean;\n error?: Error;\n\n pageInfo?: {\n next?: () => void;\n prev?: () => void;\n };\n totalItems?: number;\n limit: number;\n offset?: number;\n setLimit: (limit: number) => void;\n setOffset?: (offset: number) => void;\n paginationMode: PaginationMode;\n};\n\n// This context has support for multiple concurrent versions of this package.\n// It is currently used in parallel with the old context in order to provide\n// a smooth transition, but will eventually be the only context we use.\nexport const NewEntityListContext = createVersionedContext<{\n 1: EntityListContextProps<any>;\n}>('entity-list-context');\n\n/**\n * Creates new context for entity listing and filtering.\n */\nexport const OldEntityListContext = createContext<\n EntityListContextProps<any> | undefined\n>(undefined);\n\ntype OutputState<EntityFilters extends DefaultEntityFilters> = {\n appliedFilters: EntityFilters;\n appliedCursor?: string;\n entities: Entity[];\n backendEntities: Entity[];\n pageInfo?: QueryEntitiesResponse['pageInfo'];\n totalItems?: number;\n offset?: number;\n limit?: number;\n};\n\n/**\n * @public\n */\nexport type EntityListProviderProps = PropsWithChildren<{\n pagination?: EntityListPagination;\n}>;\n\n/**\n * Provides entities and filters for a catalog listing.\n * @public\n */\nexport const EntityListProvider = <EntityFilters extends DefaultEntityFilters>(\n props: EntityListProviderProps,\n) => {\n const isMounted = useMountedState();\n const catalogApi = useApi(catalogApiRef);\n const [requestedFilters, setRequestedFilters] = useState<EntityFilters>(\n {} as EntityFilters,\n );\n\n // We use react-router's useLocation hook so updates from external sources trigger an update to\n // the queryParameters in outputState. Updates from this hook use replaceState below and won't\n // trigger a useLocation change; this would instead come from an external source, such as a manual\n // update of the URL or two catalog sidebar links with different catalog filters.\n const location = useLocation();\n\n const getPaginationMode = (): PaginationMode => {\n if (props.pagination === true) {\n return 'cursor';\n }\n return typeof props.pagination === 'object'\n ? props.pagination.mode ?? 'cursor'\n : 'none';\n };\n\n const paginationMode = getPaginationMode();\n const paginationLimit =\n typeof props.pagination === 'object' ? props.pagination.limit ?? 20 : 20;\n\n const {\n queryParameters,\n cursor: initialCursor,\n offset: initialOffset,\n limit: initialLimit,\n } = useMemo(() => {\n const parsed = qs.parse(location.search, {\n ignoreQueryPrefix: true,\n });\n\n let limit = paginationLimit;\n if (typeof parsed.limit === 'string') {\n const queryLimit = Number.parseInt(parsed.limit, 10);\n if (!isNaN(queryLimit)) {\n limit = queryLimit;\n }\n }\n\n const offset =\n typeof parsed.offset === 'string' && paginationMode === 'offset'\n ? Number.parseInt(parsed.offset, 10)\n : undefined;\n\n return {\n queryParameters: (parsed.filters ?? {}) as Record<\n string,\n string | string[]\n >,\n cursor:\n typeof parsed.cursor === 'string' && paginationMode === 'cursor'\n ? parsed.cursor\n : undefined,\n offset:\n paginationMode === 'offset' && offset && !isNaN(offset)\n ? offset\n : undefined,\n limit,\n };\n }, [paginationMode, location.search, paginationLimit]);\n\n const [cursor, setCursor] = useState(initialCursor);\n const [offset, setOffset] = useState<number | undefined>(initialOffset);\n const [limit, setLimit] = useState(initialLimit);\n\n const [outputState, setOutputState] = useState<OutputState<EntityFilters>>(\n () => {\n return {\n appliedFilters: {} as EntityFilters,\n entities: [],\n backendEntities: [],\n pageInfo: {},\n offset,\n limit,\n };\n },\n );\n\n // The main async filter worker. Note that while it has a lot of dependencies\n // in terms of its implementation, the triggering only happens (debounced)\n // based on the requested filters changing.\n const [{ value: resolvedValue, loading, error }, refresh] = useAsyncFn(\n async () => {\n const kindValue =\n requestedFilters.kind?.value?.toLocaleLowerCase('en-US');\n const adjustedFilters =\n kindValue === 'user' || kindValue === 'group'\n ? { ...requestedFilters, owners: undefined }\n : requestedFilters;\n const compacted = compact(Object.values(adjustedFilters));\n const entityFilter = reduceEntityFilters(compacted);\n\n if (paginationMode !== 'none') {\n if (cursor) {\n if (cursor !== outputState.appliedCursor) {\n const response = await catalogApi.queryEntities({\n cursor,\n limit,\n });\n return {\n appliedFilters: requestedFilters,\n appliedCursor: cursor,\n backendEntities: response.items,\n entities: response.items.filter(entityFilter),\n pageInfo: response.pageInfo,\n totalItems: response.totalItems,\n };\n }\n const entities = outputState.backendEntities.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n appliedCursor: outputState.appliedCursor,\n backendEntities: outputState.backendEntities,\n entities,\n pageInfo: outputState.pageInfo,\n totalItems: outputState.totalItems,\n limit: outputState.limit,\n offset: outputState.offset,\n };\n }\n\n const backendFilter = reduceCatalogFilters(compacted);\n const previousBackendFilter = reduceCatalogFilters(\n compact(Object.values(outputState.appliedFilters)),\n );\n\n if (\n (paginationMode === 'offset' &&\n (outputState.limit !== limit || outputState.offset !== offset)) ||\n !isEqual(previousBackendFilter, backendFilter)\n ) {\n const response = await catalogApi.queryEntities({\n ...backendFilter,\n limit,\n offset,\n });\n return {\n appliedFilters: requestedFilters,\n backendEntities: response.items,\n entities: response.items.filter(entityFilter),\n pageInfo: response.pageInfo,\n totalItems: response.totalItems,\n limit,\n offset,\n };\n }\n const entities = outputState.backendEntities.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n backendEntities: outputState.backendEntities,\n entities,\n pageInfo: outputState.pageInfo,\n totalItems: outputState.totalItems,\n limit: outputState.limit,\n offset: outputState.offset,\n };\n }\n\n const backendFilter = reduceBackendCatalogFilters(compacted);\n const { orderFields } = reduceCatalogFilters(compacted);\n const previousBackendFilter = reduceBackendCatalogFilters(\n compact(Object.values(outputState.appliedFilters)),\n );\n\n // TODO(mtlewis): currently entities will never be requested unless\n // there's at least one filter, we should allow an initial request\n // to happen with no filters.\n if (!isEqual(previousBackendFilter, backendFilter)) {\n // TODO(timbonicus): should limit fields here, but would need filter\n // fields + table columns\n const response = await catalogApi.getEntities({\n filter: backendFilter,\n order: orderFields,\n });\n const entities = response.items.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n backendEntities: response.items,\n entities,\n totalItems: entities.length,\n };\n }\n const entities = outputState.backendEntities.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n backendEntities: outputState.backendEntities,\n entities,\n totalItems: entities.length,\n };\n },\n [\n catalogApi,\n queryParameters,\n requestedFilters,\n outputState,\n cursor,\n paginationMode,\n limit,\n offset,\n ],\n { loading: true },\n );\n\n // Slight debounce on the refresh, since (especially on page load) several\n // filters will be calling this in rapid succession.\n useDebounce(refresh, 10, [requestedFilters, cursor, limit, offset]);\n\n useEffect(() => {\n if (resolvedValue === undefined) {\n return;\n }\n setOutputState(resolvedValue);\n if (isMounted()) {\n const queryParams = Object.keys(requestedFilters).reduce(\n (params, key) => {\n const filter = requestedFilters[key as keyof EntityFilters] as\n | EntityFilter\n | undefined;\n if (filter?.toQueryValue) {\n params[key] = filter.toQueryValue();\n }\n return params;\n },\n {} as Record<string, string | string[]>,\n );\n\n const oldParams = qs.parse(location.search, {\n ignoreQueryPrefix: true,\n });\n const newParams = qs.stringify(\n {\n ...oldParams,\n filters: queryParams,\n ...(paginationMode === 'none' ? {} : { cursor, limit, offset }),\n },\n { addQueryPrefix: true, arrayFormat: 'repeat' },\n );\n const newUrl = `${window.location.pathname}${newParams}`;\n // We use direct history manipulation since useSearchParams and\n // useNavigate in react-router-dom cause unnecessary extra rerenders.\n // Also make sure to replace the state rather than pushing, since we\n // don't want there to be back/forward slots for every single filter\n // change.\n window.history?.replaceState(null, document.title, newUrl);\n }\n }, [\n cursor,\n isMounted,\n limit,\n location.search,\n offset,\n requestedFilters,\n resolvedValue,\n paginationMode,\n ]);\n\n const updateFilters = useCallback(\n (\n update:\n | Partial<EntityFilter>\n | ((prevFilters: EntityFilters) => Partial<EntityFilters>),\n ) => {\n // changing filters will affect pagination, so we need to reset\n // the cursor and start from the first page.\n // TODO(vinzscam): this is currently causing issues at page reload\n // where the state is not kept. Unfortunately we need to rethink\n // the way filters work in order to fix this.\n if (paginationMode === 'cursor') {\n setCursor(undefined);\n } else if (paginationMode === 'offset') {\n // Same thing with offset\n setOffset(0);\n }\n setRequestedFilters(prevFilters => {\n const newFilters =\n typeof update === 'function' ? update(prevFilters) : update;\n return { ...prevFilters, ...newFilters };\n });\n },\n [paginationMode],\n );\n\n const pageInfo = useMemo(() => {\n if (paginationMode !== 'cursor') {\n return undefined;\n }\n\n const prevCursor = outputState.pageInfo?.prevCursor;\n const nextCursor = outputState.pageInfo?.nextCursor;\n return {\n prev: prevCursor ? () => setCursor(prevCursor) : undefined,\n next: nextCursor ? () => setCursor(nextCursor) : undefined,\n };\n }, [paginationMode, outputState.pageInfo]);\n\n const value = useMemo(\n () => ({\n filters: outputState.appliedFilters,\n entities: outputState.entities,\n backendEntities: outputState.backendEntities,\n updateFilters,\n queryParameters,\n loading,\n error,\n pageInfo,\n totalItems: outputState.totalItems,\n limit,\n offset,\n setLimit,\n setOffset,\n paginationMode,\n }),\n [\n outputState,\n updateFilters,\n queryParameters,\n loading,\n error,\n pageInfo,\n limit,\n offset,\n paginationMode,\n setLimit,\n setOffset,\n ],\n );\n\n return (\n <OldEntityListContext.Provider value={value}>\n <NewEntityListContext.Provider\n value={createVersionedValueMap({ 1: value })}\n >\n {props.children}\n </NewEntityListContext.Provider>\n </OldEntityListContext.Provider>\n );\n};\n\n/**\n * Hook for interacting with the entity list context provided by the {@link EntityListProvider}.\n * @public\n */\nexport function useEntityList<\n EntityFilters extends DefaultEntityFilters = DefaultEntityFilters,\n>(): EntityListContextProps<EntityFilters> {\n const versionedHolder = useVersionedContext<{\n 1: EntityListContextProps<any>;\n }>('entity-list-context');\n const oldContext = useContext(OldEntityListContext);\n\n if (versionedHolder) {\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error('EntityListContext v1 not available');\n }\n return value;\n }\n\n if (oldContext) {\n return oldContext;\n }\n\n throw new Error('useEntityList must be used within EntityListProvider');\n}\n"],"names":["limit","offset","entities","backendFilter","previousBackendFilter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useEntityListProvider.esm.js","sources":["../../src/hooks/useEntityListProvider.tsx"],"sourcesContent":["/*\n * Copyright 2020 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 { QueryEntitiesResponse } from '@backstage/catalog-client';\nimport { Entity } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n createVersionedContext,\n createVersionedValueMap,\n useVersionedContext,\n} from '@backstage/version-bridge';\nimport { compact, isEqual } from 'lodash';\nimport qs from 'qs';\nimport {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { useLocation } from 'react-router-dom';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport useDebounce from 'react-use/esm/useDebounce';\nimport useMountedState from 'react-use/esm/useMountedState';\nimport { catalogApiRef } from '../api';\nimport {\n EntityErrorFilter,\n EntityKindFilter,\n EntityLifecycleFilter,\n EntityNamespaceFilter,\n EntityOrderFilter,\n EntityOrphanFilter,\n EntityOwnerFilter,\n EntityTagFilter,\n EntityTextFilter,\n EntityTypeFilter,\n EntityUserFilter,\n UserListFilter,\n} from '../filters';\nimport { EntityFilter, EntityListPagination } from '../types';\nimport {\n reduceBackendCatalogFilters,\n reduceCatalogFilters,\n reduceEntityFilters,\n} from '../utils/filters';\n\n/** @public */\nexport type DefaultEntityFilters = {\n kind?: EntityKindFilter;\n type?: EntityTypeFilter;\n user?: UserListFilter | EntityUserFilter;\n owners?: EntityOwnerFilter;\n lifecycles?: EntityLifecycleFilter;\n tags?: EntityTagFilter;\n text?: EntityTextFilter;\n orphan?: EntityOrphanFilter;\n error?: EntityErrorFilter;\n namespace?: EntityNamespaceFilter;\n order?: EntityOrderFilter;\n};\n\n/** @public */\nexport type PaginationMode = 'cursor' | 'offset' | 'none';\n\n/** @public */\nexport type EntityListContextProps<\n EntityFilters extends DefaultEntityFilters = DefaultEntityFilters,\n> = {\n /**\n * The currently registered filters, adhering to the shape of DefaultEntityFilters or an extension\n * of that default (to add custom filter types).\n */\n filters: EntityFilters;\n\n /**\n * The resolved list of catalog entities, after all filters are applied.\n */\n entities: Entity[];\n\n /**\n * The resolved list of catalog entities, after _only catalog-backend_ filters are applied.\n */\n backendEntities: Entity[];\n\n /**\n * Update one or more of the registered filters. Optional filters can be set to `undefined` to\n * reset the filter.\n */\n updateFilters: (\n filters:\n | Partial<EntityFilters>\n | ((prevFilters: EntityFilters) => Partial<EntityFilters>),\n ) => void;\n\n /**\n * Filter values from query parameters.\n */\n queryParameters: Partial<Record<keyof EntityFilters, string | string[]>>;\n\n loading: boolean;\n error?: Error;\n\n pageInfo?: {\n next?: () => void;\n prev?: () => void;\n };\n totalItems?: number;\n limit: number;\n offset?: number;\n setLimit: (limit: number) => void;\n setOffset?: (offset: number) => void;\n paginationMode: PaginationMode;\n};\n\n// This context has support for multiple concurrent versions of this package.\n// It is currently used in parallel with the old context in order to provide\n// a smooth transition, but will eventually be the only context we use.\nexport const NewEntityListContext = createVersionedContext<{\n 1: EntityListContextProps<any>;\n}>('entity-list-context');\n\n/**\n * Creates new context for entity listing and filtering.\n */\nexport const OldEntityListContext = createContext<\n EntityListContextProps<any> | undefined\n>(undefined);\n\ntype OutputState<EntityFilters extends DefaultEntityFilters> = {\n appliedFilters: EntityFilters;\n appliedCursor?: string;\n entities: Entity[];\n backendEntities: Entity[];\n pageInfo?: QueryEntitiesResponse['pageInfo'];\n totalItems?: number;\n offset?: number;\n limit?: number;\n};\n\n/**\n * @public\n */\nexport type EntityListProviderProps = PropsWithChildren<{\n pagination?: EntityListPagination;\n}>;\n\n/**\n * Provides entities and filters for a catalog listing.\n * @public\n */\nexport const EntityListProvider = <EntityFilters extends DefaultEntityFilters>(\n props: EntityListProviderProps,\n) => {\n const isMounted = useMountedState();\n const catalogApi = useApi(catalogApiRef);\n const [requestedFilters, setRequestedFilters] = useState<EntityFilters>(\n {} as EntityFilters,\n );\n\n // We use react-router's useLocation hook so updates from external sources trigger an update to\n // the queryParameters in outputState. Updates from this hook use replaceState below and won't\n // trigger a useLocation change; this would instead come from an external source, such as a manual\n // update of the URL or two catalog sidebar links with different catalog filters.\n const location = useLocation();\n\n const getPaginationMode = (): PaginationMode => {\n if (props.pagination === true) {\n return 'cursor';\n }\n return typeof props.pagination === 'object'\n ? props.pagination.mode ?? 'cursor'\n : 'none';\n };\n\n const paginationMode = getPaginationMode();\n const paginationLimit =\n typeof props.pagination === 'object' ? props.pagination.limit ?? 20 : 20;\n\n const {\n queryParameters,\n cursor: initialCursor,\n offset: initialOffset,\n limit: initialLimit,\n } = useMemo(() => {\n const parsed = qs.parse(location.search, {\n ignoreQueryPrefix: true,\n arrayLimit: 10000,\n });\n\n let limit = paginationLimit;\n if (typeof parsed.limit === 'string') {\n const queryLimit = Number.parseInt(parsed.limit, 10);\n if (!isNaN(queryLimit)) {\n limit = queryLimit;\n }\n }\n\n const offset =\n typeof parsed.offset === 'string' && paginationMode === 'offset'\n ? Number.parseInt(parsed.offset, 10)\n : undefined;\n\n return {\n queryParameters: (parsed.filters ?? {}) as Record<\n string,\n string | string[]\n >,\n cursor:\n typeof parsed.cursor === 'string' && paginationMode === 'cursor'\n ? parsed.cursor\n : undefined,\n offset:\n paginationMode === 'offset' && offset && !isNaN(offset)\n ? offset\n : undefined,\n limit,\n };\n }, [paginationMode, location.search, paginationLimit]);\n\n const [cursor, setCursor] = useState(initialCursor);\n const [offset, setOffset] = useState<number | undefined>(initialOffset);\n const [limit, setLimit] = useState(initialLimit);\n\n const [outputState, setOutputState] = useState<OutputState<EntityFilters>>(\n () => {\n return {\n appliedFilters: {} as EntityFilters,\n entities: [],\n backendEntities: [],\n pageInfo: {},\n offset,\n limit,\n };\n },\n );\n\n // The main async filter worker. Note that while it has a lot of dependencies\n // in terms of its implementation, the triggering only happens (debounced)\n // based on the requested filters changing.\n const [{ value: resolvedValue, loading, error }, refresh] = useAsyncFn(\n async () => {\n const kindValue =\n requestedFilters.kind?.value?.toLocaleLowerCase('en-US');\n const adjustedFilters =\n kindValue === 'user' || kindValue === 'group'\n ? { ...requestedFilters, owners: undefined }\n : requestedFilters;\n const compacted = compact(Object.values(adjustedFilters));\n const entityFilter = reduceEntityFilters(compacted);\n\n if (paginationMode !== 'none') {\n if (cursor) {\n if (cursor !== outputState.appliedCursor) {\n const response = await catalogApi.queryEntities({\n cursor,\n limit,\n });\n return {\n appliedFilters: requestedFilters,\n appliedCursor: cursor,\n backendEntities: response.items,\n entities: response.items.filter(entityFilter),\n pageInfo: response.pageInfo,\n totalItems: response.totalItems,\n };\n }\n const entities = outputState.backendEntities.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n appliedCursor: outputState.appliedCursor,\n backendEntities: outputState.backendEntities,\n entities,\n pageInfo: outputState.pageInfo,\n totalItems: outputState.totalItems,\n limit: outputState.limit,\n offset: outputState.offset,\n };\n }\n\n const backendFilter = reduceCatalogFilters(compacted);\n const previousBackendFilter = reduceCatalogFilters(\n compact(Object.values(outputState.appliedFilters)),\n );\n\n if (\n (paginationMode === 'offset' &&\n (outputState.limit !== limit || outputState.offset !== offset)) ||\n !isEqual(previousBackendFilter, backendFilter)\n ) {\n const response = await catalogApi.queryEntities({\n ...backendFilter,\n limit,\n offset,\n });\n return {\n appliedFilters: requestedFilters,\n backendEntities: response.items,\n entities: response.items.filter(entityFilter),\n pageInfo: response.pageInfo,\n totalItems: response.totalItems,\n limit,\n offset,\n };\n }\n const entities = outputState.backendEntities.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n backendEntities: outputState.backendEntities,\n entities,\n pageInfo: outputState.pageInfo,\n totalItems: outputState.totalItems,\n limit: outputState.limit,\n offset: outputState.offset,\n };\n }\n\n const backendFilter = reduceBackendCatalogFilters(compacted);\n const { orderFields } = reduceCatalogFilters(compacted);\n const previousBackendFilter = reduceBackendCatalogFilters(\n compact(Object.values(outputState.appliedFilters)),\n );\n\n // TODO(mtlewis): currently entities will never be requested unless\n // there's at least one filter, we should allow an initial request\n // to happen with no filters.\n if (!isEqual(previousBackendFilter, backendFilter)) {\n // TODO(timbonicus): should limit fields here, but would need filter\n // fields + table columns\n const response = await catalogApi.getEntities({\n filter: backendFilter,\n order: orderFields,\n });\n const entities = response.items.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n backendEntities: response.items,\n entities,\n totalItems: entities.length,\n };\n }\n const entities = outputState.backendEntities.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n backendEntities: outputState.backendEntities,\n entities,\n totalItems: entities.length,\n };\n },\n [\n catalogApi,\n queryParameters,\n requestedFilters,\n outputState,\n cursor,\n paginationMode,\n limit,\n offset,\n ],\n { loading: true },\n );\n\n // Slight debounce on the refresh, since (especially on page load) several\n // filters will be calling this in rapid succession.\n useDebounce(refresh, 10, [requestedFilters, cursor, limit, offset]);\n\n useEffect(() => {\n if (resolvedValue === undefined) {\n return;\n }\n setOutputState(resolvedValue);\n if (isMounted()) {\n const queryParams = Object.keys(requestedFilters).reduce(\n (params, key) => {\n const filter = requestedFilters[key as keyof EntityFilters] as\n | EntityFilter\n | undefined;\n if (filter?.toQueryValue) {\n params[key] = filter.toQueryValue();\n }\n return params;\n },\n {} as Record<string, string | string[]>,\n );\n\n const oldParams = qs.parse(location.search, {\n ignoreQueryPrefix: true,\n arrayLimit: 10000,\n });\n const newParams = qs.stringify(\n {\n ...oldParams,\n filters: queryParams,\n ...(paginationMode === 'none' ? {} : { cursor, limit, offset }),\n },\n { addQueryPrefix: true, arrayFormat: 'repeat' },\n );\n const newUrl = `${window.location.pathname}${newParams}`;\n // We use direct history manipulation since useSearchParams and\n // useNavigate in react-router-dom cause unnecessary extra rerenders.\n // Also make sure to replace the state rather than pushing, since we\n // don't want there to be back/forward slots for every single filter\n // change.\n window.history?.replaceState(null, document.title, newUrl);\n }\n }, [\n cursor,\n isMounted,\n limit,\n location.search,\n offset,\n requestedFilters,\n resolvedValue,\n paginationMode,\n ]);\n\n const updateFilters = useCallback(\n (\n update:\n | Partial<EntityFilter>\n | ((prevFilters: EntityFilters) => Partial<EntityFilters>),\n ) => {\n // changing filters will affect pagination, so we need to reset\n // the cursor and start from the first page.\n // TODO(vinzscam): this is currently causing issues at page reload\n // where the state is not kept. Unfortunately we need to rethink\n // the way filters work in order to fix this.\n if (paginationMode === 'cursor') {\n setCursor(undefined);\n } else if (paginationMode === 'offset') {\n // Same thing with offset\n setOffset(0);\n }\n setRequestedFilters(prevFilters => {\n const newFilters =\n typeof update === 'function' ? update(prevFilters) : update;\n return { ...prevFilters, ...newFilters };\n });\n },\n [paginationMode],\n );\n\n const pageInfo = useMemo(() => {\n if (paginationMode !== 'cursor') {\n return undefined;\n }\n\n const prevCursor = outputState.pageInfo?.prevCursor;\n const nextCursor = outputState.pageInfo?.nextCursor;\n return {\n prev: prevCursor ? () => setCursor(prevCursor) : undefined,\n next: nextCursor ? () => setCursor(nextCursor) : undefined,\n };\n }, [paginationMode, outputState.pageInfo]);\n\n const value = useMemo(\n () => ({\n filters: outputState.appliedFilters,\n entities: outputState.entities,\n backendEntities: outputState.backendEntities,\n updateFilters,\n queryParameters,\n loading,\n error,\n pageInfo,\n totalItems: outputState.totalItems,\n limit,\n offset,\n setLimit,\n setOffset,\n paginationMode,\n }),\n [\n outputState,\n updateFilters,\n queryParameters,\n loading,\n error,\n pageInfo,\n limit,\n offset,\n paginationMode,\n setLimit,\n setOffset,\n ],\n );\n\n return (\n <OldEntityListContext.Provider value={value}>\n <NewEntityListContext.Provider\n value={createVersionedValueMap({ 1: value })}\n >\n {props.children}\n </NewEntityListContext.Provider>\n </OldEntityListContext.Provider>\n );\n};\n\n/**\n * Hook for interacting with the entity list context provided by the {@link EntityListProvider}.\n * @public\n */\nexport function useEntityList<\n EntityFilters extends DefaultEntityFilters = DefaultEntityFilters,\n>(): EntityListContextProps<EntityFilters> {\n const versionedHolder = useVersionedContext<{\n 1: EntityListContextProps<any>;\n }>('entity-list-context');\n const oldContext = useContext(OldEntityListContext);\n\n if (versionedHolder) {\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error('EntityListContext v1 not available');\n }\n return value;\n }\n\n if (oldContext) {\n return oldContext;\n }\n\n throw new Error('useEntityList must be used within EntityListProvider');\n}\n"],"names":["limit","offset","entities","backendFilter","previousBackendFilter"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-catalog-react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.22.0-next.1",
|
|
4
4
|
"description": "A frontend library that helps other Backstage plugins interact with the catalog",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "web-library",
|
|
@@ -73,20 +73,21 @@
|
|
|
73
73
|
"test": "backstage-cli package test"
|
|
74
74
|
},
|
|
75
75
|
"dependencies": {
|
|
76
|
-
"@backstage/catalog-client": "
|
|
77
|
-
"@backstage/catalog-model": "
|
|
78
|
-
"@backstage/core-compat-api": "
|
|
79
|
-
"@backstage/core-components": "
|
|
80
|
-
"@backstage/core-plugin-api": "
|
|
81
|
-
"@backstage/errors": "
|
|
82
|
-
"@backstage/frontend-plugin-api": "
|
|
83
|
-
"@backstage/frontend-test-utils": "
|
|
84
|
-
"@backstage/integration-react": "
|
|
85
|
-
"@backstage/plugin-catalog-common": "
|
|
86
|
-
"@backstage/plugin-permission-common": "
|
|
87
|
-
"@backstage/plugin-permission-react": "
|
|
88
|
-
"@backstage/types": "
|
|
89
|
-
"@backstage/
|
|
76
|
+
"@backstage/catalog-client": "1.12.1",
|
|
77
|
+
"@backstage/catalog-model": "1.7.6",
|
|
78
|
+
"@backstage/core-compat-api": "0.5.8-next.1",
|
|
79
|
+
"@backstage/core-components": "0.18.7-next.1",
|
|
80
|
+
"@backstage/core-plugin-api": "1.12.3-next.0",
|
|
81
|
+
"@backstage/errors": "1.2.7",
|
|
82
|
+
"@backstage/frontend-plugin-api": "0.14.0-next.1",
|
|
83
|
+
"@backstage/frontend-test-utils": "0.4.6-next.1",
|
|
84
|
+
"@backstage/integration-react": "1.2.15-next.1",
|
|
85
|
+
"@backstage/plugin-catalog-common": "1.1.8-next.0",
|
|
86
|
+
"@backstage/plugin-permission-common": "0.9.6-next.0",
|
|
87
|
+
"@backstage/plugin-permission-react": "0.4.40-next.0",
|
|
88
|
+
"@backstage/types": "1.2.2",
|
|
89
|
+
"@backstage/ui": "0.12.0-next.1",
|
|
90
|
+
"@backstage/version-bridge": "1.0.11",
|
|
90
91
|
"@material-ui/core": "^4.12.2",
|
|
91
92
|
"@material-ui/icons": "^4.9.1",
|
|
92
93
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
@@ -100,11 +101,11 @@
|
|
|
100
101
|
"zen-observable": "^0.10.0"
|
|
101
102
|
},
|
|
102
103
|
"devDependencies": {
|
|
103
|
-
"@backstage/cli": "
|
|
104
|
-
"@backstage/core-app-api": "
|
|
105
|
-
"@backstage/plugin-catalog-common": "
|
|
106
|
-
"@backstage/plugin-scaffolder-common": "
|
|
107
|
-
"@backstage/test-utils": "
|
|
104
|
+
"@backstage/cli": "0.35.4-next.1",
|
|
105
|
+
"@backstage/core-app-api": "1.19.5-next.0",
|
|
106
|
+
"@backstage/plugin-catalog-common": "1.1.8-next.0",
|
|
107
|
+
"@backstage/plugin-scaffolder-common": "1.7.6-next.1",
|
|
108
|
+
"@backstage/test-utils": "1.7.15-next.1",
|
|
108
109
|
"@testing-library/dom": "^10.0.0",
|
|
109
110
|
"@testing-library/jest-dom": "^6.0.0",
|
|
110
111
|
"@testing-library/react": "^16.0.0",
|