@backstage/plugin-scaffolder 1.36.3-next.1 → 1.37.0-next.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 +64 -0
- package/dist/alpha/api/FormDecoratorsApi.esm.js.map +1 -1
- package/dist/alpha/api/ref.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/CustomFieldExplorer.esm.js +4 -4
- package/dist/alpha/components/TemplateEditorPage/CustomFieldExplorer.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/CustomFieldPlayground.esm.js +5 -5
- package/dist/alpha/components/TemplateEditorPage/CustomFieldPlayground.esm.js.map +1 -1
- package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js +14 -14
- package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js.map +1 -1
- package/dist/alpha/components/TemplatesSubPage.esm.js +20 -10
- package/dist/alpha/components/TemplatesSubPage.esm.js.map +1 -1
- package/dist/alpha/extensions.esm.js +28 -2
- package/dist/alpha/extensions.esm.js.map +1 -1
- package/dist/alpha/hooks/useFormDecorators.esm.js +34 -3
- package/dist/alpha/hooks/useFormDecorators.esm.js.map +1 -1
- package/dist/alpha/lib/createGroupsWithOther.esm.js +13 -0
- package/dist/alpha/lib/createGroupsWithOther.esm.js.map +1 -0
- package/dist/alpha.d.ts +14 -4
- package/dist/components/TemplateTypePicker/TemplateTypePicker.esm.js +4 -4
- package/dist/components/TemplateTypePicker/TemplateTypePicker.esm.js.map +1 -1
- package/dist/components/TemplatingExtensionsPage/TemplatingExtensionsPage.esm.js +4 -4
- package/dist/components/TemplatingExtensionsPage/TemplatingExtensionsPage.esm.js.map +1 -1
- package/dist/components/fields/Autocomplete/Autocomplete.esm.js +23 -0
- package/dist/components/fields/Autocomplete/Autocomplete.esm.js.map +1 -0
- package/dist/components/fields/EntityNamePicker/EntityNamePicker.esm.js +23 -2
- package/dist/components/fields/EntityNamePicker/EntityNamePicker.esm.js.map +1 -1
- package/dist/components/fields/EntityPicker/EntityPicker.esm.js +125 -9
- package/dist/components/fields/EntityPicker/EntityPicker.esm.js.map +1 -1
- package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js +106 -7
- package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js.map +1 -1
- package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js +128 -10
- package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js.map +1 -1
- package/dist/components/fields/MyGroupsPicker/MyGroupsPicker.esm.js +66 -6
- package/dist/components/fields/MyGroupsPicker/MyGroupsPicker.esm.js.map +1 -1
- package/dist/components/fields/OwnedEntityPicker/OwnedEntityPicker.esm.js +29 -6
- package/dist/components/fields/OwnedEntityPicker/OwnedEntityPicker.esm.js.map +1 -1
- package/dist/components/fields/OwnedEntityPicker/schema.esm.js +1 -0
- package/dist/components/fields/OwnedEntityPicker/schema.esm.js.map +1 -1
- package/dist/components/fields/RepoBranchPicker/BitbucketRepoBranchPicker.esm.js +29 -5
- package/dist/components/fields/RepoBranchPicker/BitbucketRepoBranchPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoBranchPicker/DefaultRepoBranchPicker.esm.js +20 -3
- package/dist/components/fields/RepoBranchPicker/DefaultRepoBranchPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoBranchPicker/GitHubRepoBranchPicker.esm.js +29 -5
- package/dist/components/fields/RepoBranchPicker/GitHubRepoBranchPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoBranchPicker/RepoBranchPicker.esm.js +18 -6
- package/dist/components/fields/RepoBranchPicker/RepoBranchPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoOwnerPicker/DefaultRepoOwnerPicker.esm.js +20 -3
- package/dist/components/fields/RepoOwnerPicker/DefaultRepoOwnerPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoOwnerPicker/GitHubRepoOwnerPicker.esm.js +29 -5
- package/dist/components/fields/RepoOwnerPicker/GitHubRepoOwnerPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoOwnerPicker/RepoOwnerPicker.esm.js +28 -31
- package/dist/components/fields/RepoOwnerPicker/RepoOwnerPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js +86 -4
- package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js +107 -11
- package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js +33 -3
- package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js +42 -5
- package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js +52 -7
- package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js +60 -16
- package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js +23 -9
- package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/RepoUrlPickerHost.esm.js +27 -3
- package/dist/components/fields/RepoUrlPicker/RepoUrlPickerHost.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js +60 -6
- package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js.map +1 -1
- package/dist/components/fields/SecretInput/SecretInput.esm.js +57 -2
- package/dist/components/fields/SecretInput/SecretInput.esm.js.map +1 -1
- package/dist/components/fields/buiChipStyles.esm.js +25 -0
- package/dist/components/fields/buiChipStyles.esm.js.map +1 -0
- package/dist/components/fields/scaffolderFieldOverrides.module.css.esm.js +8 -0
- package/dist/components/fields/scaffolderFieldOverrides.module.css.esm.js.map +1 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +29 -0
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -0
- package/dist/plugins/scaffolder/package.json.esm.js +3 -1
- package/dist/plugins/scaffolder/package.json.esm.js.map +1 -1
- package/package.json +9 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.esm.js","sources":["../../src/alpha/extensions.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 {\n ApiBlueprint,\n createExtensionInput,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n NavItemBlueprint,\n PageBlueprint,\n SubPageBlueprint,\n} from '@backstage/frontend-plugin-api';\nimport { rootRouteRef } from '../routes';\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport {\n FormFieldBlueprint,\n formFieldsApiRef,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport { ScaffolderClient } from '../api';\n\nexport const scaffolderPage = PageBlueprint.makeWithOverrides({\n inputs: {\n formFields: createExtensionInput([\n FormFieldBlueprint.dataRefs.formFieldLoader,\n ]),\n },\n factory(originalFactory) {\n return originalFactory({\n routeRef: rootRouteRef,\n path: '/create',\n title: 'Create',\n });\n },\n});\n\nexport const scaffolderTemplatesSubPage = SubPageBlueprint.makeWithOverrides({\n name: 'templates',\n factory(originalFactory, { apis }) {\n const formFieldsApi = apis.get(formFieldsApiRef);\n\n return originalFactory({\n path: 'templates',\n title: 'Templates',\n loader: async () => {\n const formFields = (await formFieldsApi?.loadFormFields()) ?? [];\n\n return import('./components/TemplatesSubPage').then(m => (\n <m.TemplatesSubPage formFields={formFields} />\n ));\n },\n });\n },\n});\n\nexport const scaffolderTasksSubPage = SubPageBlueprint.make({\n name: 'tasks',\n params: {\n path: 'tasks',\n title: 'Tasks',\n loader: () =>\n import('./components/TasksSubPage').then(m => <m.TasksSubPage />),\n },\n});\n\nexport const scaffolderActionsSubPage = SubPageBlueprint.make({\n name: 'actions',\n params: {\n path: 'actions',\n title: 'Actions',\n loader: () =>\n Promise.all([\n import('../components/ActionsPage'),\n import('@backstage/core-components'),\n ]).then(([m, { Content }]) => (\n <Content>\n <m.ActionPageContent />\n </Content>\n )),\n },\n});\n\nexport const scaffolderEditorSubPage = SubPageBlueprint.make({\n name: 'editor',\n params: {\n path: 'edit',\n title: 'Template Editor',\n loader: () =>\n import('./components/EditorSubPage').then(m => <m.EditorSubPage />),\n },\n});\n\nexport const scaffolderTemplatingExtensionsSubPage = SubPageBlueprint.make({\n name: 'templating-extensions',\n params: {\n path: 'templating-extensions',\n title: 'Templating Extensions',\n loader: () =>\n Promise.all([\n import('../components/TemplatingExtensionsPage'),\n import('@backstage/core-components'),\n ]).then(([m, { Content }]) => (\n <Content>\n <m.TemplatingExtensionsPageContent linkLocal />\n </Content>\n )),\n },\n});\n\nexport const scaffolderNavItem = NavItemBlueprint.make({\n params: {\n routeRef: rootRouteRef,\n title: 'Create...',\n icon: CreateComponentIcon,\n },\n});\n\nexport const repoUrlPickerFormField = FormFieldBlueprint.make({\n name: 'repo-url-picker',\n params: {\n field: () => import('./fields/RepoUrlPicker').then(m => m.RepoUrlPicker),\n },\n});\n\nexport const entityNamePickerFormField = FormFieldBlueprint.make({\n name: 'entity-name-picker',\n params: {\n field: () =>\n import('./fields/EntityNamePicker').then(m => m.EntityNamePicker),\n },\n});\n\nexport const entityPickerFormField = FormFieldBlueprint.make({\n name: 'entity-picker',\n params: {\n field: () => import('./fields/EntityPicker').then(m => m.EntityPicker),\n },\n});\n\nexport const ownerPickerFormField = FormFieldBlueprint.make({\n name: 'owner-picker',\n params: {\n field: () => import('./fields/OwnerPicker').then(m => m.OwnerPicker),\n },\n});\n\nexport const entityTagsPickerFormField = FormFieldBlueprint.make({\n name: 'entity-tags-picker',\n params: {\n field: () =>\n import('./fields/EntityTagsPicker').then(m => m.EntityTagsPicker),\n },\n});\n\nexport const multiEntityPickerFormField = FormFieldBlueprint.make({\n name: 'multi-entity-picker',\n params: {\n field: () =>\n import('./fields/MultiEntityPicker').then(m => m.MultiEntityPicker),\n },\n});\n\nexport const myGroupsPickerFormField = FormFieldBlueprint.make({\n name: 'my-groups-picker',\n params: {\n field: () => import('./fields/MyGroupsPicker').then(m => m.MyGroupsPicker),\n },\n});\n\nexport const ownedEntityPickerFormField = FormFieldBlueprint.make({\n name: 'owned-entity-picker',\n params: {\n field: () =>\n import('./fields/OwnedEntityPicker').then(m => m.OwnedEntityPicker),\n },\n});\n\nexport const repoBranchPickerFormField = FormFieldBlueprint.make({\n name: 'repo-branch-picker',\n params: {\n field: () =>\n import('./fields/RepoBranchPicker').then(m => m.RepoBranchPicker),\n },\n});\n\nexport const repoOwnerPickerFormField = FormFieldBlueprint.make({\n name: 'repo-owner-picker',\n params: {\n field: () =>\n import('./fields/RepoOwnerPicker').then(m => m.RepoOwnerPicker),\n },\n});\n\nexport const scaffolderApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\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"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extensions.esm.js","sources":["../../src/alpha/extensions.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 {\n ApiBlueprint,\n createExtensionInput,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n NavItemBlueprint,\n PageBlueprint,\n SubPageBlueprint,\n} from '@backstage/frontend-plugin-api';\nimport { z } from 'zod/v4';\nimport {\n createZodV4FilterPredicateSchema,\n filterPredicateToFilterFunction,\n} from '@backstage/filter-predicates';\nimport { rootRouteRef } from '../routes';\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport {\n FormFieldBlueprint,\n formFieldsApiRef,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\nimport {\n scaffolderApiRef,\n TemplateGroupFilter,\n} from '@backstage/plugin-scaffolder-react';\nimport { ScaffolderClient } from '../api';\n\nexport const scaffolderPage = PageBlueprint.makeWithOverrides({\n inputs: {\n formFields: createExtensionInput([\n FormFieldBlueprint.dataRefs.formFieldLoader,\n ]),\n },\n factory(originalFactory) {\n return originalFactory({\n routeRef: rootRouteRef,\n path: '/create',\n title: 'Create',\n });\n },\n});\n\nexport const scaffolderTemplatesSubPage = SubPageBlueprint.makeWithOverrides({\n name: 'templates',\n configSchema: {\n enableBackstageUi: z.boolean().optional().default(false),\n groups: z\n .array(\n z.object({\n title: z.string(),\n filter: createZodV4FilterPredicateSchema(),\n }),\n )\n .optional(),\n },\n factory(originalFactory, { apis, config }) {\n const formFieldsApi = apis.get(formFieldsApiRef);\n\n const groups: TemplateGroupFilter[] | undefined = config.groups?.map(\n group => ({\n title: group.title,\n filter: filterPredicateToFilterFunction(group.filter),\n }),\n );\n\n return originalFactory({\n path: 'templates',\n title: 'Templates',\n loader: async () => {\n const formFields = (await formFieldsApi?.loadFormFields()) ?? [];\n\n return import('./components/TemplatesSubPage').then(m => (\n <m.TemplatesSubPage\n formFields={formFields}\n groups={groups}\n formProps={{\n EXPERIMENTAL_theme: config.enableBackstageUi ? 'bui' : 'mui',\n }}\n />\n ));\n },\n });\n },\n});\n\nexport const scaffolderTasksSubPage = SubPageBlueprint.make({\n name: 'tasks',\n params: {\n path: 'tasks',\n title: 'Tasks',\n loader: () =>\n import('./components/TasksSubPage').then(m => <m.TasksSubPage />),\n },\n});\n\nexport const scaffolderActionsSubPage = SubPageBlueprint.make({\n name: 'actions',\n params: {\n path: 'actions',\n title: 'Actions',\n loader: () =>\n Promise.all([\n import('../components/ActionsPage'),\n import('@backstage/core-components'),\n ]).then(([m, { Content }]) => (\n <Content>\n <m.ActionPageContent />\n </Content>\n )),\n },\n});\n\nexport const scaffolderEditorSubPage = SubPageBlueprint.make({\n name: 'editor',\n params: {\n path: 'edit',\n title: 'Template Editor',\n loader: () =>\n import('./components/EditorSubPage').then(m => <m.EditorSubPage />),\n },\n});\n\nexport const scaffolderTemplatingExtensionsSubPage = SubPageBlueprint.make({\n name: 'templating-extensions',\n params: {\n path: 'templating-extensions',\n title: 'Templating Extensions',\n loader: () =>\n Promise.all([\n import('../components/TemplatingExtensionsPage'),\n import('@backstage/core-components'),\n ]).then(([m, { Content }]) => (\n <Content>\n <m.TemplatingExtensionsPageContent linkLocal />\n </Content>\n )),\n },\n});\n\nexport const scaffolderNavItem = NavItemBlueprint.make({\n params: {\n routeRef: rootRouteRef,\n title: 'Create...',\n icon: CreateComponentIcon,\n },\n});\n\nexport const repoUrlPickerFormField = FormFieldBlueprint.make({\n name: 'repo-url-picker',\n params: {\n field: () => import('./fields/RepoUrlPicker').then(m => m.RepoUrlPicker),\n },\n});\n\nexport const entityNamePickerFormField = FormFieldBlueprint.make({\n name: 'entity-name-picker',\n params: {\n field: () =>\n import('./fields/EntityNamePicker').then(m => m.EntityNamePicker),\n },\n});\n\nexport const entityPickerFormField = FormFieldBlueprint.make({\n name: 'entity-picker',\n params: {\n field: () => import('./fields/EntityPicker').then(m => m.EntityPicker),\n },\n});\n\nexport const ownerPickerFormField = FormFieldBlueprint.make({\n name: 'owner-picker',\n params: {\n field: () => import('./fields/OwnerPicker').then(m => m.OwnerPicker),\n },\n});\n\nexport const entityTagsPickerFormField = FormFieldBlueprint.make({\n name: 'entity-tags-picker',\n params: {\n field: () =>\n import('./fields/EntityTagsPicker').then(m => m.EntityTagsPicker),\n },\n});\n\nexport const multiEntityPickerFormField = FormFieldBlueprint.make({\n name: 'multi-entity-picker',\n params: {\n field: () =>\n import('./fields/MultiEntityPicker').then(m => m.MultiEntityPicker),\n },\n});\n\nexport const myGroupsPickerFormField = FormFieldBlueprint.make({\n name: 'my-groups-picker',\n params: {\n field: () => import('./fields/MyGroupsPicker').then(m => m.MyGroupsPicker),\n },\n});\n\nexport const ownedEntityPickerFormField = FormFieldBlueprint.make({\n name: 'owned-entity-picker',\n params: {\n field: () =>\n import('./fields/OwnedEntityPicker').then(m => m.OwnedEntityPicker),\n },\n});\n\nexport const repoBranchPickerFormField = FormFieldBlueprint.make({\n name: 'repo-branch-picker',\n params: {\n field: () =>\n import('./fields/RepoBranchPicker').then(m => m.RepoBranchPicker),\n },\n});\n\nexport const repoOwnerPickerFormField = FormFieldBlueprint.make({\n name: 'repo-owner-picker',\n params: {\n field: () =>\n import('./fields/RepoOwnerPicker').then(m => m.RepoOwnerPicker),\n },\n});\n\nexport const scaffolderApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\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"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { useApi, errorApiRef, useApiHolder } from '@backstage/core-plugin-api';
|
|
|
2
2
|
import { formDecoratorsApiRef } from '../api/ref.esm.js';
|
|
3
3
|
import useAsync from 'react-use/esm/useAsync';
|
|
4
4
|
import { useMemo, useCallback } from 'react';
|
|
5
|
+
import { z } from 'zod/v3';
|
|
5
6
|
import { OpaqueFormDecorator } from '../../packages/scaffolder-internal/src/wiring/InternalFormDecorator.esm.js';
|
|
6
7
|
import '../../packages/scaffolder-internal/src/wiring/InternalFormField.esm.js';
|
|
7
8
|
|
|
@@ -17,7 +18,11 @@ const useFormDecorators = () => {
|
|
|
17
18
|
const decoratorsMap = /* @__PURE__ */ new Map();
|
|
18
19
|
for (const decorator of decorators ?? []) {
|
|
19
20
|
try {
|
|
20
|
-
const {
|
|
21
|
+
const {
|
|
22
|
+
decorator: decoratorFn,
|
|
23
|
+
deps,
|
|
24
|
+
schema
|
|
25
|
+
} = OpaqueFormDecorator.toInternal(decorator);
|
|
21
26
|
const resolvedDeps = Object.entries(deps ?? {}).map(([key, value]) => {
|
|
22
27
|
const api = apiHolder.get(value);
|
|
23
28
|
if (!api) {
|
|
@@ -27,8 +32,34 @@ const useFormDecorators = () => {
|
|
|
27
32
|
}
|
|
28
33
|
return [key, api];
|
|
29
34
|
});
|
|
35
|
+
const inputSchema = schema?.input ? z.object(
|
|
36
|
+
Object.fromEntries(
|
|
37
|
+
Object.entries(schema.input).map(([key, build]) => [
|
|
38
|
+
key,
|
|
39
|
+
build(z)
|
|
40
|
+
])
|
|
41
|
+
)
|
|
42
|
+
) : void 0;
|
|
30
43
|
decoratorsMap.set(decorator.id, {
|
|
31
|
-
decorator: (ctx) =>
|
|
44
|
+
decorator: async (ctx) => {
|
|
45
|
+
let input = ctx.input;
|
|
46
|
+
if (inputSchema) {
|
|
47
|
+
const parsed = inputSchema.safeParse(ctx.input);
|
|
48
|
+
if (!parsed.success) {
|
|
49
|
+
errorApi.post(
|
|
50
|
+
new Error(
|
|
51
|
+
`Invalid input for form decorator ${decorator.id}: ${parsed.error.message}`
|
|
52
|
+
)
|
|
53
|
+
);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
input = parsed.data;
|
|
57
|
+
}
|
|
58
|
+
await decoratorFn(
|
|
59
|
+
{ ...ctx, input },
|
|
60
|
+
Object.fromEntries(resolvedDeps)
|
|
61
|
+
);
|
|
62
|
+
}
|
|
32
63
|
});
|
|
33
64
|
} catch (ex) {
|
|
34
65
|
errorApi.post(ex);
|
|
@@ -41,7 +72,7 @@ const useFormDecorators = () => {
|
|
|
41
72
|
async (opts) => {
|
|
42
73
|
let formState = { ...opts.formState };
|
|
43
74
|
let secrets = { ...opts.secrets };
|
|
44
|
-
const formDecorators = opts.manifest?.EXPERIMENTAL_formDecorators;
|
|
75
|
+
const formDecorators = opts.manifest?.formDecorators ?? opts.manifest?.EXPERIMENTAL_formDecorators;
|
|
45
76
|
if (formDecorators) {
|
|
46
77
|
await Promise.all(
|
|
47
78
|
formDecorators.map(async (decorator) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormDecorators.esm.js","sources":["../../../src/alpha/hooks/useFormDecorators.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { errorApiRef, useApi, useApiHolder } from '@backstage/core-plugin-api';\nimport { formDecoratorsApiRef } from '../api/ref';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useCallback, useMemo } from 'react';\nimport { ScaffolderFormDecoratorContext } from '@backstage/plugin-scaffolder-react/alpha';\nimport { OpaqueFormDecorator } from '@internal/scaffolder';\nimport { TemplateParameterSchema } from '@backstage/plugin-scaffolder-react';\nimport { JsonValue } from '@backstage/types';\n\n/** @internal */\ntype BoundFieldDecorator = {\n decorator: (ctx: ScaffolderFormDecoratorContext) => Promise<void>;\n};\n\nexport const useFormDecorators = () => {\n const formDecoratorsApi = useApi(formDecoratorsApiRef);\n const errorApi = useApi(errorApiRef);\n const { value: decorators } = useAsync(\n () => formDecoratorsApi.getFormDecorators(),\n [],\n );\n const apiHolder = useApiHolder();\n\n const boundDecorators = useMemo(() => {\n const decoratorsMap = new Map<string, BoundFieldDecorator>();\n\n for (const decorator of decorators ?? []) {\n try {\n const {
|
|
1
|
+
{"version":3,"file":"useFormDecorators.esm.js","sources":["../../../src/alpha/hooks/useFormDecorators.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { errorApiRef, useApi, useApiHolder } from '@backstage/core-plugin-api';\nimport { formDecoratorsApiRef } from '../api/ref';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useCallback, useMemo } from 'react';\nimport { ScaffolderFormDecoratorContext } from '@backstage/plugin-scaffolder-react/alpha';\nimport { OpaqueFormDecorator } from '@internal/scaffolder';\nimport { TemplateParameterSchema } from '@backstage/plugin-scaffolder-react';\nimport { JsonObject, JsonValue } from '@backstage/types';\nimport { z } from 'zod/v3';\n\n/** @internal */\ntype BoundFieldDecorator = {\n decorator: (ctx: ScaffolderFormDecoratorContext) => Promise<void>;\n};\n\nexport const useFormDecorators = () => {\n const formDecoratorsApi = useApi(formDecoratorsApiRef);\n const errorApi = useApi(errorApiRef);\n const { value: decorators } = useAsync(\n () => formDecoratorsApi.getFormDecorators(),\n [],\n );\n const apiHolder = useApiHolder();\n\n const boundDecorators = useMemo(() => {\n const decoratorsMap = new Map<string, BoundFieldDecorator>();\n\n for (const decorator of decorators ?? []) {\n try {\n const {\n decorator: decoratorFn,\n deps,\n schema,\n } = OpaqueFormDecorator.toInternal(decorator);\n\n const resolvedDeps = Object.entries(deps ?? {}).map(([key, value]) => {\n const api = apiHolder.get(value);\n if (!api) {\n throw new Error(\n `Failed to resolve apiRef ${value.id} for form decorator ${decorator.id} it will be disabled`,\n );\n }\n return [key, api];\n });\n\n const inputSchema = schema?.input\n ? z.object(\n Object.fromEntries(\n Object.entries(schema.input).map(([key, build]) => [\n key,\n build(z),\n ]),\n ),\n )\n : undefined;\n\n decoratorsMap.set(decorator.id, {\n decorator: async ctx => {\n let input: JsonObject = ctx.input;\n if (inputSchema) {\n const parsed = inputSchema.safeParse(ctx.input);\n if (!parsed.success) {\n errorApi.post(\n new Error(\n `Invalid input for form decorator ${decorator.id}: ${parsed.error.message}`,\n ),\n );\n return;\n }\n input = parsed.data as JsonObject;\n }\n await decoratorFn(\n { ...ctx, input },\n Object.fromEntries(resolvedDeps),\n );\n },\n });\n } catch (ex) {\n errorApi.post(ex);\n return undefined;\n }\n }\n return decoratorsMap;\n }, [apiHolder, decorators, errorApi]);\n\n const run = useCallback(\n async (opts: {\n formState: Record<string, JsonValue>;\n secrets: Record<string, string>;\n manifest?: TemplateParameterSchema;\n }) => {\n let formState: Record<string, JsonValue> = { ...opts.formState };\n let secrets: Record<string, string> = { ...opts.secrets };\n\n const formDecorators =\n opts.manifest?.formDecorators ??\n opts.manifest?.EXPERIMENTAL_formDecorators;\n if (formDecorators) {\n // for each of the form decorators, go and call the decorator with the context\n await Promise.all(\n formDecorators.map(async decorator => {\n const formDecorator = boundDecorators?.get(decorator.id);\n if (!formDecorator) {\n errorApi.post(\n new Error(`Failed to find form decorator ${decorator.id}`),\n );\n return;\n }\n\n await formDecorator.decorator({\n setSecrets: (\n handler: (\n oldState: Record<string, string>,\n ) => Record<string, string>,\n ) => {\n secrets = { ...handler(secrets) };\n },\n setFormState: (\n handler: (\n oldState: Record<string, JsonValue>,\n ) => Record<string, JsonValue>,\n ) => {\n formState = { ...handler(formState) };\n },\n formState,\n input: decorator.input ?? {},\n });\n }),\n );\n }\n\n return { formState, secrets };\n },\n [boundDecorators, errorApi],\n );\n\n return useMemo(\n () => ({\n run,\n }),\n [run],\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const createGroupsWithOther = (groups, otherTitle) => {
|
|
2
|
+
const baseGroups = [...groups];
|
|
3
|
+
return [
|
|
4
|
+
...baseGroups,
|
|
5
|
+
{
|
|
6
|
+
title: otherTitle,
|
|
7
|
+
filter: (e) => !baseGroups.some(({ filter }) => filter(e))
|
|
8
|
+
}
|
|
9
|
+
];
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { createGroupsWithOther };
|
|
13
|
+
//# sourceMappingURL=createGroupsWithOther.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createGroupsWithOther.esm.js","sources":["../../../src/alpha/lib/createGroupsWithOther.ts"],"sourcesContent":["/*\n * Copyright 2026 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 { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react';\n\n/**\n * Appends an \"Other\" group matching templates not matched by any of the\n * configured groups. The `otherTitle` should already be translated.\n */\nexport const createGroupsWithOther = (\n groups: TemplateGroupFilter[],\n otherTitle: string,\n): TemplateGroupFilter[] => {\n const baseGroups = [...groups];\n return [\n ...baseGroups,\n {\n title: otherTitle,\n filter: e => !baseGroups.some(({ filter }) => filter(e)),\n },\n ];\n};\n"],"names":[],"mappings":"AAsBO,MAAM,qBAAA,GAAwB,CACnC,MAAA,EACA,UAAA,KAC0B;AAC1B,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,MAAM,CAAA;AAC7B,EAAA,OAAO;AAAA,IACL,GAAG,UAAA;AAAA,IACH;AAAA,MACE,KAAA,EAAO,UAAA;AAAA,MACP,MAAA,EAAQ,CAAA,CAAA,KAAK,CAAC,UAAA,CAAW,IAAA,CAAK,CAAC,EAAE,MAAA,EAAO,KAAM,MAAA,CAAO,CAAC,CAAC;AAAA;AACzD,GACF;AACF;;;;"}
|
package/dist/alpha.d.ts
CHANGED
|
@@ -74,17 +74,17 @@ type TemplateWizardPageProps = {
|
|
|
74
74
|
*/
|
|
75
75
|
type FormProps = Pick<FormProps$2, 'transformErrors' | 'noHtml5Validate'>;
|
|
76
76
|
|
|
77
|
-
/** @
|
|
77
|
+
/** @public */
|
|
78
78
|
interface ScaffolderFormDecoratorsApi {
|
|
79
79
|
getFormDecorators(): Promise<ScaffolderFormDecorator[]>;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
/** @
|
|
82
|
+
/** @public */
|
|
83
83
|
declare const formDecoratorsApiRef: _backstage_frontend_plugin_api.ApiRef<ScaffolderFormDecoratorsApi> & {
|
|
84
84
|
readonly $$type: "@backstage/ApiRef";
|
|
85
85
|
};
|
|
86
86
|
|
|
87
|
-
/** @
|
|
87
|
+
/** @public */
|
|
88
88
|
declare class DefaultScaffolderFormDecoratorsApi implements ScaffolderFormDecoratorsApi {
|
|
89
89
|
private readonly options;
|
|
90
90
|
private constructor();
|
|
@@ -93,7 +93,7 @@ declare class DefaultScaffolderFormDecoratorsApi implements ScaffolderFormDecora
|
|
|
93
93
|
}): DefaultScaffolderFormDecoratorsApi;
|
|
94
94
|
getFormDecorators(): Promise<ScaffolderFormDecorator[]>;
|
|
95
95
|
}
|
|
96
|
-
/** @
|
|
96
|
+
/** @public */
|
|
97
97
|
declare const formDecoratorsApi: _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
98
98
|
config: {};
|
|
99
99
|
configInput: {};
|
|
@@ -443,10 +443,20 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
443
443
|
}>;
|
|
444
444
|
"sub-page:scaffolder/templates": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
445
445
|
config: {
|
|
446
|
+
enableBackstageUi: boolean;
|
|
447
|
+
groups: {
|
|
448
|
+
title: string;
|
|
449
|
+
filter: _backstage_filter_predicates.FilterPredicate;
|
|
450
|
+
}[] | undefined;
|
|
446
451
|
path: string | undefined;
|
|
447
452
|
title: string | undefined;
|
|
448
453
|
};
|
|
449
454
|
configInput: {
|
|
455
|
+
enableBackstageUi?: boolean | undefined;
|
|
456
|
+
groups?: {
|
|
457
|
+
title: string;
|
|
458
|
+
filter: _backstage_filter_predicates.FilterPredicate;
|
|
459
|
+
}[] | undefined;
|
|
450
460
|
path?: string | undefined;
|
|
451
461
|
title?: string | undefined;
|
|
452
462
|
};
|
|
@@ -4,12 +4,12 @@ import { Progress } from '@backstage/core-components';
|
|
|
4
4
|
import Box from '@material-ui/core/Box';
|
|
5
5
|
import Checkbox from '@material-ui/core/Checkbox';
|
|
6
6
|
import FormControlLabel from '@material-ui/core/FormControlLabel';
|
|
7
|
-
import
|
|
7
|
+
import MuiTextField from '@material-ui/core/TextField';
|
|
8
8
|
import Typography from '@material-ui/core/Typography';
|
|
9
9
|
import CheckBoxIcon from '@material-ui/icons/CheckBox';
|
|
10
10
|
import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';
|
|
11
11
|
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
|
12
|
-
import
|
|
12
|
+
import MuiAutocomplete from '@material-ui/lab/Autocomplete';
|
|
13
13
|
import { useEntityTypeFilter } from '@backstage/plugin-catalog-react';
|
|
14
14
|
import { useApi, alertApiRef } from '@backstage/core-plugin-api';
|
|
15
15
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
@@ -41,7 +41,7 @@ const TemplateTypePicker = () => {
|
|
|
41
41
|
}
|
|
42
42
|
),
|
|
43
43
|
/* @__PURE__ */ jsx(
|
|
44
|
-
|
|
44
|
+
MuiAutocomplete,
|
|
45
45
|
{
|
|
46
46
|
id: "categories-picker",
|
|
47
47
|
multiple: true,
|
|
@@ -64,7 +64,7 @@ const TemplateTypePicker = () => {
|
|
|
64
64
|
),
|
|
65
65
|
size: "small",
|
|
66
66
|
popupIcon: /* @__PURE__ */ jsx(ExpandMoreIcon, { "data-testid": "categories-picker-expand" }),
|
|
67
|
-
renderInput: (params) => /* @__PURE__ */ jsx(
|
|
67
|
+
renderInput: (params) => /* @__PURE__ */ jsx(MuiTextField, { ...params, variant: "outlined" })
|
|
68
68
|
}
|
|
69
69
|
)
|
|
70
70
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateTypePicker.esm.js","sources":["../../../src/components/TemplateTypePicker/TemplateTypePicker.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 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';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\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 const { t } = useTranslationRef(scaffolderTranslationRef);\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 {t('templateTypePicker.title')}\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"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAgCA,MAAM,IAAA,mBAAO,GAAA,CAAC,wBAAA,EAAA,EAAyB,QAAA,EAAS,OAAA,EAAQ,CAAA;AACxD,MAAM,WAAA,mBAAc,GAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAS,OAAA,EAAQ,CAAA;AAO5C,MAAM,qBAAqB,MAAM;AACtC,EAAA,MAAM,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,gBAAgB,aAAA,EAAe,gBAAA,KACrD,mBAAA,EAAoB;AACtB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,IAAI,OAAA,EAAS,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA;AAE9B,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAE5B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,CAAA,2BAAA,CAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EACd,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,QAAA;AAAA,QACR,SAAA,EAAU,OAAA;AAAA,QACV,OAAA,EAAQ,mBAAA;AAAA,QAEP,YAAE,0BAA0B;AAAA;AAAA,KAC/B;AAAA,oBACA,GAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"TemplateTypePicker.esm.js","sources":["../../../src/components/TemplateTypePicker/TemplateTypePicker.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 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';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\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 const { t } = useTranslationRef(scaffolderTranslationRef);\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 {t('templateTypePicker.title')}\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"],"names":["Autocomplete","TextField"],"mappings":";;;;;;;;;;;;;;;;;AAgCA,MAAM,IAAA,mBAAO,GAAA,CAAC,wBAAA,EAAA,EAAyB,QAAA,EAAS,OAAA,EAAQ,CAAA;AACxD,MAAM,WAAA,mBAAc,GAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAS,OAAA,EAAQ,CAAA;AAO5C,MAAM,qBAAqB,MAAM;AACtC,EAAA,MAAM,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,gBAAgB,aAAA,EAAe,gBAAA,KACrD,mBAAA,EAAoB;AACtB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,IAAI,OAAA,EAAS,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA;AAE9B,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAE5B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,CAAA,2BAAA,CAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EACd,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,QAAA;AAAA,QACR,SAAA,EAAU,OAAA;AAAA,QACV,OAAA,EAAQ,mBAAA;AAAA,QAEP,YAAE,0BAA0B;AAAA;AAAA,KAC/B;AAAA,oBACA,GAAA;AAAA,MAACA,eAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAG,mBAAA;AAAA,QACH,QAAA,EAAQ,IAAA;AAAA,QACR,OAAA,EAAS,cAAA;AAAA,QACT,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAU,CAAC,CAAA,EAAW,KAAA,KAAoB,iBAAiB,KAAK,CAAA;AAAA,QAChE,YAAA,EAAc,CAAC,MAAA,EAAQ,EAAE,UAAS,qBAChC,GAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,OAAA,kBACE,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA;AAAA,gBACA,WAAA;AAAA,gBACA,OAAA,EAAS;AAAA;AAAA,aACX;AAAA,YAEF,KAAA,EAAO,WAAW,MAAM;AAAA;AAAA,SAC1B;AAAA,QAEF,IAAA,EAAK,OAAA;AAAA,QACL,SAAA,kBAAW,GAAA,CAAC,cAAA,EAAA,EAAe,aAAA,EAAY,0BAAA,EAA2B,CAAA;AAAA,QAClE,aAAa,CAAA,MAAA,qBAAU,GAAA,CAACC,gBAAW,GAAG,MAAA,EAAQ,SAAQ,UAAA,EAAW;AAAA;AAAA;AACnE,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -12,13 +12,13 @@ import InputAdornment from '@material-ui/core/InputAdornment';
|
|
|
12
12
|
import ListItemText from '@material-ui/core/ListItemText';
|
|
13
13
|
import Tab from '@material-ui/core/Tab';
|
|
14
14
|
import Tabs from '@material-ui/core/Tabs';
|
|
15
|
-
import
|
|
15
|
+
import MuiTextField from '@material-ui/core/TextField';
|
|
16
16
|
import AllInclusiveIcon from '@material-ui/icons/AllInclusive';
|
|
17
17
|
import FilterListIcon from '@material-ui/icons/FilterList';
|
|
18
18
|
import FunctionsIcon from '@material-ui/icons/Functions';
|
|
19
19
|
import LinkIcon from '@material-ui/icons/Link';
|
|
20
20
|
import SearchIcon from '@material-ui/icons/Search';
|
|
21
|
-
import
|
|
21
|
+
import MuiAutocomplete from '@material-ui/lab/Autocomplete';
|
|
22
22
|
import { useState, useEffect, useMemo } from 'react';
|
|
23
23
|
import { useNavigate } from 'react-router-dom';
|
|
24
24
|
import useAsync from 'react-use/esm/useAsync';
|
|
@@ -160,10 +160,10 @@ const TemplatingExtensionsPageContent = ({
|
|
|
160
160
|
);
|
|
161
161
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
162
162
|
/* @__PURE__ */ jsx(
|
|
163
|
-
|
|
163
|
+
MuiAutocomplete,
|
|
164
164
|
{
|
|
165
165
|
renderInput: (params) => /* @__PURE__ */ jsx(
|
|
166
|
-
|
|
166
|
+
MuiTextField,
|
|
167
167
|
{
|
|
168
168
|
...params,
|
|
169
169
|
"aria-label": t(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplatingExtensionsPage.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/TemplatingExtensionsPage.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 { useApi, useRouteRef } from '@backstage/core-plugin-api';\n\nimport {\n actionsRouteRef,\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\n\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport {\n ScaffolderPageContextMenu,\n ScaffolderPageContextMenuProps,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport Box from '@material-ui/core/Box';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Tab from '@material-ui/core/Tab';\nimport Tabs from '@material-ui/core/Tabs';\nimport TextField from '@material-ui/core/TextField';\nimport AllInclusiveIcon from '@material-ui/icons/AllInclusive';\nimport FilterListIcon from '@material-ui/icons/FilterList';\nimport FunctionsIcon from '@material-ui/icons/Functions';\nimport LinkIcon from '@material-ui/icons/Link';\nimport SearchIcon from '@material-ui/icons/Search';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n Extension,\n ExtensionKind,\n listTemplatingExtensions,\n parseFragment,\n} from './navigation';\nimport { TemplateFilters } from './TemplateFilters';\nimport {\n TemplateGlobalFunctions,\n TemplateGlobalValues,\n} from './TemplateGlobals';\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\n argRequired: {\n position: 'relative',\n '& > *': {\n display: 'inline',\n position: 'relative',\n '&::after': {\n position: 'absolute',\n content: '\"*\"',\n top: 0,\n right: theme.spacing(-1),\n fontWeight: 'bolder',\n color: theme.palette.error.light,\n },\n },\n },\n\n link: {\n paddingLeft: theme.spacing(1),\n cursor: 'pointer',\n },\n\n tabs: {\n display: 'block',\n minHeight: 'initial',\n overflow: 'initial',\n },\n}));\n\nexport const TemplatingExtensionsPageContent = ({\n linkLocal,\n}: {\n linkLocal?: boolean;\n}) => {\n const api = useApi(scaffolderApiRef);\n const classes = useStyles();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const { loading, value, error } = useAsync(async () => {\n if (api.listTemplatingExtensions) {\n return api.listTemplatingExtensions();\n }\n // eslint-disable-next-line no-console\n console.warn(\n 'listTemplatingExtensions is not implemented in the scaffolderApi; please make sure to implement this method.',\n );\n return Promise.resolve({\n filters: {},\n globals: { functions: {}, values: {} },\n });\n }, [api]);\n\n const [tab, selectTab] = useState<ExtensionKind>('filter');\n const [selectedItem, setSelectedItem] = useState<Extension | null>(null);\n const [input, setInput] = useState<string>('');\n\n const handleTab = (_event: any, kind: ExtensionKind) => {\n if (selectedItem?.kind !== kind) {\n setSelectedItem(null);\n setInput('');\n }\n selectTab(kind);\n };\n\n const selectItem = (item: Extension | null) => {\n setSelectedItem(item);\n if (item) {\n selectTab(item.kind);\n }\n };\n\n useEffect(() => {\n if (value && window.location.hash) {\n try {\n selectTab(parseFragment(window.location.hash.substring(1)).kind);\n document.querySelector(window.location.hash)?.scrollIntoView();\n } catch (e) {\n // ignore bad link\n }\n }\n }, [value]);\n\n const extensionKinds = useMemo(\n () => ({\n filter: {\n icon: <FilterListIcon />,\n label: t('templatingExtensions.content.filters.title'),\n },\n function: {\n icon: <FunctionsIcon />,\n label: t('templatingExtensions.content.functions.title'),\n },\n value: {\n icon: <AllInclusiveIcon />,\n label: t('templatingExtensions.content.values.title'),\n },\n }),\n [t],\n );\n\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n\n if (loading) {\n return <Progress />;\n }\n if (error || !value) {\n return (\n <div data-testid=\"empty\">\n {error && <ErrorPanel error={error} />}\n <EmptyState\n missing=\"info\"\n title={t('templatingExtensions.content.emptyState.title')}\n description={t('templatingExtensions.content.emptyState.description')}\n />\n </div>\n );\n }\n const { filters, globals } = value;\n\n const baseLink = (\n <Link\n className={classes.link}\n to={templatingExtensionsLink()}\n {...(linkLocal ? {} : { target: '_blank', rel: 'noopener noreferrer' })}\n >\n <LinkIcon />\n </Link>\n );\n\n return (\n <>\n <Autocomplete\n renderInput={params => (\n <TextField\n {...params}\n aria-label={t(\n 'templatingExtensions.content.searchFieldPlaceholder',\n )}\n placeholder={t(\n 'templatingExtensions.content.searchFieldPlaceholder',\n )}\n variant=\"outlined\"\n InputProps={{\n ...params.InputProps,\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n }}\n />\n )}\n getOptionLabel={option => option.name}\n getOptionSelected={(lhs, rhs) => lhs === rhs}\n options={listTemplatingExtensions(value)}\n groupBy={option => option.kind}\n renderGroup={params => (\n <>\n <Box display=\"flex\" alignItems=\"center\">\n {extensionKinds[params.group as ExtensionKind].icon}\n <Box sx={{ ml: 1 }}>\n {extensionKinds[params.group as ExtensionKind].label}\n </Box>\n </Box>\n <ul>{params.children}</ul>\n </>\n )}\n renderOption={(option: Extension) => (\n <ListItemText primary={option.name} />\n )}\n onChange={(_event: any, option: Extension | null) => {\n selectItem(option);\n }}\n inputValue={input}\n onInputChange={(_event: any, s: string) => setInput(s)}\n loading={loading}\n fullWidth\n clearOnEscape\n />\n <Tabs value={tab} onChange={handleTab} centered className={classes.tabs}>\n {Object.entries(extensionKinds).map(([k, v]) => (\n <Tab key={k} value={k} {...v} />\n ))}\n </Tabs>\n {tab === 'filter' && (\n <TemplateFilters {...{ baseLink, t, classes, filters, selectedItem }} />\n )}\n {tab === 'function' && (\n <TemplateGlobalFunctions\n functions={globals.functions}\n {...{ baseLink, t, classes, selectedItem }}\n />\n )}\n {tab === 'value' && (\n <TemplateGlobalValues\n values={globals.values}\n {...{ baseLink, t, classes, selectedItem }}\n />\n )}\n </>\n );\n};\n\nexport type TemplatingExtensionsPageProps = {\n contextMenu?: {\n editor?: boolean;\n actions?: boolean;\n tasks?: boolean;\n create?: boolean;\n };\n};\n\nexport const TemplatingExtensionsPage = (\n props: TemplatingExtensionsPageProps,\n) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const actionsLink = useRouteRef(actionsRouteRef);\n\n const scaffolderPageContextMenuProps: ScaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked:\n props?.contextMenu?.actions !== false\n ? () => navigate(actionsLink())\n : 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: undefined,\n };\n\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('templatingExtensions.pageTitle')}\n title={t('templatingExtensions.title')}\n subtitle={t('templatingExtensions.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <TemplatingExtensionsPageContent linkLocal />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TemplatingExtensionsPage.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/TemplatingExtensionsPage.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 { useApi, useRouteRef } from '@backstage/core-plugin-api';\n\nimport {\n actionsRouteRef,\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\n\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport {\n ScaffolderPageContextMenu,\n ScaffolderPageContextMenuProps,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport Box from '@material-ui/core/Box';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Tab from '@material-ui/core/Tab';\nimport Tabs from '@material-ui/core/Tabs';\nimport TextField from '@material-ui/core/TextField';\nimport AllInclusiveIcon from '@material-ui/icons/AllInclusive';\nimport FilterListIcon from '@material-ui/icons/FilterList';\nimport FunctionsIcon from '@material-ui/icons/Functions';\nimport LinkIcon from '@material-ui/icons/Link';\nimport SearchIcon from '@material-ui/icons/Search';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n Extension,\n ExtensionKind,\n listTemplatingExtensions,\n parseFragment,\n} from './navigation';\nimport { TemplateFilters } from './TemplateFilters';\nimport {\n TemplateGlobalFunctions,\n TemplateGlobalValues,\n} from './TemplateGlobals';\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\n argRequired: {\n position: 'relative',\n '& > *': {\n display: 'inline',\n position: 'relative',\n '&::after': {\n position: 'absolute',\n content: '\"*\"',\n top: 0,\n right: theme.spacing(-1),\n fontWeight: 'bolder',\n color: theme.palette.error.light,\n },\n },\n },\n\n link: {\n paddingLeft: theme.spacing(1),\n cursor: 'pointer',\n },\n\n tabs: {\n display: 'block',\n minHeight: 'initial',\n overflow: 'initial',\n },\n}));\n\nexport const TemplatingExtensionsPageContent = ({\n linkLocal,\n}: {\n linkLocal?: boolean;\n}) => {\n const api = useApi(scaffolderApiRef);\n const classes = useStyles();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const { loading, value, error } = useAsync(async () => {\n if (api.listTemplatingExtensions) {\n return api.listTemplatingExtensions();\n }\n // eslint-disable-next-line no-console\n console.warn(\n 'listTemplatingExtensions is not implemented in the scaffolderApi; please make sure to implement this method.',\n );\n return Promise.resolve({\n filters: {},\n globals: { functions: {}, values: {} },\n });\n }, [api]);\n\n const [tab, selectTab] = useState<ExtensionKind>('filter');\n const [selectedItem, setSelectedItem] = useState<Extension | null>(null);\n const [input, setInput] = useState<string>('');\n\n const handleTab = (_event: any, kind: ExtensionKind) => {\n if (selectedItem?.kind !== kind) {\n setSelectedItem(null);\n setInput('');\n }\n selectTab(kind);\n };\n\n const selectItem = (item: Extension | null) => {\n setSelectedItem(item);\n if (item) {\n selectTab(item.kind);\n }\n };\n\n useEffect(() => {\n if (value && window.location.hash) {\n try {\n selectTab(parseFragment(window.location.hash.substring(1)).kind);\n document.querySelector(window.location.hash)?.scrollIntoView();\n } catch (e) {\n // ignore bad link\n }\n }\n }, [value]);\n\n const extensionKinds = useMemo(\n () => ({\n filter: {\n icon: <FilterListIcon />,\n label: t('templatingExtensions.content.filters.title'),\n },\n function: {\n icon: <FunctionsIcon />,\n label: t('templatingExtensions.content.functions.title'),\n },\n value: {\n icon: <AllInclusiveIcon />,\n label: t('templatingExtensions.content.values.title'),\n },\n }),\n [t],\n );\n\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n\n if (loading) {\n return <Progress />;\n }\n if (error || !value) {\n return (\n <div data-testid=\"empty\">\n {error && <ErrorPanel error={error} />}\n <EmptyState\n missing=\"info\"\n title={t('templatingExtensions.content.emptyState.title')}\n description={t('templatingExtensions.content.emptyState.description')}\n />\n </div>\n );\n }\n const { filters, globals } = value;\n\n const baseLink = (\n <Link\n className={classes.link}\n to={templatingExtensionsLink()}\n {...(linkLocal ? {} : { target: '_blank', rel: 'noopener noreferrer' })}\n >\n <LinkIcon />\n </Link>\n );\n\n return (\n <>\n <Autocomplete\n renderInput={params => (\n <TextField\n {...params}\n aria-label={t(\n 'templatingExtensions.content.searchFieldPlaceholder',\n )}\n placeholder={t(\n 'templatingExtensions.content.searchFieldPlaceholder',\n )}\n variant=\"outlined\"\n InputProps={{\n ...params.InputProps,\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n }}\n />\n )}\n getOptionLabel={option => option.name}\n getOptionSelected={(lhs, rhs) => lhs === rhs}\n options={listTemplatingExtensions(value)}\n groupBy={option => option.kind}\n renderGroup={params => (\n <>\n <Box display=\"flex\" alignItems=\"center\">\n {extensionKinds[params.group as ExtensionKind].icon}\n <Box sx={{ ml: 1 }}>\n {extensionKinds[params.group as ExtensionKind].label}\n </Box>\n </Box>\n <ul>{params.children}</ul>\n </>\n )}\n renderOption={(option: Extension) => (\n <ListItemText primary={option.name} />\n )}\n onChange={(_event: any, option: Extension | null) => {\n selectItem(option);\n }}\n inputValue={input}\n onInputChange={(_event: any, s: string) => setInput(s)}\n loading={loading}\n fullWidth\n clearOnEscape\n />\n <Tabs value={tab} onChange={handleTab} centered className={classes.tabs}>\n {Object.entries(extensionKinds).map(([k, v]) => (\n <Tab key={k} value={k} {...v} />\n ))}\n </Tabs>\n {tab === 'filter' && (\n <TemplateFilters {...{ baseLink, t, classes, filters, selectedItem }} />\n )}\n {tab === 'function' && (\n <TemplateGlobalFunctions\n functions={globals.functions}\n {...{ baseLink, t, classes, selectedItem }}\n />\n )}\n {tab === 'value' && (\n <TemplateGlobalValues\n values={globals.values}\n {...{ baseLink, t, classes, selectedItem }}\n />\n )}\n </>\n );\n};\n\nexport type TemplatingExtensionsPageProps = {\n contextMenu?: {\n editor?: boolean;\n actions?: boolean;\n tasks?: boolean;\n create?: boolean;\n };\n};\n\nexport const TemplatingExtensionsPage = (\n props: TemplatingExtensionsPageProps,\n) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const actionsLink = useRouteRef(actionsRouteRef);\n\n const scaffolderPageContextMenuProps: ScaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked:\n props?.contextMenu?.actions !== false\n ? () => navigate(actionsLink())\n : 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: undefined,\n };\n\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('templatingExtensions.pageTitle')}\n title={t('templatingExtensions.title')}\n subtitle={t('templatingExtensions.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <TemplatingExtensionsPageContent linkLocal />\n </Content>\n </Page>\n );\n};\n"],"names":["Autocomplete","TextField"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { Combobox } from '@backstage/ui';
|
|
4
|
+
|
|
5
|
+
const Autocomplete = forwardRef(
|
|
6
|
+
({ isLoading, options, ...rest }, ref) => {
|
|
7
|
+
const finalOptions = isLoading ? [{ value: "__loading__", label: "Loading\u2026", disabled: true }] : options;
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
Combobox,
|
|
10
|
+
{
|
|
11
|
+
ref,
|
|
12
|
+
allowsCustomValue: true,
|
|
13
|
+
menuTrigger: "focus",
|
|
14
|
+
options: finalOptions,
|
|
15
|
+
...rest
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
Autocomplete.displayName = "Autocomplete";
|
|
21
|
+
|
|
22
|
+
export { Autocomplete };
|
|
23
|
+
//# sourceMappingURL=Autocomplete.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Autocomplete.esm.js","sources":["../../../../src/components/fields/Autocomplete/Autocomplete.tsx"],"sourcesContent":["/*\n * Copyright 2024 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 { forwardRef } from 'react';\nimport { Combobox } from '@backstage/ui';\nimport type { ComboboxProps } from '@backstage/ui';\n\nexport interface AutocompleteProps extends ComboboxProps {\n /**\n * Whether the autocomplete is currently loading options.\n * When true, displays a loading indicator in the dropdown.\n */\n isLoading?: boolean;\n}\n\n/**\n * Thin wrapper around the BUI `Combobox` that adds an `isLoading` indicator and\n * defaults to free-form text entry with focus-triggered menu.\n *\n * @public\n */\nexport const Autocomplete = forwardRef<HTMLDivElement, AutocompleteProps>(\n ({ isLoading, options, ...rest }, ref) => {\n const finalOptions = isLoading\n ? [{ value: '__loading__', label: 'Loading…', disabled: true }]\n : options;\n\n return (\n <Combobox\n ref={ref}\n allowsCustomValue\n menuTrigger=\"focus\"\n options={finalOptions}\n {...rest}\n />\n );\n },\n);\n\nAutocomplete.displayName = 'Autocomplete';\n"],"names":[],"mappings":";;;;AAkCO,MAAM,YAAA,GAAe,UAAA;AAAA,EAC1B,CAAC,EAAE,SAAA,EAAW,SAAS,GAAG,IAAA,IAAQ,GAAA,KAAQ;AACxC,IAAA,MAAM,YAAA,GAAe,SAAA,GACjB,CAAC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,eAAA,EAAY,QAAA,EAAU,IAAA,EAAM,CAAA,GAC5D,OAAA;AAEJ,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,iBAAA,EAAiB,IAAA;AAAA,QACjB,WAAA,EAAY,OAAA;AAAA,QACZ,OAAA,EAAS,YAAA;AAAA,QACR,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AAEA,YAAA,CAAa,WAAA,GAAc,cAAA;;;;"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import
|
|
2
|
+
import MuiTextField from '@material-ui/core/TextField';
|
|
3
3
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
4
4
|
import { scaffolderTranslationRef } from '../../../translation.esm.js';
|
|
5
|
+
import { useScaffolderTheme } from '@backstage/plugin-scaffolder-react/alpha';
|
|
6
|
+
import { TextField } from '@backstage/ui';
|
|
5
7
|
export { EntityNamePickerSchema } from './schema.esm.js';
|
|
6
8
|
|
|
7
9
|
const EntityNamePicker = (props) => {
|
|
10
|
+
const theme = useScaffolderTheme();
|
|
8
11
|
const { t } = useTranslationRef(scaffolderTranslationRef);
|
|
9
12
|
const {
|
|
10
13
|
onChange,
|
|
@@ -15,12 +18,30 @@ const EntityNamePicker = (props) => {
|
|
|
15
18
|
},
|
|
16
19
|
rawErrors,
|
|
17
20
|
formData,
|
|
21
|
+
uiSchema,
|
|
18
22
|
uiSchema: { "ui:autofocus": autoFocus },
|
|
19
23
|
idSchema,
|
|
20
24
|
placeholder
|
|
21
25
|
} = props;
|
|
26
|
+
if (theme === "bui") {
|
|
27
|
+
return /* @__PURE__ */ jsx(
|
|
28
|
+
TextField,
|
|
29
|
+
{
|
|
30
|
+
id: idSchema?.$id,
|
|
31
|
+
label: title,
|
|
32
|
+
description: uiSchema["ui:description"] ?? description,
|
|
33
|
+
secondaryLabel: required ? "Required" : void 0,
|
|
34
|
+
placeholder,
|
|
35
|
+
isRequired: required,
|
|
36
|
+
value: formData ?? "",
|
|
37
|
+
onChange,
|
|
38
|
+
isInvalid: rawErrors?.length > 0 && !formData,
|
|
39
|
+
autoFocus
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
}
|
|
22
43
|
return /* @__PURE__ */ jsx(
|
|
23
|
-
|
|
44
|
+
MuiTextField,
|
|
24
45
|
{
|
|
25
46
|
id: idSchema?.$id,
|
|
26
47
|
label: title,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityNamePicker.esm.js","sources":["../../../../src/components/fields/EntityNamePicker/EntityNamePicker.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 { EntityNamePickerProps } from './schema';\nimport
|
|
1
|
+
{"version":3,"file":"EntityNamePicker.esm.js","sources":["../../../../src/components/fields/EntityNamePicker/EntityNamePicker.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 { EntityNamePickerProps } from './schema';\nimport MuiTextField from '@material-ui/core/TextField';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { useScaffolderTheme } from '@backstage/plugin-scaffolder-react/alpha';\nimport { TextField as BuiTextField } from '@backstage/ui';\n\nexport { EntityNamePickerSchema } from './schema';\n\n/**\n * EntityName Picker\n */\nexport const EntityNamePicker = (props: EntityNamePickerProps) => {\n const theme = useScaffolderTheme();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const {\n onChange,\n required,\n schema: {\n title = t('fields.entityNamePicker.title'),\n description = t('fields.entityNamePicker.description'),\n },\n rawErrors,\n formData,\n uiSchema,\n uiSchema: { 'ui:autofocus': autoFocus },\n idSchema,\n placeholder,\n } = props;\n\n if (theme === 'bui') {\n return (\n <BuiTextField\n id={idSchema?.$id}\n label={title}\n description={uiSchema['ui:description'] ?? description}\n secondaryLabel={required ? 'Required' : undefined}\n placeholder={placeholder}\n isRequired={required}\n value={formData ?? ''}\n onChange={onChange}\n isInvalid={rawErrors?.length > 0 && !formData}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={autoFocus}\n />\n );\n }\n\n return (\n <MuiTextField\n id={idSchema?.$id}\n label={title}\n placeholder={placeholder}\n helperText={description}\n required={required}\n value={formData ?? ''}\n onChange={({ target: { value } }) => onChange(value)}\n margin=\"normal\"\n error={rawErrors?.length > 0 && !formData}\n inputProps={{ autoFocus }}\n FormHelperTextProps={{ margin: 'dense', style: { marginLeft: 0 } }}\n />\n );\n};\n"],"names":["BuiTextField"],"mappings":";;;;;;;;AA2BO,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAAiC;AAChE,EAAA,MAAM,QAAQ,kBAAA,EAAmB;AACjC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,KAAA,GAAQ,EAAE,+BAA+B,CAAA;AAAA,MACzC,WAAA,GAAc,EAAE,qCAAqC;AAAA,KACvD;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA,EAAU,EAAE,cAAA,EAAgB,SAAA,EAAU;AAAA,IACtC,QAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,IAAI,UAAU,KAAA,EAAO;AACnB,IAAA,uBACE,GAAA;AAAA,MAACA,SAAA;AAAA,MAAA;AAAA,QACC,IAAI,QAAA,EAAU,GAAA;AAAA,QACd,KAAA,EAAO,KAAA;AAAA,QACP,WAAA,EAAa,QAAA,CAAS,gBAAgB,CAAA,IAAK,WAAA;AAAA,QAC3C,cAAA,EAAgB,WAAW,UAAA,GAAa,MAAA;AAAA,QACxC,WAAA;AAAA,QACA,UAAA,EAAY,QAAA;AAAA,QACZ,OAAO,QAAA,IAAY,EAAA;AAAA,QACnB,QAAA;AAAA,QACA,SAAA,EAAW,SAAA,EAAW,MAAA,GAAS,CAAA,IAAK,CAAC,QAAA;AAAA,QAErC;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,IAAI,QAAA,EAAU,GAAA;AAAA,MACd,KAAA,EAAO,KAAA;AAAA,MACP,WAAA;AAAA,MACA,UAAA,EAAY,WAAA;AAAA,MACZ,QAAA;AAAA,MACA,OAAO,QAAA,IAAY,EAAA;AAAA,MACnB,QAAA,EAAU,CAAC,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAM,EAAE,KAAM,QAAA,CAAS,KAAK,CAAA;AAAA,MACnD,MAAA,EAAO,QAAA;AAAA,MACP,KAAA,EAAO,SAAA,EAAW,MAAA,GAAS,CAAA,IAAK,CAAC,QAAA;AAAA,MACjC,UAAA,EAAY,EAAE,SAAA,EAAU;AAAA,MACxB,mBAAA,EAAqB,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAO,EAAE,UAAA,EAAY,GAAE;AAAE;AAAA,GACnE;AAEJ;;;;"}
|