@backstage/plugin-scaffolder 1.36.2-next.2 → 1.36.2
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 +31 -0
- package/dist/alpha/components/EditorSubPage.esm.js +69 -11
- package/dist/alpha/components/EditorSubPage.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/CustomFieldPlayground.esm.js +14 -15
- package/dist/alpha/components/TemplateEditorPage/CustomFieldPlayground.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResults.esm.js +2 -2
- package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResults.esm.js.map +1 -1
- package/dist/alpha.d.ts +1 -0
- package/dist/components/ActionsPage/ActionsPage.esm.js +155 -134
- package/dist/components/ActionsPage/ActionsPage.esm.js.map +1 -1
- package/dist/components/RenderSchema/RenderSchema.esm.js +202 -250
- package/dist/components/RenderSchema/RenderSchema.esm.js.map +1 -1
- package/dist/components/TemplatingExtensionsPage/TemplateFilters.esm.js +2 -5
- package/dist/components/TemplatingExtensionsPage/TemplateFilters.esm.js.map +1 -1
- package/dist/components/TemplatingExtensionsPage/TemplateGlobals.esm.js +2 -5
- package/dist/components/TemplatingExtensionsPage/TemplateGlobals.esm.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/plugins/scaffolder/package.json.esm.js +1 -1
- package/dist/translation.esm.js +2 -1
- package/dist/translation.esm.js.map +1 -1
- package/package.json +26 -26
|
@@ -1,21 +1,10 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { useState, useEffect } from 'react';
|
|
2
|
+
import { useState, useRef, useEffect, useMemo } from 'react';
|
|
3
3
|
import useAsync from 'react-use/esm/useAsync';
|
|
4
4
|
import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
|
|
5
|
-
import Accordion from '@material-ui/core/Accordion';
|
|
6
|
-
import AccordionDetails from '@material-ui/core/AccordionDetails';
|
|
7
|
-
import AccordionSummary from '@material-ui/core/AccordionSummary';
|
|
8
|
-
import Box from '@material-ui/core/Box';
|
|
9
|
-
import Typography from '@material-ui/core/Typography';
|
|
10
|
-
import { makeStyles } from '@material-ui/core/styles';
|
|
11
|
-
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
|
12
|
-
import LinkIcon from '@material-ui/icons/Link';
|
|
13
|
-
import Autocomplete from '@material-ui/lab/Autocomplete';
|
|
14
|
-
import TextField from '@material-ui/core/TextField';
|
|
15
|
-
import InputAdornment from '@material-ui/core/InputAdornment';
|
|
16
|
-
import SearchIcon from '@material-ui/icons/Search';
|
|
17
5
|
import { useRouteRef, useApi } from '@backstage/core-plugin-api';
|
|
18
|
-
import { Page, Header, Content,
|
|
6
|
+
import { Page, Header, Content, ErrorPanel, EmptyState, MarkdownContent } from '@backstage/core-components';
|
|
7
|
+
import { SearchField, List, ListRow, Flex, Text } from '@backstage/ui';
|
|
19
8
|
import { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';
|
|
20
9
|
import { useNavigate } from 'react-router-dom';
|
|
21
10
|
import { editRouteRef, scaffolderListTaskRouteRef, rootRouteRef, templatingExtensionsRouteRef } from '../../routes.esm.js';
|
|
@@ -24,51 +13,96 @@ import { scaffolderTranslationRef } from '../../translation.esm.js';
|
|
|
24
13
|
import { RenderSchema } from '../RenderSchema/RenderSchema.esm.js';
|
|
25
14
|
import { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable/ScaffolderUsageExamplesTable.esm.js';
|
|
26
15
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"&::after": {
|
|
39
|
-
position: "absolute",
|
|
40
|
-
content: '"*"',
|
|
41
|
-
top: 0,
|
|
42
|
-
right: theme.spacing(0.5),
|
|
43
|
-
fontWeight: "bolder",
|
|
44
|
-
color: theme.palette.error.light
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
link: {
|
|
48
|
-
paddingLeft: theme.spacing(1)
|
|
16
|
+
function ActionDetail({ action }) {
|
|
17
|
+
const { t } = useTranslationRef(scaffolderTranslationRef);
|
|
18
|
+
const expanded = useState({});
|
|
19
|
+
const partialSchemaRenderContext = {
|
|
20
|
+
expanded
|
|
21
|
+
};
|
|
22
|
+
const hasInput = !!action.schema?.input;
|
|
23
|
+
const hasOutput = !!action.schema?.output;
|
|
24
|
+
const hasExamples = !!action.examples;
|
|
25
|
+
if (!hasInput && !hasOutput && !hasExamples) {
|
|
26
|
+
return null;
|
|
49
27
|
}
|
|
50
|
-
|
|
28
|
+
return /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "6", children: [
|
|
29
|
+
hasInput && /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", children: [
|
|
30
|
+
/* @__PURE__ */ jsx(Text, { as: "h3", variant: "title-small", weight: "bold", children: t("actionsPage.action.input") }),
|
|
31
|
+
/* @__PURE__ */ jsx(
|
|
32
|
+
RenderSchema,
|
|
33
|
+
{
|
|
34
|
+
strategy: "properties",
|
|
35
|
+
context: {
|
|
36
|
+
parentId: `${action.id}.input`,
|
|
37
|
+
...partialSchemaRenderContext
|
|
38
|
+
},
|
|
39
|
+
schema: action?.schema?.input
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
] }),
|
|
43
|
+
hasOutput && /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", children: [
|
|
44
|
+
/* @__PURE__ */ jsx(Text, { as: "h3", variant: "title-small", weight: "bold", children: t("actionsPage.action.output") }),
|
|
45
|
+
/* @__PURE__ */ jsx(
|
|
46
|
+
RenderSchema,
|
|
47
|
+
{
|
|
48
|
+
strategy: "properties",
|
|
49
|
+
context: {
|
|
50
|
+
parentId: `${action.id}.output`,
|
|
51
|
+
...partialSchemaRenderContext
|
|
52
|
+
},
|
|
53
|
+
schema: action?.schema?.output
|
|
54
|
+
}
|
|
55
|
+
)
|
|
56
|
+
] }),
|
|
57
|
+
hasExamples && /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", children: [
|
|
58
|
+
/* @__PURE__ */ jsx(Text, { as: "h3", variant: "title-small", weight: "bold", children: t("actionsPage.action.examples") }),
|
|
59
|
+
/* @__PURE__ */ jsx(ScaffolderUsageExamplesTable, { examples: action.examples })
|
|
60
|
+
] })
|
|
61
|
+
] });
|
|
62
|
+
}
|
|
51
63
|
const ActionPageContent = () => {
|
|
52
64
|
const api = useApi(scaffolderApiRef);
|
|
53
65
|
const { t } = useTranslationRef(scaffolderTranslationRef);
|
|
54
|
-
const classes = useStyles();
|
|
55
66
|
const {
|
|
56
67
|
loading,
|
|
57
|
-
value
|
|
68
|
+
value: actions,
|
|
58
69
|
error
|
|
59
70
|
} = useAsync(async () => {
|
|
60
71
|
return api.listActions();
|
|
61
72
|
}, [api]);
|
|
62
|
-
const [
|
|
63
|
-
const
|
|
73
|
+
const [selectedActionId, setSelectedActionId] = useState();
|
|
74
|
+
const [searchQuery, setSearchQuery] = useState("");
|
|
75
|
+
const initialHashHandled = useRef(false);
|
|
64
76
|
useEffect(() => {
|
|
65
|
-
if (
|
|
66
|
-
|
|
77
|
+
if (initialHashHandled.current || !actions) {
|
|
78
|
+
return;
|
|
67
79
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
80
|
+
const hash = window.location.hash.slice(1);
|
|
81
|
+
if (hash && actions.some((a) => a.id === hash)) {
|
|
82
|
+
initialHashHandled.current = true;
|
|
83
|
+
setSelectedActionId(hash);
|
|
84
|
+
requestAnimationFrame(() => {
|
|
85
|
+
const row = document.querySelector(`[data-key="${CSS.escape(hash)}"]`);
|
|
86
|
+
if (row && typeof row.scrollIntoView === "function") {
|
|
87
|
+
row.scrollIntoView({ block: "nearest" });
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}, [actions]);
|
|
92
|
+
const filteredActions = useMemo(() => {
|
|
93
|
+
const nonLegacy = actions?.filter((action) => !action.id.startsWith("legacy:")) ?? [];
|
|
94
|
+
if (!searchQuery) {
|
|
95
|
+
return nonLegacy;
|
|
96
|
+
}
|
|
97
|
+
const lowerQuery = searchQuery.toLowerCase();
|
|
98
|
+
return nonLegacy.filter(
|
|
99
|
+
(action) => action.id.toLowerCase().includes(lowerQuery) || action.description?.toLowerCase().includes(lowerQuery)
|
|
100
|
+
);
|
|
101
|
+
}, [actions, searchQuery]);
|
|
102
|
+
const selectedAction = useMemo(
|
|
103
|
+
() => filteredActions.find((a) => a.id === selectedActionId),
|
|
104
|
+
[filteredActions, selectedActionId]
|
|
105
|
+
);
|
|
72
106
|
if (error) {
|
|
73
107
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
74
108
|
/* @__PURE__ */ jsx(ErrorPanel, { error }),
|
|
@@ -82,99 +116,86 @@ const ActionPageContent = () => {
|
|
|
82
116
|
)
|
|
83
117
|
] });
|
|
84
118
|
}
|
|
85
|
-
return /* @__PURE__ */ jsxs(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
{
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
119
|
+
return /* @__PURE__ */ jsxs(
|
|
120
|
+
"div",
|
|
121
|
+
{
|
|
122
|
+
style: {
|
|
123
|
+
display: "grid",
|
|
124
|
+
gridTemplateColumns: selectedAction ? "320px 1fr" : "1fr",
|
|
125
|
+
gridTemplateRows: "auto 1fr",
|
|
126
|
+
gap: 24
|
|
127
|
+
},
|
|
128
|
+
children: [
|
|
129
|
+
/* @__PURE__ */ jsx(
|
|
130
|
+
SearchField,
|
|
95
131
|
{
|
|
96
|
-
...params,
|
|
97
132
|
"aria-label": t("actionsPage.content.searchFieldPlaceholder"),
|
|
98
133
|
placeholder: t("actionsPage.content.searchFieldPlaceholder"),
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
...params.InputProps,
|
|
102
|
-
startAdornment: /* @__PURE__ */ jsx(InputAdornment, { position: "start", children: /* @__PURE__ */ jsx(SearchIcon, {}) })
|
|
103
|
-
}
|
|
134
|
+
value: searchQuery,
|
|
135
|
+
onChange: setSearchQuery
|
|
104
136
|
}
|
|
105
137
|
),
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
/* @__PURE__ */ jsx(Typography, { variant: "h6", component: "h3", children: t("actionsPage.action.input") }),
|
|
145
|
-
/* @__PURE__ */ jsx(
|
|
146
|
-
RenderSchema,
|
|
147
|
-
{
|
|
148
|
-
strategy: "properties",
|
|
149
|
-
context: {
|
|
150
|
-
parentId: `${action.id}.input`,
|
|
151
|
-
...partialSchemaRenderContext
|
|
152
|
-
},
|
|
153
|
-
schema: action?.schema?.input
|
|
154
|
-
}
|
|
155
|
-
)
|
|
156
|
-
] }),
|
|
157
|
-
action.schema?.output && /* @__PURE__ */ jsxs(Box, { pb: 2, children: [
|
|
158
|
-
/* @__PURE__ */ jsx(Typography, { variant: "h5", component: "h3", children: t("actionsPage.action.output") }),
|
|
159
|
-
/* @__PURE__ */ jsx(
|
|
160
|
-
RenderSchema,
|
|
161
|
-
{
|
|
162
|
-
strategy: "properties",
|
|
163
|
-
context: {
|
|
164
|
-
parentId: `${action.id}.output`,
|
|
165
|
-
...partialSchemaRenderContext
|
|
138
|
+
!loading && !filteredActions.length ? /* @__PURE__ */ jsx(
|
|
139
|
+
EmptyState,
|
|
140
|
+
{
|
|
141
|
+
missing: "info",
|
|
142
|
+
title: t("actionsPage.content.emptyState.title"),
|
|
143
|
+
description: t("actionsPage.content.emptyState.description")
|
|
144
|
+
}
|
|
145
|
+
) : /* @__PURE__ */ jsx(
|
|
146
|
+
List,
|
|
147
|
+
{
|
|
148
|
+
"aria-label": t("actionsPage.title"),
|
|
149
|
+
selectionMode: "single",
|
|
150
|
+
selectionBehavior: "toggle",
|
|
151
|
+
selectedKeys: selectedActionId ? [selectedActionId] : [],
|
|
152
|
+
style: { minWidth: 0, overflow: "hidden" },
|
|
153
|
+
onSelectionChange: (selection) => {
|
|
154
|
+
if (selection === "all") {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const selected = [...selection][0];
|
|
158
|
+
setSelectedActionId((prev) => {
|
|
159
|
+
const next = prev === selected ? void 0 : selected;
|
|
160
|
+
const hash = next ? `#${next}` : "";
|
|
161
|
+
window.history.replaceState(
|
|
162
|
+
null,
|
|
163
|
+
"",
|
|
164
|
+
`${window.location.pathname}${window.location.search}${hash}`
|
|
165
|
+
);
|
|
166
|
+
return next;
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
children: filteredActions.map((action) => /* @__PURE__ */ jsx(
|
|
170
|
+
ListRow,
|
|
171
|
+
{
|
|
172
|
+
id: action.id,
|
|
173
|
+
textValue: action.id,
|
|
174
|
+
description: action.description ?? void 0,
|
|
175
|
+
children: action.id
|
|
166
176
|
},
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
177
|
+
action.id
|
|
178
|
+
))
|
|
179
|
+
}
|
|
180
|
+
),
|
|
181
|
+
selectedAction && /* @__PURE__ */ jsxs(
|
|
182
|
+
Flex,
|
|
183
|
+
{
|
|
184
|
+
direction: "column",
|
|
185
|
+
gap: "3",
|
|
186
|
+
style: { gridColumn: 2, gridRow: "1 / -1", minWidth: 0 },
|
|
187
|
+
children: [
|
|
188
|
+
/* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "1", children: [
|
|
189
|
+
/* @__PURE__ */ jsx(Text, { as: "h2", variant: "title-medium", weight: "bold", children: selectedAction.id }),
|
|
190
|
+
selectedAction.description && /* @__PURE__ */ jsx(MarkdownContent, { content: selectedAction.description })
|
|
191
|
+
] }),
|
|
192
|
+
/* @__PURE__ */ jsx(ActionDetail, { action: selectedAction })
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
)
|
|
196
|
+
]
|
|
197
|
+
}
|
|
198
|
+
);
|
|
178
199
|
};
|
|
179
200
|
const ActionsPage = (props) => {
|
|
180
201
|
const navigate = useNavigate();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsPage.esm.js","sources":["../../../src/components/ActionsPage/ActionsPage.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 */\nimport { useEffect, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { Action, scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport LinkIcon from '@material-ui/icons/Link';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport TextField from '@material-ui/core/TextField';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport SearchIcon from '@material-ui/icons/Search';\n\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n MarkdownContent,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport {\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\n\nconst useStyles = makeStyles(theme => ({\n code: {\n fontFamily: 'Menlo, monospace',\n padding: theme.spacing(1),\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[700]\n : theme.palette.grey[300],\n display: 'inline-block',\n borderRadius: 5,\n border: `1px solid ${theme.palette.grey[500]}`,\n position: 'relative',\n },\n\n codeRequired: {\n '&::after': {\n position: 'absolute',\n content: '\"*\"',\n top: 0,\n right: theme.spacing(0.5),\n fontWeight: 'bolder',\n color: theme.palette.error.light,\n },\n },\n link: {\n paddingLeft: theme.spacing(1),\n },\n}));\n\nexport const ActionPageContent = () => {\n const api = useApi(scaffolderApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const classes = useStyles();\n const {\n loading,\n value = [],\n error,\n } = useAsync(async () => {\n return api.listActions();\n }, [api]);\n\n const [selectedAction, setSelectedAction] = useState<Action | null>(null);\n const expanded = useState<Expanded>({});\n\n useEffect(() => {\n if (value.length && window.location.hash) {\n document.querySelector(window.location.hash)?.scrollIntoView();\n }\n }, [value]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n return (\n <>\n <Box pb={3}>\n <Autocomplete\n id=\"actions-autocomplete\"\n options={value}\n loading={loading}\n getOptionLabel={option => option.id}\n renderInput={params => (\n <TextField\n {...params}\n aria-label={t('actionsPage.content.searchFieldPlaceholder')}\n placeholder={t('actionsPage.content.searchFieldPlaceholder')}\n variant=\"outlined\"\n InputProps={{\n ...params.InputProps,\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n }}\n />\n )}\n onChange={(_event, option) => {\n setSelectedAction(option);\n }}\n fullWidth\n />\n </Box>\n {(selectedAction ? [selectedAction] : value).map(action => {\n if (action.id.startsWith('legacy:')) {\n return undefined;\n }\n const partialSchemaRenderContext: Omit<\n SchemaRenderContext,\n 'parentId'\n > = {\n classes,\n expanded,\n headings: [<Typography variant=\"h6\" component=\"h4\" />],\n };\n return (\n <Box pb={3} key={action.id}>\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n id={action.id.replaceAll(':', '-')}\n variant=\"h5\"\n component=\"h2\"\n className={classes.code}\n >\n {action.id}\n </Typography>\n <Link\n className={classes.link}\n to={`#${action.id.replaceAll(':', '-')}`}\n >\n <LinkIcon />\n </Link>\n </Box>\n {action.description && (\n <MarkdownContent content={action.description} />\n )}\n {action.schema?.input && (\n <Box pb={2}>\n <Typography variant=\"h6\" component=\"h3\">\n {t('actionsPage.action.input')}\n </Typography>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.input`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.input}\n />\n </Box>\n )}\n {action.schema?.output && (\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('actionsPage.action.output')}\n </Typography>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.output}\n />\n </Box>\n )}\n {action.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h6\" component=\"h3\">\n {t('actionsPage.action.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={action.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Box>\n );\n })}\n </>\n );\n};\n\nexport type ActionsPageProps = {\n contextMenu?: {\n editor?: boolean;\n tasks?: boolean;\n create?: boolean;\n templatingExtensions?: boolean;\n };\n};\n\nexport const ActionsPage = (props: ActionsPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked: undefined,\n onTasksClicked:\n props?.contextMenu?.tasks !== false\n ? () => navigate(tasksLink())\n : undefined,\n onCreateClicked:\n props?.contextMenu?.create !== false\n ? () => navigate(createLink())\n : undefined,\n onTemplatingExtensionsClicked:\n props?.contextMenu?.templatingExtensions !== false\n ? () => navigate(templatingExtensionsLink())\n : undefined,\n };\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('actionsPage.pageTitle')}\n title={t('actionsPage.title')}\n subtitle={t('actionsPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ActionPageContent />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActionsPage.esm.js","sources":["../../../src/components/ActionsPage/ActionsPage.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 */\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { Action, scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\n\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n MarkdownContent,\n Page,\n} from '@backstage/core-components';\nimport { Flex, List, ListRow, SearchField, Text } from '@backstage/ui';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport {\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\n\nfunction ActionDetail({ action }: { action: Action }) {\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const expanded = useState<Expanded>({});\n\n const partialSchemaRenderContext: Omit<SchemaRenderContext, 'parentId'> = {\n expanded,\n };\n\n const hasInput = !!action.schema?.input;\n const hasOutput = !!action.schema?.output;\n const hasExamples = !!action.examples;\n\n if (!hasInput && !hasOutput && !hasExamples) {\n return null;\n }\n\n return (\n <Flex direction=\"column\" gap=\"6\">\n {hasInput && (\n <Flex direction=\"column\" gap=\"2\">\n <Text as=\"h3\" variant=\"title-small\" weight=\"bold\">\n {t('actionsPage.action.input')}\n </Text>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.input`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.input}\n />\n </Flex>\n )}\n {hasOutput && (\n <Flex direction=\"column\" gap=\"2\">\n <Text as=\"h3\" variant=\"title-small\" weight=\"bold\">\n {t('actionsPage.action.output')}\n </Text>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.output}\n />\n </Flex>\n )}\n {hasExamples && (\n <Flex direction=\"column\" gap=\"2\">\n <Text as=\"h3\" variant=\"title-small\" weight=\"bold\">\n {t('actionsPage.action.examples')}\n </Text>\n <ScaffolderUsageExamplesTable examples={action.examples!} />\n </Flex>\n )}\n </Flex>\n );\n}\n\nexport const ActionPageContent = () => {\n const api = useApi(scaffolderApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const {\n loading,\n value: actions,\n error,\n } = useAsync(async () => {\n return api.listActions();\n }, [api]);\n\n const [selectedActionId, setSelectedActionId] = useState<\n string | undefined\n >();\n const [searchQuery, setSearchQuery] = useState('');\n const initialHashHandled = useRef(false);\n\n useEffect(() => {\n if (initialHashHandled.current || !actions) {\n return;\n }\n const hash = window.location.hash.slice(1);\n if (hash && actions.some(a => a.id === hash)) {\n initialHashHandled.current = true;\n setSelectedActionId(hash);\n requestAnimationFrame(() => {\n const row = document.querySelector(`[data-key=\"${CSS.escape(hash)}\"]`);\n if (row && typeof row.scrollIntoView === 'function') {\n row.scrollIntoView({ block: 'nearest' });\n }\n });\n }\n }, [actions]);\n\n const filteredActions = useMemo(() => {\n const nonLegacy =\n actions?.filter(action => !action.id.startsWith('legacy:')) ?? [];\n if (!searchQuery) {\n return nonLegacy;\n }\n const lowerQuery = searchQuery.toLowerCase();\n return nonLegacy.filter(\n action =>\n action.id.toLowerCase().includes(lowerQuery) ||\n action.description?.toLowerCase().includes(lowerQuery),\n );\n }, [actions, searchQuery]);\n\n const selectedAction = useMemo(\n () => filteredActions.find(a => a.id === selectedActionId),\n [filteredActions, selectedActionId],\n );\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: selectedAction ? '320px 1fr' : '1fr',\n gridTemplateRows: 'auto 1fr',\n gap: 24,\n }}\n >\n <SearchField\n aria-label={t('actionsPage.content.searchFieldPlaceholder')}\n placeholder={t('actionsPage.content.searchFieldPlaceholder')}\n value={searchQuery}\n onChange={setSearchQuery}\n />\n {!loading && !filteredActions.length ? (\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n ) : (\n <List\n aria-label={t('actionsPage.title')}\n selectionMode=\"single\"\n selectionBehavior=\"toggle\"\n selectedKeys={selectedActionId ? [selectedActionId] : []}\n style={{ minWidth: 0, overflow: 'hidden' }}\n onSelectionChange={selection => {\n if (selection === 'all') {\n return;\n }\n const selected = [...selection][0] as string | undefined;\n setSelectedActionId(prev => {\n const next = prev === selected ? undefined : selected;\n const hash = next ? `#${next}` : '';\n window.history.replaceState(\n null,\n '',\n `${window.location.pathname}${window.location.search}${hash}`,\n );\n return next;\n });\n }}\n >\n {filteredActions.map(action => (\n <ListRow\n key={action.id}\n id={action.id}\n textValue={action.id}\n description={action.description ?? undefined}\n >\n {action.id}\n </ListRow>\n ))}\n </List>\n )}\n {selectedAction && (\n <Flex\n direction=\"column\"\n gap=\"3\"\n style={{ gridColumn: 2, gridRow: '1 / -1', minWidth: 0 }}\n >\n <Flex direction=\"column\" gap=\"1\">\n <Text as=\"h2\" variant=\"title-medium\" weight=\"bold\">\n {selectedAction.id}\n </Text>\n {selectedAction.description && (\n <MarkdownContent content={selectedAction.description} />\n )}\n </Flex>\n <ActionDetail action={selectedAction} />\n </Flex>\n )}\n </div>\n );\n};\n\nexport type ActionsPageProps = {\n contextMenu?: {\n editor?: boolean;\n tasks?: boolean;\n create?: boolean;\n templatingExtensions?: boolean;\n };\n};\n\nexport const ActionsPage = (props: ActionsPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked: undefined,\n onTasksClicked:\n props?.contextMenu?.tasks !== false\n ? () => navigate(tasksLink())\n : undefined,\n onCreateClicked:\n props?.contextMenu?.create !== false\n ? () => navigate(createLink())\n : undefined,\n onTemplatingExtensionsClicked:\n props?.contextMenu?.templatingExtensions !== false\n ? () => navigate(templatingExtensionsLink())\n : undefined,\n };\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('actionsPage.pageTitle')}\n title={t('actionsPage.title')}\n subtitle={t('actionsPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ActionPageContent />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|