@backstage/plugin-scaffolder 1.19.3 → 1.19.4-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/alpha/package.json +1 -1
- package/dist/alpha.esm.js +3 -8
- package/dist/alpha.esm.js.map +1 -1
- package/dist/{esm/routes-BvToNy4N.esm.js → api.esm.js} +2 -46
- package/dist/api.esm.js.map +1 -0
- package/dist/components/ActionsPage/ActionsPage.esm.js +186 -0
- package/dist/components/ActionsPage/ActionsPage.esm.js.map +1 -0
- package/dist/components/FileBrowser/FileBrowser.esm.js +90 -0
- package/dist/components/FileBrowser/FileBrowser.esm.js.map +1 -0
- package/dist/components/ListTasksPage/ListTasksPage.esm.js +120 -0
- package/dist/components/ListTasksPage/ListTasksPage.esm.js.map +1 -0
- package/dist/components/ListTasksPage/OwnerListPicker.esm.js +88 -0
- package/dist/components/ListTasksPage/OwnerListPicker.esm.js.map +1 -0
- package/dist/components/ListTasksPage/columns/CreatedAtColumn.esm.js +13 -0
- package/dist/components/ListTasksPage/columns/CreatedAtColumn.esm.js.map +1 -0
- package/dist/components/ListTasksPage/columns/OwnerEntityColumn.esm.js +31 -0
- package/dist/components/ListTasksPage/columns/OwnerEntityColumn.esm.js.map +1 -0
- package/dist/components/ListTasksPage/columns/TaskStatusColumn.esm.js +17 -0
- package/dist/components/ListTasksPage/columns/TaskStatusColumn.esm.js.map +1 -0
- package/dist/components/ListTasksPage/columns/TemplateTitleColumn.esm.js +21 -0
- package/dist/components/ListTasksPage/columns/TemplateTitleColumn.esm.js.map +1 -0
- package/dist/components/OngoingTask/ContextMenu.esm.js +84 -0
- package/dist/components/OngoingTask/ContextMenu.esm.js.map +1 -0
- package/dist/components/OngoingTask/OngoingTask.esm.js +169 -0
- package/dist/components/OngoingTask/OngoingTask.esm.js.map +1 -0
- package/dist/components/Router/Router.esm.js +105 -0
- package/dist/components/Router/Router.esm.js.map +1 -0
- package/dist/components/Router/index.esm.js +2 -0
- package/dist/components/Router/index.esm.js.map +1 -0
- package/dist/components/TemplateTypePicker/TemplateTypePicker.esm.js +70 -0
- package/dist/components/TemplateTypePicker/TemplateTypePicker.esm.js.map +1 -0
- package/dist/components/fields/EntityNamePicker/EntityNamePicker.esm.js +34 -0
- package/dist/components/fields/EntityNamePicker/EntityNamePicker.esm.js.map +1 -0
- package/dist/components/fields/EntityNamePicker/schema.esm.js +8 -0
- package/dist/components/fields/EntityNamePicker/schema.esm.js.map +1 -0
- package/dist/components/fields/EntityNamePicker/validation.esm.js +12 -0
- package/dist/components/fields/EntityNamePicker/validation.esm.js.map +1 -0
- package/dist/components/fields/EntityPicker/EntityPicker.esm.js +151 -0
- package/dist/components/fields/EntityPicker/EntityPicker.esm.js.map +1 -0
- package/dist/components/fields/EntityPicker/schema.esm.js +29 -0
- package/dist/components/fields/EntityPicker/schema.esm.js.map +1 -0
- package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js +84 -0
- package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js.map +1 -0
- package/dist/components/fields/EntityTagsPicker/schema.esm.js +15 -0
- package/dist/components/fields/EntityTagsPicker/schema.esm.js.map +1 -0
- package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js +168 -0
- package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js.map +1 -0
- package/dist/components/fields/MultiEntityPicker/schema.esm.js +23 -0
- package/dist/components/fields/MultiEntityPicker/schema.esm.js.map +1 -0
- package/dist/components/fields/MyGroupsPicker/MyGroupsPicker.esm.js +83 -0
- package/dist/components/fields/MyGroupsPicker/MyGroupsPicker.esm.js.map +1 -0
- package/dist/components/fields/MyGroupsPicker/schema.esm.js +14 -0
- package/dist/components/fields/MyGroupsPicker/schema.esm.js.map +1 -0
- package/dist/components/fields/OwnedEntityPicker/OwnedEntityPicker.esm.js +68 -0
- package/dist/components/fields/OwnedEntityPicker/OwnedEntityPicker.esm.js.map +1 -0
- package/dist/components/fields/OwnedEntityPicker/schema.esm.js +24 -0
- package/dist/components/fields/OwnedEntityPicker/schema.esm.js.map +1 -0
- package/dist/components/fields/OwnerPicker/OwnerPicker.esm.js +37 -0
- package/dist/components/fields/OwnerPicker/OwnerPicker.esm.js.map +1 -0
- package/dist/components/fields/OwnerPicker/schema.esm.js +24 -0
- package/dist/components/fields/OwnerPicker/schema.esm.js.map +1 -0
- package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js +75 -0
- package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js.map +1 -0
- package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js +80 -0
- package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js.map +1 -0
- package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js +38 -0
- package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js.map +1 -0
- package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js +44 -0
- package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js.map +1 -0
- package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js +42 -0
- package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js.map +1 -0
- package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js +44 -0
- package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js.map +1 -0
- package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js +200 -0
- package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js.map +1 -0
- package/dist/components/fields/RepoUrlPicker/RepoUrlPickerHost.esm.js +56 -0
- package/dist/components/fields/RepoUrlPicker/RepoUrlPickerHost.esm.js.map +1 -0
- package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js +48 -0
- package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js.map +1 -0
- package/dist/components/fields/RepoUrlPicker/schema.esm.js +32 -0
- package/dist/components/fields/RepoUrlPicker/schema.esm.js.map +1 -0
- package/dist/components/fields/RepoUrlPicker/utils.esm.js +46 -0
- package/dist/components/fields/RepoUrlPicker/utils.esm.js.map +1 -0
- package/dist/components/fields/RepoUrlPicker/validation.esm.js +43 -0
- package/dist/components/fields/RepoUrlPicker/validation.esm.js.map +1 -0
- package/dist/components/fields/SecretInput/SecretInput.esm.js +48 -0
- package/dist/components/fields/SecretInput/SecretInput.esm.js.map +1 -0
- package/dist/components/fields/utils.esm.js +15 -0
- package/dist/components/fields/utils.esm.js.map +1 -0
- package/dist/deprecated.esm.js +13 -0
- package/dist/deprecated.esm.js.map +1 -0
- package/dist/extensions/default.esm.js +72 -0
- package/dist/extensions/default.esm.js.map +1 -0
- package/dist/index.esm.js +13 -214
- package/dist/index.esm.js.map +1 -1
- package/dist/lib/download/helpers.esm.js +11 -0
- package/dist/lib/download/helpers.esm.js.map +1 -0
- package/dist/lib/filesystem/WebFileSystemAccess.esm.js +56 -0
- package/dist/lib/filesystem/WebFileSystemAccess.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/CustomFieldExplorer.esm.js +151 -0
- package/dist/next/TemplateEditorPage/CustomFieldExplorer.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/DirectoryEditorContext.esm.js +186 -0
- package/dist/next/TemplateEditorPage/DirectoryEditorContext.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/DryRunContext.esm.js +110 -0
- package/dist/next/TemplateEditorPage/DryRunContext.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/DryRunResults/DryRunResults.esm.js +70 -0
- package/dist/next/TemplateEditorPage/DryRunResults/DryRunResults.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/DryRunResults/DryRunResultsList.esm.js +98 -0
- package/dist/next/TemplateEditorPage/DryRunResults/DryRunResultsList.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/DryRunResults/DryRunResultsSplitView.esm.js +31 -0
- package/dist/next/TemplateEditorPage/DryRunResults/DryRunResultsSplitView.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/DryRunResults/DryRunResultsView.esm.js +145 -0
- package/dist/next/TemplateEditorPage/DryRunResults/DryRunResultsView.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/DryRunResults/IconLink.esm.js +25 -0
- package/dist/next/TemplateEditorPage/DryRunResults/IconLink.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/DryRunResults/TaskPageLinks.esm.js +40 -0
- package/dist/next/TemplateEditorPage/DryRunResults/TaskPageLinks.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/DryRunResults/TaskStatusStepper.esm.js +135 -0
- package/dist/next/TemplateEditorPage/DryRunResults/TaskStatusStepper.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/TemplateEditor.esm.js +52 -0
- package/dist/next/TemplateEditorPage/TemplateEditor.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/TemplateEditorBrowser.esm.js +74 -0
- package/dist/next/TemplateEditorPage/TemplateEditorBrowser.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/TemplateEditorForm.esm.js +174 -0
- package/dist/next/TemplateEditorPage/TemplateEditorForm.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/TemplateEditorIntro.esm.js +93 -0
- package/dist/next/TemplateEditorPage/TemplateEditorIntro.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/TemplateEditorPage.esm.js +82 -0
- package/dist/next/TemplateEditorPage/TemplateEditorPage.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/TemplateEditorTextArea.esm.js +120 -0
- package/dist/next/TemplateEditorPage/TemplateEditorTextArea.esm.js.map +1 -0
- package/dist/next/TemplateEditorPage/TemplateFormPreviewer.esm.js +160 -0
- package/dist/next/TemplateEditorPage/TemplateFormPreviewer.esm.js.map +1 -0
- package/dist/next/TemplateListPage/RegisterExistingButton.esm.js +35 -0
- package/dist/next/TemplateListPage/RegisterExistingButton.esm.js.map +1 -0
- package/dist/next/TemplateListPage/TemplateListPage.esm.js +101 -0
- package/dist/next/TemplateListPage/TemplateListPage.esm.js.map +1 -0
- package/dist/next/TemplateWizardPage/TemplateWizardPage.esm.js +67 -0
- package/dist/next/TemplateWizardPage/TemplateWizardPage.esm.js.map +1 -0
- package/dist/next/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js +60 -0
- package/dist/next/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js.map +1 -0
- package/dist/plugin.esm.js +125 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +47 -0
- package/dist/routes.esm.js.map +1 -0
- package/package.json +18 -18
- package/dist/esm/OngoingTask-ClfJCJcE.esm.js +0 -1575
- package/dist/esm/OngoingTask-ClfJCJcE.esm.js.map +0 -1
- package/dist/esm/index-UcPid-q1.esm.js +0 -2553
- package/dist/esm/index-UcPid-q1.esm.js.map +0 -1
- package/dist/esm/routes-BvToNy4N.esm.js.map +0 -1
package/dist/index.esm.js
CHANGED
|
@@ -1,215 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import Typography from '@material-ui/core/Typography';
|
|
15
|
-
import CheckBoxIcon from '@material-ui/icons/CheckBox';
|
|
16
|
-
import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';
|
|
17
|
-
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
|
18
|
-
import Autocomplete from '@material-ui/lab/Autocomplete';
|
|
19
|
-
import { useEntityTypeFilter } from '@backstage/plugin-catalog-react';
|
|
20
|
-
import '@backstage/catalog-model';
|
|
21
|
-
import '@backstage/errors';
|
|
22
|
-
import 'qs';
|
|
23
|
-
import 'zen-observable';
|
|
24
|
-
import 'event-source-polyfill';
|
|
25
|
-
import 'zod';
|
|
26
|
-
import '@backstage/catalog-client';
|
|
27
|
-
import '@material-ui/core/FormControl';
|
|
28
|
-
import 'react-use/esm/useAsync';
|
|
29
|
-
import '@material-ui/core/FormHelperText';
|
|
30
|
-
import '@material-ui/core/Input';
|
|
31
|
-
import '@material-ui/core/InputLabel';
|
|
32
|
-
import 'react-use/esm/useDebounce';
|
|
33
|
-
import '@material-ui/core/Divider';
|
|
34
|
-
import 'react-use/esm/useEffectOnce';
|
|
35
|
-
import 'zod-to-json-schema';
|
|
36
|
-
import 'react-router-dom';
|
|
37
|
-
import '@material-ui/core/Button';
|
|
38
|
-
import '@material-ui/core/Paper';
|
|
39
|
-
import '@material-ui/core/styles';
|
|
40
|
-
import '@material-ui/core/IconButton';
|
|
41
|
-
import '@material-ui/core/ListItemIcon';
|
|
42
|
-
import '@material-ui/core/ListItemText';
|
|
43
|
-
import '@material-ui/core/MenuItem';
|
|
44
|
-
import '@material-ui/core/MenuList';
|
|
45
|
-
import '@material-ui/core/Popover';
|
|
46
|
-
import '@react-hookz/web';
|
|
47
|
-
import '@material-ui/icons/Cancel';
|
|
48
|
-
import '@material-ui/icons/Repeat';
|
|
49
|
-
import '@material-ui/icons/Toc';
|
|
50
|
-
import '@material-ui/icons/ControlPoint';
|
|
51
|
-
import '@material-ui/icons/MoreVert';
|
|
52
|
-
import '@backstage/plugin-scaffolder-react/alpha';
|
|
53
|
-
|
|
54
|
-
const scaffolderPlugin = createPlugin({
|
|
55
|
-
id: "scaffolder",
|
|
56
|
-
apis: [
|
|
57
|
-
createApiFactory({
|
|
58
|
-
api: scaffolderApiRef$1,
|
|
59
|
-
deps: {
|
|
60
|
-
discoveryApi: discoveryApiRef,
|
|
61
|
-
scmIntegrationsApi: scmIntegrationsApiRef,
|
|
62
|
-
fetchApi: fetchApiRef,
|
|
63
|
-
identityApi: identityApiRef
|
|
64
|
-
},
|
|
65
|
-
factory: ({ discoveryApi, scmIntegrationsApi, fetchApi, identityApi }) => new ScaffolderClient({
|
|
66
|
-
discoveryApi,
|
|
67
|
-
scmIntegrationsApi,
|
|
68
|
-
fetchApi,
|
|
69
|
-
identityApi
|
|
70
|
-
})
|
|
71
|
-
})
|
|
72
|
-
],
|
|
73
|
-
routes: {
|
|
74
|
-
root: rootRouteRef$1,
|
|
75
|
-
selectedTemplate: selectedTemplateRouteRef,
|
|
76
|
-
ongoingTask: scaffolderTaskRouteRef,
|
|
77
|
-
actions: actionsRouteRef,
|
|
78
|
-
listTasks: scaffolderListTaskRouteRef,
|
|
79
|
-
edit: editRouteRef
|
|
80
|
-
},
|
|
81
|
-
externalRoutes: {
|
|
82
|
-
registerComponent: registerComponentRouteRef,
|
|
83
|
-
viewTechDoc: viewTechDocRouteRef
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
const EntityPickerFieldExtension = scaffolderPlugin.provide(
|
|
87
|
-
createScaffolderFieldExtension$1({
|
|
88
|
-
component: EntityPicker,
|
|
89
|
-
name: "EntityPicker",
|
|
90
|
-
schema: EntityPickerSchema
|
|
91
|
-
})
|
|
92
|
-
);
|
|
93
|
-
const EntityNamePickerFieldExtension = scaffolderPlugin.provide(
|
|
94
|
-
createScaffolderFieldExtension$1({
|
|
95
|
-
component: EntityNamePicker,
|
|
96
|
-
name: "EntityNamePicker",
|
|
97
|
-
validation: entityNamePickerValidation,
|
|
98
|
-
schema: EntityNamePickerSchema
|
|
99
|
-
})
|
|
100
|
-
);
|
|
101
|
-
const MultiEntityPickerFieldExtension = scaffolderPlugin.provide(
|
|
102
|
-
createScaffolderFieldExtension$1({
|
|
103
|
-
component: MultiEntityPicker,
|
|
104
|
-
name: "MultiEntityPicker",
|
|
105
|
-
schema: MultiEntityPickerSchema,
|
|
106
|
-
validation: validateMultiEntityPickerValidation
|
|
107
|
-
})
|
|
108
|
-
);
|
|
109
|
-
const RepoUrlPickerFieldExtension = scaffolderPlugin.provide(
|
|
110
|
-
createScaffolderFieldExtension$1({
|
|
111
|
-
component: RepoUrlPicker,
|
|
112
|
-
name: "RepoUrlPicker",
|
|
113
|
-
validation: repoPickerValidation,
|
|
114
|
-
schema: RepoUrlPickerSchema
|
|
115
|
-
})
|
|
116
|
-
);
|
|
117
|
-
const OwnerPickerFieldExtension = scaffolderPlugin.provide(
|
|
118
|
-
createScaffolderFieldExtension$1({
|
|
119
|
-
component: OwnerPicker,
|
|
120
|
-
name: "OwnerPicker",
|
|
121
|
-
schema: OwnerPickerSchema
|
|
122
|
-
})
|
|
123
|
-
);
|
|
124
|
-
const MyGroupsPickerFieldExtension = scaffolderPlugin.provide(
|
|
125
|
-
createScaffolderFieldExtension$1({
|
|
126
|
-
component: MyGroupsPicker,
|
|
127
|
-
name: "MyGroupsPicker",
|
|
128
|
-
schema: MyGroupsPickerSchema
|
|
129
|
-
})
|
|
130
|
-
);
|
|
131
|
-
const ScaffolderPage = scaffolderPlugin.provide(
|
|
132
|
-
createRoutableExtension({
|
|
133
|
-
name: "ScaffolderPage",
|
|
134
|
-
component: () => import('./esm/index-UcPid-q1.esm.js').then((m) => m.Router),
|
|
135
|
-
mountPoint: rootRouteRef$1
|
|
136
|
-
})
|
|
137
|
-
);
|
|
138
|
-
const OwnedEntityPickerFieldExtension = scaffolderPlugin.provide(
|
|
139
|
-
createScaffolderFieldExtension$1({
|
|
140
|
-
component: OwnedEntityPicker,
|
|
141
|
-
name: "OwnedEntityPicker",
|
|
142
|
-
schema: OwnedEntityPickerSchema
|
|
143
|
-
})
|
|
144
|
-
);
|
|
145
|
-
const EntityTagsPickerFieldExtension = scaffolderPlugin.provide(
|
|
146
|
-
createScaffolderFieldExtension$1({
|
|
147
|
-
component: EntityTagsPicker,
|
|
148
|
-
name: "EntityTagsPicker",
|
|
149
|
-
schema: EntityTagsPickerSchema
|
|
150
|
-
})
|
|
151
|
-
);
|
|
152
|
-
|
|
153
|
-
const icon = /* @__PURE__ */ React.createElement(CheckBoxOutlineBlankIcon, { fontSize: "small" });
|
|
154
|
-
const checkedIcon = /* @__PURE__ */ React.createElement(CheckBoxIcon, { fontSize: "small" });
|
|
155
|
-
const TemplateTypePicker = () => {
|
|
156
|
-
const alertApi = useApi(alertApiRef);
|
|
157
|
-
const { error, loading, availableTypes, selectedTypes, setSelectedTypes } = useEntityTypeFilter();
|
|
158
|
-
if (loading)
|
|
159
|
-
return /* @__PURE__ */ React.createElement(Progress, null);
|
|
160
|
-
if (!availableTypes)
|
|
161
|
-
return null;
|
|
162
|
-
if (error) {
|
|
163
|
-
alertApi.post({
|
|
164
|
-
message: `Failed to load entity types`,
|
|
165
|
-
severity: "error"
|
|
166
|
-
});
|
|
167
|
-
return null;
|
|
168
|
-
}
|
|
169
|
-
return /* @__PURE__ */ React.createElement(Box, { pb: 1, pt: 1 }, /* @__PURE__ */ React.createElement(
|
|
170
|
-
Typography,
|
|
171
|
-
{
|
|
172
|
-
variant: "button",
|
|
173
|
-
component: "label",
|
|
174
|
-
htmlFor: "categories-picker"
|
|
175
|
-
},
|
|
176
|
-
"Categories"
|
|
177
|
-
), /* @__PURE__ */ React.createElement(
|
|
178
|
-
Autocomplete,
|
|
179
|
-
{
|
|
180
|
-
id: "categories-picker",
|
|
181
|
-
multiple: true,
|
|
182
|
-
options: availableTypes,
|
|
183
|
-
value: selectedTypes,
|
|
184
|
-
onChange: (_, value) => setSelectedTypes(value),
|
|
185
|
-
renderOption: (option, { selected }) => /* @__PURE__ */ React.createElement(
|
|
186
|
-
FormControlLabel,
|
|
187
|
-
{
|
|
188
|
-
control: /* @__PURE__ */ React.createElement(
|
|
189
|
-
Checkbox,
|
|
190
|
-
{
|
|
191
|
-
icon,
|
|
192
|
-
checkedIcon,
|
|
193
|
-
checked: selected
|
|
194
|
-
}
|
|
195
|
-
),
|
|
196
|
-
label: capitalize(option)
|
|
197
|
-
}
|
|
198
|
-
),
|
|
199
|
-
size: "small",
|
|
200
|
-
popupIcon: /* @__PURE__ */ React.createElement(ExpandMoreIcon, { "data-testid": "categories-picker-expand" }),
|
|
201
|
-
renderInput: (params) => /* @__PURE__ */ React.createElement(TextField, { ...params, variant: "outlined" })
|
|
202
|
-
}
|
|
203
|
-
));
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
const rootRouteRef = rootRouteRef$1;
|
|
207
|
-
const createScaffolderFieldExtension = createScaffolderFieldExtension$1;
|
|
208
|
-
const ScaffolderFieldExtensions = ScaffolderFieldExtensions$1;
|
|
209
|
-
const useTemplateSecrets = useTemplateSecrets$1;
|
|
210
|
-
const scaffolderApiRef = scaffolderApiRef$1;
|
|
211
|
-
const createScaffolderLayout = createScaffolderLayout$1;
|
|
212
|
-
const ScaffolderLayouts = ScaffolderLayouts$1;
|
|
213
|
-
|
|
214
|
-
export { EntityNamePickerFieldExtension, EntityPickerFieldExtension, EntityTagsPickerFieldExtension, MultiEntityPickerFieldExtension, MyGroupsPickerFieldExtension, MyGroupsPickerSchema, OwnedEntityPickerFieldExtension, OwnerPickerFieldExtension, RepoUrlPickerFieldExtension, ScaffolderClient, ScaffolderFieldExtensions, ScaffolderLayouts, ScaffolderPage, TemplateTypePicker, createScaffolderFieldExtension, createScaffolderLayout, repoPickerValidation, rootRouteRef, scaffolderApiRef, scaffolderPlugin, useTemplateSecrets };
|
|
1
|
+
export { ScaffolderClient } from './api.esm.js';
|
|
2
|
+
export { EntityNamePickerFieldExtension, EntityPickerFieldExtension, EntityTagsPickerFieldExtension, MultiEntityPickerFieldExtension, MyGroupsPickerFieldExtension, OwnedEntityPickerFieldExtension, OwnerPickerFieldExtension, RepoUrlPickerFieldExtension, ScaffolderPage, scaffolderPlugin } from './plugin.esm.js';
|
|
3
|
+
export { EntityPickerFieldSchema } from './components/fields/EntityPicker/schema.esm.js';
|
|
4
|
+
export { OwnerPickerFieldSchema } from './components/fields/OwnerPicker/schema.esm.js';
|
|
5
|
+
export { RepoUrlPickerFieldSchema } from './components/fields/RepoUrlPicker/schema.esm.js';
|
|
6
|
+
export { repoPickerValidation } from './components/fields/RepoUrlPicker/validation.esm.js';
|
|
7
|
+
export { OwnedEntityPickerFieldSchema } from './components/fields/OwnedEntityPicker/schema.esm.js';
|
|
8
|
+
export { EntityTagsPickerFieldSchema } from './components/fields/EntityTagsPicker/schema.esm.js';
|
|
9
|
+
export { MyGroupsPickerFieldSchema, MyGroupsPickerSchema } from './components/fields/MyGroupsPicker/schema.esm.js';
|
|
10
|
+
export { makeFieldSchemaFromZod } from './components/fields/utils.esm.js';
|
|
11
|
+
export { TemplateTypePicker } from './components/TemplateTypePicker/TemplateTypePicker.esm.js';
|
|
12
|
+
export { OngoingTask as TaskPage } from './components/OngoingTask/OngoingTask.esm.js';
|
|
13
|
+
export { ScaffolderFieldExtensions, ScaffolderLayouts, createScaffolderFieldExtension, createScaffolderLayout, rootRouteRef, scaffolderApiRef, useTemplateSecrets } from './deprecated.esm.js';
|
|
215
14
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/plugin.tsx","../src/components/TemplateTypePicker/TemplateTypePicker.tsx","../src/deprecated.ts"],"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 { scmIntegrationsApiRef } from '@backstage/integration-react';\nimport {\n createScaffolderFieldExtension,\n scaffolderApiRef,\n} from '@backstage/plugin-scaffolder-react';\nimport { ScaffolderClient } from './api';\nimport {\n EntityPicker,\n EntityPickerSchema,\n} from './components/fields/EntityPicker/EntityPicker';\nimport { entityNamePickerValidation } from './components/fields/EntityNamePicker';\nimport {\n EntityNamePicker,\n EntityNamePickerSchema,\n} from './components/fields/EntityNamePicker/EntityNamePicker';\nimport {\n OwnerPicker,\n OwnerPickerSchema,\n} from './components/fields/OwnerPicker/OwnerPicker';\nimport {\n MultiEntityPicker,\n MultiEntityPickerSchema,\n validateMultiEntityPickerValidation,\n} from './components/fields/MultiEntityPicker/MultiEntityPicker';\nimport { repoPickerValidation } from './components/fields/RepoUrlPicker';\nimport {\n RepoUrlPicker,\n RepoUrlPickerSchema,\n} from './components/fields/RepoUrlPicker/RepoUrlPicker';\nimport {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n OwnedEntityPicker,\n OwnedEntityPickerSchema,\n} from './components/fields/OwnedEntityPicker/OwnedEntityPicker';\nimport {\n EntityTagsPicker,\n EntityTagsPickerSchema,\n} from './components/fields/EntityTagsPicker/EntityTagsPicker';\nimport {\n registerComponentRouteRef,\n rootRouteRef,\n viewTechDocRouteRef,\n selectedTemplateRouteRef,\n scaffolderTaskRouteRef,\n scaffolderListTaskRouteRef,\n actionsRouteRef,\n editRouteRef,\n} from './routes';\nimport {\n MyGroupsPicker,\n MyGroupsPickerSchema,\n} from './components/fields/MyGroupsPicker/MyGroupsPicker';\n\n/**\n * The main plugin export for the scaffolder.\n * @public\n */\nexport const scaffolderPlugin = createPlugin({\n id: 'scaffolder',\n apis: [\n createApiFactory({\n api: scaffolderApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n scmIntegrationsApi: scmIntegrationsApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, scmIntegrationsApi, fetchApi, identityApi }) =>\n new ScaffolderClient({\n discoveryApi,\n scmIntegrationsApi,\n fetchApi,\n identityApi,\n }),\n }),\n ],\n routes: {\n root: rootRouteRef,\n selectedTemplate: selectedTemplateRouteRef,\n ongoingTask: scaffolderTaskRouteRef,\n actions: actionsRouteRef,\n listTasks: scaffolderListTaskRouteRef,\n edit: editRouteRef,\n },\n externalRoutes: {\n registerComponent: registerComponentRouteRef,\n viewTechDoc: viewTechDocRouteRef,\n },\n});\n\n/**\n * A field extension for selecting an Entity that exists in the Catalog.\n *\n * @public\n */\nexport const EntityPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: EntityPicker,\n name: 'EntityPicker',\n schema: EntityPickerSchema,\n }),\n);\n\n/**\n * The field extension for selecting a name for a new Entity in the Catalog.\n *\n * @public\n */\nexport const EntityNamePickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: EntityNamePicker,\n name: 'EntityNamePicker',\n validation: entityNamePickerValidation,\n schema: EntityNamePickerSchema,\n }),\n);\n\n/**\n * A field extension for selecting multiple entities that exists in the Catalog.\n *\n * @public\n */\nexport const MultiEntityPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: MultiEntityPicker,\n name: 'MultiEntityPicker',\n schema: MultiEntityPickerSchema,\n validation: validateMultiEntityPickerValidation,\n }),\n);\n\n/**\n * The field extension which provides the ability to select a RepositoryUrl.\n * Currently, this is an encoded URL that looks something like the following `github.com?repo=myRepoName&owner=backstage`.\n *\n * @public\n */\nexport const RepoUrlPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: RepoUrlPicker,\n name: 'RepoUrlPicker',\n validation: repoPickerValidation,\n schema: RepoUrlPickerSchema,\n }),\n);\n\n/**\n * A field extension for picking users and groups out of the Catalog.\n *\n * @public\n */\nexport const OwnerPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: OwnerPicker,\n name: 'OwnerPicker',\n schema: OwnerPickerSchema,\n }),\n);\n\n/**\n * A field extension for picking groups a user belongs to out of the catalog.\n *\n * @public\n */\nexport const MyGroupsPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: MyGroupsPicker,\n name: 'MyGroupsPicker',\n schema: MyGroupsPickerSchema,\n }),\n);\n\n/**\n * The Router and main entrypoint to the Scaffolder plugin.\n *\n * @public\n */\nexport const ScaffolderPage = scaffolderPlugin.provide(\n createRoutableExtension({\n name: 'ScaffolderPage',\n component: () => import('./components/Router').then(m => m.Router),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * A field extension to show all the Entities that are owned by the current logged-in User for use in templates.\n *\n * @public\n */\nexport const OwnedEntityPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: OwnedEntityPicker,\n name: 'OwnedEntityPicker',\n schema: OwnedEntityPickerSchema,\n }),\n);\n\n/**\n * EntityTagsPickerFieldExtension\n * @public\n */\nexport const EntityTagsPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: EntityTagsPicker,\n name: 'EntityTagsPicker',\n schema: EntityTagsPickerSchema,\n }),\n);\n","/*\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 React from 'react';\nimport capitalize from 'lodash/capitalize';\nimport { Progress } from '@backstage/core-components';\nimport Box from '@material-ui/core/Box';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { useEntityTypeFilter } from '@backstage/plugin-catalog-react';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\n/**\n * The component to select the `type` of `Template` that you will see in the table.\n *\n * @public\n */\nexport const TemplateTypePicker = () => {\n const alertApi = useApi(alertApiRef);\n const { error, loading, availableTypes, selectedTypes, setSelectedTypes } =\n useEntityTypeFilter();\n\n if (loading) return <Progress />;\n\n if (!availableTypes) return null;\n\n if (error) {\n alertApi.post({\n message: `Failed to load entity types`,\n severity: 'error',\n });\n return null;\n }\n\n return (\n <Box pb={1} pt={1}>\n <Typography\n variant=\"button\"\n component=\"label\"\n htmlFor=\"categories-picker\"\n >\n Categories\n </Typography>\n <Autocomplete<string, true>\n id=\"categories-picker\"\n multiple\n options={availableTypes}\n value={selectedTypes}\n onChange={(_: object, value: string[]) => setSelectedTypes(value)}\n renderOption={(option, { selected }) => (\n <FormControlLabel\n control={\n <Checkbox\n icon={icon}\n checkedIcon={checkedIcon}\n checked={selected}\n />\n }\n label={capitalize(option)}\n />\n )}\n size=\"small\"\n popupIcon={<ExpandMoreIcon data-testid=\"categories-picker-expand\" />}\n renderInput={params => <TextField {...params} variant=\"outlined\" />}\n />\n </Box>\n );\n};\n","/*\n * Copyright 2022 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\n/*\n * This file is here to re-export exports from the `@backage/plugin-scaffolder-react` package to keep backwards compatibility.\n * But mark them as deprecated so that any import that is using these exports will be notified that they should use the `-react` package instead.\n * It's a little awkward to get the deprecated notice to show up in the API report, which is why it's all been extracted out to this file.\n */\n\nimport {\n createScaffolderFieldExtension as createScaffolderFieldExtensionTemp,\n ScaffolderFieldExtensions as ScaffolderFieldExtensionsTemp,\n useTemplateSecrets as useTemplateSecretsTemp,\n scaffolderApiRef as scaffolderApiRefTemp,\n createScaffolderLayout as createScaffolderLayoutTemp,\n ScaffolderLayouts as ScaffolderLayoutsTemp,\n type LayoutOptions as LayoutOptionsTemp,\n type LayoutTemplate as LayoutTemplateTemp,\n type ScaffolderApi as ScaffolderApiTemp,\n type ScaffolderUseTemplateSecrets as ScaffolderUseTemplateSecretsTemp,\n type TemplateParameterSchema as TemplateParameterSchemaTemp,\n type CustomFieldExtensionSchema as CustomFieldExtensionSchemaTemp,\n type CustomFieldValidator as CustomFieldValidatorTemp,\n type FieldExtensionOptions as FieldExtensionOptionsTemp,\n type FieldExtensionComponentProps as FieldExtensionComponentPropsTemp,\n type FieldExtensionComponent as FieldExtensionComponentTemp,\n type ListActionsResponse as ListActionsResponseTemp,\n type LogEvent as LogEventTemp,\n type ScaffolderDryRunOptions as ScaffolderDryRunOptionsTemp,\n type ScaffolderDryRunResponse as ScaffolderDryRunResponseTemp,\n type ScaffolderGetIntegrationsListOptions as ScaffolderGetIntegrationsListOptionsTemp,\n type ScaffolderGetIntegrationsListResponse as ScaffolderGetIntegrationsListResponseTemp,\n type ScaffolderOutputLink as ScaffolderOutputLinkTemp,\n type ScaffolderScaffoldOptions as ScaffolderScaffoldOptionsTemp,\n type ScaffolderScaffoldResponse as ScaffolderScaffoldResponseTemp,\n type ScaffolderStreamLogsOptions as ScaffolderStreamLogsOptionsTemp,\n type ScaffolderTask as ScaffolderTaskTemp,\n type ScaffolderTaskOutput as ScaffolderTaskOutputTemp,\n type ScaffolderTaskStatus as ScaffolderTaskStatusTemp,\n} from '@backstage/plugin-scaffolder-react';\n\nimport { rootRouteRef as rootRouteRefTemp } from './routes';\n\n/**\n * @public\n * @deprecated use import from `{@link @backstage/plugin-scaffolder#scaffolderPlugin}.routes.root` instead.\n */\nexport const rootRouteRef = rootRouteRefTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#createScaffolderFieldExtension} instead as this has now been moved.\n */\nexport const createScaffolderFieldExtension =\n createScaffolderFieldExtensionTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderFieldExtensions} instead as this has now been moved.\n */\nexport const ScaffolderFieldExtensions = ScaffolderFieldExtensionsTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#useTemplateSecrets} instead as this has now been moved.\n */\nexport const useTemplateSecrets = useTemplateSecretsTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#scaffolderApiRef} instead as this has now been moved.\n */\nexport const scaffolderApiRef = scaffolderApiRefTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderApi} instead as this has now been moved.\n */\nexport type ScaffolderApi = ScaffolderApiTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderUseTemplateSecrets} instead as this has now been moved.\n */\nexport type ScaffolderUseTemplateSecrets = ScaffolderUseTemplateSecretsTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#TemplateParameterSchema} instead as this has now been moved.\n */\nexport type TemplateParameterSchema = TemplateParameterSchemaTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#CustomFieldExtensionSchema} instead as this has now been moved.\n */\nexport type CustomFieldExtensionSchema = CustomFieldExtensionSchemaTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#CustomFieldValidator} instead as this has now been moved.\n */\nexport type CustomFieldValidator<TReturnFieldData> =\n CustomFieldValidatorTemp<TReturnFieldData>;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#FieldExtensionOptions} instead as this has now been moved.\n */\nexport type FieldExtensionOptions = FieldExtensionOptionsTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#FieldExtensionComponentProps} instead as this has now been moved.\n */\nexport type FieldExtensionComponentProps<\n TFieldReturnValue,\n TUiOptions extends {} = {},\n> = FieldExtensionComponentPropsTemp<TFieldReturnValue, TUiOptions>;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#FieldExtensionComponent} instead as this has now been moved.\n */\nexport type FieldExtensionComponent<_TReturnValue, _TInputProps> =\n FieldExtensionComponentTemp<_TReturnValue, _TInputProps>;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ListActionsResponse} instead as this has now been moved.\n */\nexport type ListActionsResponse = ListActionsResponseTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#LogEvent} instead as this has now been moved.\n */\nexport type LogEvent = LogEventTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderDryRunOptions} instead as this has now been moved.\n */\nexport type ScaffolderDryRunOptions = ScaffolderDryRunOptionsTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderDryRunResponse} instead as this has now been moved.\n */\nexport type ScaffolderDryRunResponse = ScaffolderDryRunResponseTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderGetIntegrationsListOptions} instead as this has now been moved.\n */\nexport type ScaffolderGetIntegrationsListOptions =\n ScaffolderGetIntegrationsListOptionsTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderGetIntegrationsListResponse} instead as this has now been moved.\n */\nexport type ScaffolderGetIntegrationsListResponse =\n ScaffolderGetIntegrationsListResponseTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderOutputlink} instead as this has now been moved.\n */\nexport type ScaffolderOutputlink = ScaffolderOutputLinkTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderScaffoldOptions} instead as this has now been moved.\n */\nexport type ScaffolderScaffoldOptions = ScaffolderScaffoldOptionsTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderScaffoldResponse} instead as this has now been moved.\n */\nexport type ScaffolderScaffoldResponse = ScaffolderScaffoldResponseTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderStreamLogsOptions} instead as this has now been moved.\n */\nexport type ScaffolderStreamLogsOptions = ScaffolderStreamLogsOptionsTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderTask} instead as this has now been moved.\n */\nexport type ScaffolderTask = ScaffolderTaskTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderTaskOutput} instead as this has now been moved.\n */\nexport type ScaffolderTaskOutput = ScaffolderTaskOutputTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderTaskStatus} instead as this has now been moved.\n */\nexport type ScaffolderTaskStatus = ScaffolderTaskStatusTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#createScaffolderLayout} instead as this has now been moved.\n */\nexport const createScaffolderLayout = createScaffolderLayoutTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderLayouts} instead as this has now been moved.\n */\nexport const ScaffolderLayouts = ScaffolderLayoutsTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#LayoutTemplate} instead as this has now been moved.\n */\nexport type LayoutTemplate = LayoutTemplateTemp;\n/**\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-react#LayoutOptions} instead as this has now been moved.\n */\nexport type LayoutOptions = LayoutOptionsTemp;\n\n/**\n * TaskPageProps for constructing a TaskPage\n * @public\n * @deprecated - this is a useless type that is no longer used.\n */\nexport type TaskPageProps = {\n // Optional loading text shown before a task begins executing.\n loadingText?: string;\n};\n"],"names":["scaffolderApiRef","rootRouteRef","createScaffolderFieldExtension","rootRouteRefTemp","createScaffolderFieldExtensionTemp","ScaffolderFieldExtensionsTemp","useTemplateSecretsTemp","scaffolderApiRefTemp","createScaffolderLayoutTemp","ScaffolderLayoutsTemp"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
function downloadBlob(blob, name) {
|
|
2
|
+
const a = document.createElement("a");
|
|
3
|
+
a.href = URL.createObjectURL(blob);
|
|
4
|
+
a.download = name;
|
|
5
|
+
a.click();
|
|
6
|
+
URL.revokeObjectURL(a.href);
|
|
7
|
+
a.remove();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export { downloadBlob };
|
|
11
|
+
//# sourceMappingURL=helpers.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.esm.js","sources":["../../../src/lib/download/helpers.ts"],"sourcesContent":["/*\n * Copyright 2022 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\nexport function downloadBlob(blob: Blob, name: string) {\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = name;\n a.click();\n URL.revokeObjectURL(a.href);\n a.remove();\n}\n"],"names":[],"mappings":"AAgBgB,SAAA,YAAA,CAAa,MAAY,IAAc,EAAA;AACrD,EAAM,MAAA,CAAA,GAAI,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA,CAAA;AACpC,EAAE,CAAA,CAAA,IAAA,GAAO,GAAI,CAAA,eAAA,CAAgB,IAAI,CAAA,CAAA;AACjC,EAAA,CAAA,CAAE,QAAW,GAAA,IAAA,CAAA;AACb,EAAA,CAAA,CAAE,KAAM,EAAA,CAAA;AACR,EAAI,GAAA,CAAA,eAAA,CAAgB,EAAE,IAAI,CAAA,CAAA;AAC1B,EAAA,CAAA,CAAE,MAAO,EAAA,CAAA;AACX;;;;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const showDirectoryPicker = window.showDirectoryPicker;
|
|
2
|
+
class WebFileAccess {
|
|
3
|
+
constructor(path, handle) {
|
|
4
|
+
this.path = path;
|
|
5
|
+
this.handle = handle;
|
|
6
|
+
}
|
|
7
|
+
file() {
|
|
8
|
+
return this.handle.getFile();
|
|
9
|
+
}
|
|
10
|
+
async save(data) {
|
|
11
|
+
const writable = await this.handle.createWritable();
|
|
12
|
+
await writable.write(data);
|
|
13
|
+
await writable.close();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
class WebDirectoryAccess {
|
|
17
|
+
constructor(handle) {
|
|
18
|
+
this.handle = handle;
|
|
19
|
+
}
|
|
20
|
+
async listFiles() {
|
|
21
|
+
const content = [];
|
|
22
|
+
for await (const entry of this.listDirectoryContents(this.handle)) {
|
|
23
|
+
content.push(entry);
|
|
24
|
+
}
|
|
25
|
+
return content;
|
|
26
|
+
}
|
|
27
|
+
async *listDirectoryContents(dirHandle, basePath = []) {
|
|
28
|
+
for await (const handle of dirHandle.values()) {
|
|
29
|
+
if (handle.kind === "file") {
|
|
30
|
+
yield new WebFileAccess([...basePath, handle.name].join("/"), handle);
|
|
31
|
+
} else if (handle.kind === "directory") {
|
|
32
|
+
if (handle.name === ".git") {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
yield* this.listDirectoryContents(handle, [...basePath, handle.name]);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
class WebFileSystemAccess {
|
|
41
|
+
static isSupported() {
|
|
42
|
+
return Boolean(showDirectoryPicker);
|
|
43
|
+
}
|
|
44
|
+
static async requestDirectoryAccess() {
|
|
45
|
+
if (!showDirectoryPicker) {
|
|
46
|
+
throw new Error("File system access is not supported");
|
|
47
|
+
}
|
|
48
|
+
const handle = await showDirectoryPicker();
|
|
49
|
+
return new WebDirectoryAccess(handle);
|
|
50
|
+
}
|
|
51
|
+
constructor() {
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { WebFileSystemAccess };
|
|
56
|
+
//# sourceMappingURL=WebFileSystemAccess.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebFileSystemAccess.esm.js","sources":["../../../src/lib/filesystem/WebFileSystemAccess.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { TemplateDirectoryAccess, TemplateFileAccess } from './types';\n\ntype WritableFileHandle = FileSystemFileHandle & {\n createWritable(): Promise<{\n write(data: string | Blob | BufferSource): Promise<void>;\n close(): Promise<void>;\n }>;\n};\n\n// A nicer type than the one from the TS lib\ninterface IterableDirectoryHandle extends FileSystemDirectoryHandle {\n values(): AsyncIterable<\n | ({ kind: 'file' } & WritableFileHandle)\n | ({ kind: 'directory' } & IterableDirectoryHandle)\n >;\n}\n\nconst showDirectoryPicker = (window as any).showDirectoryPicker as\n | (() => Promise<IterableDirectoryHandle>)\n | undefined;\n\nclass WebFileAccess implements TemplateFileAccess {\n constructor(\n readonly path: string,\n private readonly handle: WritableFileHandle,\n ) {}\n\n file(): Promise<File> {\n return this.handle.getFile();\n }\n\n async save(data: string | Blob | BufferSource): Promise<void> {\n const writable = await this.handle.createWritable();\n await writable.write(data);\n await writable.close();\n }\n}\n\nclass WebDirectoryAccess implements TemplateDirectoryAccess {\n constructor(private readonly handle: IterableDirectoryHandle) {}\n\n async listFiles(): Promise<TemplateFileAccess[]> {\n const content = [];\n for await (const entry of this.listDirectoryContents(this.handle)) {\n content.push(entry);\n }\n return content;\n }\n\n private async *listDirectoryContents(\n dirHandle: IterableDirectoryHandle,\n basePath: string[] = [],\n ): AsyncIterable<TemplateFileAccess> {\n for await (const handle of dirHandle.values()) {\n if (handle.kind === 'file') {\n yield new WebFileAccess([...basePath, handle.name].join('/'), handle);\n } else if (handle.kind === 'directory') {\n // Skip git storage directory\n if (handle.name === '.git') {\n continue;\n }\n yield* this.listDirectoryContents(handle, [...basePath, handle.name]);\n }\n }\n }\n}\n\n/** @internal */\nexport class WebFileSystemAccess {\n static isSupported(): boolean {\n return Boolean(showDirectoryPicker);\n }\n\n static async requestDirectoryAccess(): Promise<TemplateDirectoryAccess> {\n if (!showDirectoryPicker) {\n throw new Error('File system access is not supported');\n }\n const handle = await showDirectoryPicker();\n return new WebDirectoryAccess(handle);\n }\n\n private constructor() {}\n}\n"],"names":[],"mappings":"AAiCA,MAAM,sBAAuB,MAAe,CAAA,mBAAA,CAAA;AAI5C,MAAM,aAA4C,CAAA;AAAA,EAChD,WAAA,CACW,MACQ,MACjB,EAAA;AAFS,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA,CAAA;AACQ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAAA,GAChB;AAAA,EAEH,IAAsB,GAAA;AACpB,IAAO,OAAA,IAAA,CAAK,OAAO,OAAQ,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,MAAM,KAAK,IAAmD,EAAA;AAC5D,IAAA,MAAM,QAAW,GAAA,MAAM,IAAK,CAAA,MAAA,CAAO,cAAe,EAAA,CAAA;AAClD,IAAM,MAAA,QAAA,CAAS,MAAM,IAAI,CAAA,CAAA;AACzB,IAAA,MAAM,SAAS,KAAM,EAAA,CAAA;AAAA,GACvB;AACF,CAAA;AAEA,MAAM,kBAAsD,CAAA;AAAA,EAC1D,YAA6B,MAAiC,EAAA;AAAjC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAAA,GAAkC;AAAA,EAE/D,MAAM,SAA2C,GAAA;AAC/C,IAAA,MAAM,UAAU,EAAC,CAAA;AACjB,IAAA,WAAA,MAAiB,KAAS,IAAA,IAAA,CAAK,qBAAsB,CAAA,IAAA,CAAK,MAAM,CAAG,EAAA;AACjE,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA,CAAA;AAAA,KACpB;AACA,IAAO,OAAA,OAAA,CAAA;AAAA,GACT;AAAA,EAEA,OAAe,qBAAA,CACb,SACA,EAAA,QAAA,GAAqB,EACc,EAAA;AACnC,IAAiB,WAAA,MAAA,MAAA,IAAU,SAAU,CAAA,MAAA,EAAU,EAAA;AAC7C,MAAI,IAAA,MAAA,CAAO,SAAS,MAAQ,EAAA;AAC1B,QAAM,MAAA,IAAI,aAAc,CAAA,CAAC,GAAG,QAAA,EAAU,MAAO,CAAA,IAAI,CAAE,CAAA,IAAA,CAAK,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA;AAAA,OACtE,MAAA,IAAW,MAAO,CAAA,IAAA,KAAS,WAAa,EAAA;AAEtC,QAAI,IAAA,MAAA,CAAO,SAAS,MAAQ,EAAA;AAC1B,UAAA,SAAA;AAAA,SACF;AACA,QAAO,OAAA,IAAA,CAAK,sBAAsB,MAAQ,EAAA,CAAC,GAAG,QAAU,EAAA,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,OACtE;AAAA,KACF;AAAA,GACF;AACF,CAAA;AAGO,MAAM,mBAAoB,CAAA;AAAA,EAC/B,OAAO,WAAuB,GAAA;AAC5B,IAAA,OAAO,QAAQ,mBAAmB,CAAA,CAAA;AAAA,GACpC;AAAA,EAEA,aAAa,sBAA2D,GAAA;AACtE,IAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,MAAM,MAAA,IAAI,MAAM,qCAAqC,CAAA,CAAA;AAAA,KACvD;AACA,IAAM,MAAA,MAAA,GAAS,MAAM,mBAAoB,EAAA,CAAA;AACzC,IAAO,OAAA,IAAI,mBAAmB,MAAM,CAAA,CAAA;AAAA,GACtC;AAAA,EAEQ,WAAc,GAAA;AAAA,GAAC;AACzB;;;;"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { StreamLanguage } from '@codemirror/language';
|
|
2
|
+
import { yaml as yaml$1 } from '@codemirror/legacy-modes/mode/yaml';
|
|
3
|
+
import Button from '@material-ui/core/Button';
|
|
4
|
+
import Card from '@material-ui/core/Card';
|
|
5
|
+
import CardContent from '@material-ui/core/CardContent';
|
|
6
|
+
import CardHeader from '@material-ui/core/CardHeader';
|
|
7
|
+
import FormControl from '@material-ui/core/FormControl';
|
|
8
|
+
import IconButton from '@material-ui/core/IconButton';
|
|
9
|
+
import InputLabel from '@material-ui/core/InputLabel';
|
|
10
|
+
import MenuItem from '@material-ui/core/MenuItem';
|
|
11
|
+
import Select from '@material-ui/core/Select';
|
|
12
|
+
import { makeStyles } from '@material-ui/core/styles';
|
|
13
|
+
import CloseIcon from '@material-ui/icons/Close';
|
|
14
|
+
import CodeMirror from '@uiw/react-codemirror';
|
|
15
|
+
import React, { useState, useMemo, useCallback } from 'react';
|
|
16
|
+
import yaml from 'yaml';
|
|
17
|
+
import { Form } from '@backstage/plugin-scaffolder-react/alpha';
|
|
18
|
+
import { TemplateEditorForm } from './TemplateEditorForm.esm.js';
|
|
19
|
+
import validator from '@rjsf/validator-ajv8';
|
|
20
|
+
|
|
21
|
+
const useStyles = makeStyles((theme) => ({
|
|
22
|
+
root: {
|
|
23
|
+
gridArea: "pageContent",
|
|
24
|
+
display: "grid",
|
|
25
|
+
gridTemplateAreas: `
|
|
26
|
+
"controls controls"
|
|
27
|
+
"fieldForm preview"
|
|
28
|
+
`,
|
|
29
|
+
gridTemplateRows: "auto 1fr",
|
|
30
|
+
gridTemplateColumns: "1fr 1fr"
|
|
31
|
+
},
|
|
32
|
+
controls: {
|
|
33
|
+
gridArea: "controls",
|
|
34
|
+
display: "flex",
|
|
35
|
+
flexFlow: "row nowrap",
|
|
36
|
+
alignItems: "center",
|
|
37
|
+
margin: theme.spacing(1)
|
|
38
|
+
},
|
|
39
|
+
fieldForm: {
|
|
40
|
+
gridArea: "fieldForm"
|
|
41
|
+
},
|
|
42
|
+
preview: {
|
|
43
|
+
gridArea: "preview"
|
|
44
|
+
}
|
|
45
|
+
}));
|
|
46
|
+
const CustomFieldExplorer = ({
|
|
47
|
+
customFieldExtensions = [],
|
|
48
|
+
onClose
|
|
49
|
+
}) => {
|
|
50
|
+
var _a, _b;
|
|
51
|
+
const classes = useStyles();
|
|
52
|
+
const fieldOptions = customFieldExtensions.filter((field) => !!field.schema);
|
|
53
|
+
const [selectedField, setSelectedField] = useState(fieldOptions[0]);
|
|
54
|
+
const [fieldFormState, setFieldFormState] = useState({});
|
|
55
|
+
const [refreshKey, setRefreshKey] = useState(Date.now());
|
|
56
|
+
const sampleFieldTemplate = useMemo(
|
|
57
|
+
() => {
|
|
58
|
+
var _a2, _b2;
|
|
59
|
+
return yaml.stringify({
|
|
60
|
+
parameters: [
|
|
61
|
+
{
|
|
62
|
+
title: `${selectedField.name} Example`,
|
|
63
|
+
properties: {
|
|
64
|
+
[selectedField.name]: {
|
|
65
|
+
type: (_b2 = (_a2 = selectedField.schema) == null ? void 0 : _a2.returnValue) == null ? void 0 : _b2.type,
|
|
66
|
+
"ui:field": selectedField.name,
|
|
67
|
+
"ui:options": fieldFormState
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
[fieldFormState, selectedField]
|
|
75
|
+
);
|
|
76
|
+
const fieldComponents = useMemo(() => {
|
|
77
|
+
return Object.fromEntries(
|
|
78
|
+
customFieldExtensions.map(({ name, component }) => [name, component])
|
|
79
|
+
);
|
|
80
|
+
}, [customFieldExtensions]);
|
|
81
|
+
const handleSelectionChange = useCallback(
|
|
82
|
+
(selection) => {
|
|
83
|
+
setSelectedField(selection);
|
|
84
|
+
setFieldFormState({});
|
|
85
|
+
},
|
|
86
|
+
[setFieldFormState, setSelectedField]
|
|
87
|
+
);
|
|
88
|
+
const handleFieldConfigChange = useCallback(
|
|
89
|
+
(state) => {
|
|
90
|
+
setFieldFormState(state);
|
|
91
|
+
setRefreshKey(Date.now());
|
|
92
|
+
},
|
|
93
|
+
[setFieldFormState, setRefreshKey]
|
|
94
|
+
);
|
|
95
|
+
return /* @__PURE__ */ React.createElement("main", { className: classes.root }, /* @__PURE__ */ React.createElement("div", { className: classes.controls }, /* @__PURE__ */ React.createElement(FormControl, { variant: "outlined", size: "small", fullWidth: true }, /* @__PURE__ */ React.createElement(InputLabel, { id: "select-field-label" }, "Choose Custom Field Extension"), /* @__PURE__ */ React.createElement(
|
|
96
|
+
Select,
|
|
97
|
+
{
|
|
98
|
+
value: selectedField,
|
|
99
|
+
label: "Choose Custom Field Extension",
|
|
100
|
+
labelId: "select-field-label",
|
|
101
|
+
onChange: (e) => handleSelectionChange(e.target.value)
|
|
102
|
+
},
|
|
103
|
+
fieldOptions.map((option, idx) => /* @__PURE__ */ React.createElement(MenuItem, { key: idx, value: option }, option.name))
|
|
104
|
+
)), /* @__PURE__ */ React.createElement(IconButton, { size: "medium", onClick: onClose, "aria-label": "Close" }, /* @__PURE__ */ React.createElement(CloseIcon, null))), /* @__PURE__ */ React.createElement("div", { className: classes.fieldForm }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(CardHeader, { title: "Field Options" }), /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(
|
|
105
|
+
Form,
|
|
106
|
+
{
|
|
107
|
+
showErrorList: false,
|
|
108
|
+
fields: { ...fieldComponents },
|
|
109
|
+
noHtml5Validate: true,
|
|
110
|
+
formData: fieldFormState,
|
|
111
|
+
formContext: { fieldFormState },
|
|
112
|
+
onSubmit: (e) => handleFieldConfigChange(e.formData),
|
|
113
|
+
validator,
|
|
114
|
+
schema: ((_a = selectedField.schema) == null ? void 0 : _a.uiOptions) || {},
|
|
115
|
+
experimental_defaultFormStateBehavior: {
|
|
116
|
+
allOf: "populateDefaults"
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
/* @__PURE__ */ React.createElement(
|
|
120
|
+
Button,
|
|
121
|
+
{
|
|
122
|
+
variant: "contained",
|
|
123
|
+
color: "primary",
|
|
124
|
+
type: "submit",
|
|
125
|
+
disabled: !((_b = selectedField.schema) == null ? void 0 : _b.uiOptions)
|
|
126
|
+
},
|
|
127
|
+
"Apply"
|
|
128
|
+
)
|
|
129
|
+
)))), /* @__PURE__ */ React.createElement("div", { className: classes.preview }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(CardHeader, { title: "Example Template Spec" }), /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(
|
|
130
|
+
CodeMirror,
|
|
131
|
+
{
|
|
132
|
+
readOnly: true,
|
|
133
|
+
theme: "dark",
|
|
134
|
+
height: "100%",
|
|
135
|
+
extensions: [StreamLanguage.define(yaml$1)],
|
|
136
|
+
value: sampleFieldTemplate
|
|
137
|
+
}
|
|
138
|
+
))), /* @__PURE__ */ React.createElement(
|
|
139
|
+
TemplateEditorForm,
|
|
140
|
+
{
|
|
141
|
+
key: refreshKey,
|
|
142
|
+
content: sampleFieldTemplate,
|
|
143
|
+
contentIsSpec: true,
|
|
144
|
+
fieldExtensions: customFieldExtensions,
|
|
145
|
+
setErrorText: () => null
|
|
146
|
+
}
|
|
147
|
+
)));
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
export { CustomFieldExplorer };
|
|
151
|
+
//# sourceMappingURL=CustomFieldExplorer.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomFieldExplorer.esm.js","sources":["../../../src/next/TemplateEditorPage/CustomFieldExplorer.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 { StreamLanguage } from '@codemirror/language';\nimport { yaml as yamlSupport } from '@codemirror/legacy-modes/mode/yaml';\nimport Button from '@material-ui/core/Button';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport FormControl from '@material-ui/core/FormControl';\nimport IconButton from '@material-ui/core/IconButton';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport { makeStyles } from '@material-ui/core/styles';\nimport CloseIcon from '@material-ui/icons/Close';\nimport CodeMirror from '@uiw/react-codemirror';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport yaml from 'yaml';\nimport { Form } from '@backstage/plugin-scaffolder-react/alpha';\nimport { TemplateEditorForm } from './TemplateEditorForm';\nimport validator from '@rjsf/validator-ajv8';\nimport { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n gridArea: 'pageContent',\n display: 'grid',\n gridTemplateAreas: `\n \"controls controls\"\n \"fieldForm preview\"\n `,\n gridTemplateRows: 'auto 1fr',\n gridTemplateColumns: '1fr 1fr',\n },\n controls: {\n gridArea: 'controls',\n display: 'flex',\n flexFlow: 'row nowrap',\n alignItems: 'center',\n margin: theme.spacing(1),\n },\n fieldForm: {\n gridArea: 'fieldForm',\n },\n preview: {\n gridArea: 'preview',\n },\n}));\n\nexport const CustomFieldExplorer = ({\n customFieldExtensions = [],\n onClose,\n}: {\n customFieldExtensions?: FieldExtensionOptions<any, any>[];\n onClose?: () => void;\n}) => {\n const classes = useStyles();\n const fieldOptions = customFieldExtensions.filter(field => !!field.schema);\n const [selectedField, setSelectedField] = useState(fieldOptions[0]);\n const [fieldFormState, setFieldFormState] = useState({});\n const [refreshKey, setRefreshKey] = useState(Date.now());\n const sampleFieldTemplate = useMemo(\n () =>\n yaml.stringify({\n parameters: [\n {\n title: `${selectedField.name} Example`,\n properties: {\n [selectedField.name]: {\n type: selectedField.schema?.returnValue?.type,\n 'ui:field': selectedField.name,\n 'ui:options': fieldFormState,\n },\n },\n },\n ],\n }),\n [fieldFormState, selectedField],\n );\n\n const fieldComponents = useMemo(() => {\n return Object.fromEntries(\n customFieldExtensions.map(({ name, component }) => [name, component]),\n );\n }, [customFieldExtensions]);\n\n const handleSelectionChange = useCallback(\n (selection: FieldExtensionOptions) => {\n setSelectedField(selection);\n setFieldFormState({});\n },\n [setFieldFormState, setSelectedField],\n );\n\n const handleFieldConfigChange = useCallback(\n (state: {}) => {\n setFieldFormState(state);\n // Force TemplateEditorForm to re-render since some fields\n // may not be responsive to ui:option changes\n setRefreshKey(Date.now());\n },\n [setFieldFormState, setRefreshKey],\n );\n\n return (\n <main className={classes.root}>\n <div className={classes.controls}>\n <FormControl variant=\"outlined\" size=\"small\" fullWidth>\n <InputLabel id=\"select-field-label\">\n Choose Custom Field Extension\n </InputLabel>\n <Select\n value={selectedField}\n label=\"Choose Custom Field Extension\"\n labelId=\"select-field-label\"\n onChange={e =>\n handleSelectionChange(e.target.value as FieldExtensionOptions)\n }\n >\n {fieldOptions.map((option, idx) => (\n <MenuItem key={idx} value={option as any}>\n {option.name}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n\n <IconButton size=\"medium\" onClick={onClose} aria-label=\"Close\">\n <CloseIcon />\n </IconButton>\n </div>\n <div className={classes.fieldForm}>\n <Card>\n <CardHeader title=\"Field Options\" />\n <CardContent>\n <Form\n showErrorList={false}\n fields={{ ...fieldComponents }}\n noHtml5Validate\n formData={fieldFormState}\n formContext={{ fieldFormState }}\n onSubmit={e => handleFieldConfigChange(e.formData)}\n validator={validator}\n schema={selectedField.schema?.uiOptions || {}}\n experimental_defaultFormStateBehavior={{\n allOf: 'populateDefaults',\n }}\n >\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n disabled={!selectedField.schema?.uiOptions}\n >\n Apply\n </Button>\n </Form>\n </CardContent>\n </Card>\n </div>\n <div className={classes.preview}>\n <Card>\n <CardHeader title=\"Example Template Spec\" />\n <CardContent>\n <CodeMirror\n readOnly\n theme=\"dark\"\n height=\"100%\"\n extensions={[StreamLanguage.define(yamlSupport)]}\n value={sampleFieldTemplate}\n />\n </CardContent>\n </Card>\n <TemplateEditorForm\n key={refreshKey}\n content={sampleFieldTemplate}\n contentIsSpec\n fieldExtensions={customFieldExtensions}\n setErrorText={() => null}\n />\n </div>\n </main>\n );\n};\n"],"names":["_a","_b","yamlSupport"],"mappings":"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"}
|