@backstage/plugin-scaffolder 1.26.0-next.0 → 1.26.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/alpha/package.json +1 -1
  3. package/dist/alpha/components/TemplateEditorPage/CustomFieldExplorer.esm.js +61 -29
  4. package/dist/alpha/components/TemplateEditorPage/CustomFieldExplorer.esm.js.map +1 -1
  5. package/dist/alpha/components/TemplateEditorPage/CustomFieldPlaygroud.esm.js +36 -13
  6. package/dist/alpha/components/TemplateEditorPage/CustomFieldPlaygroud.esm.js.map +1 -1
  7. package/dist/alpha/components/TemplateEditorPage/CustomFieldsPage.esm.js +6 -15
  8. package/dist/alpha/components/TemplateEditorPage/CustomFieldsPage.esm.js.map +1 -1
  9. package/dist/alpha/components/TemplateEditorPage/DirectoryEditorContext.esm.js +4 -3
  10. package/dist/alpha/components/TemplateEditorPage/DirectoryEditorContext.esm.js.map +1 -1
  11. package/dist/alpha/components/TemplateEditorPage/TemplateEditor.esm.js +35 -80
  12. package/dist/alpha/components/TemplateEditorPage/TemplateEditor.esm.js.map +1 -1
  13. package/dist/alpha/components/TemplateEditorPage/TemplateEditorBrowser.esm.js +9 -6
  14. package/dist/alpha/components/TemplateEditorPage/TemplateEditorBrowser.esm.js.map +1 -1
  15. package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js +5 -2
  16. package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js.map +1 -1
  17. package/dist/alpha/components/TemplateEditorPage/TemplateEditorIntro.esm.js +108 -89
  18. package/dist/alpha/components/TemplateEditorPage/TemplateEditorIntro.esm.js.map +1 -1
  19. package/dist/alpha/components/TemplateEditorPage/TemplateEditorLayout.esm.js +94 -0
  20. package/dist/alpha/components/TemplateEditorPage/TemplateEditorLayout.esm.js.map +1 -0
  21. package/dist/alpha/components/TemplateEditorPage/TemplateEditorPage.esm.js +23 -43
  22. package/dist/alpha/components/TemplateEditorPage/TemplateEditorPage.esm.js.map +1 -1
  23. package/dist/alpha/components/TemplateEditorPage/TemplateEditorTextArea.esm.js +10 -20
  24. package/dist/alpha/components/TemplateEditorPage/TemplateEditorTextArea.esm.js.map +1 -1
  25. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js +42 -14
  26. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js.map +1 -1
  27. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarFileMenu.esm.js +73 -0
  28. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarFileMenu.esm.js.map +1 -0
  29. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarTemplatesMenu.esm.js +84 -0
  30. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarTemplatesMenu.esm.js.map +1 -0
  31. package/dist/alpha/components/TemplateEditorPage/TemplateFormPage.esm.js +3 -1
  32. package/dist/alpha/components/TemplateEditorPage/TemplateFormPage.esm.js.map +1 -1
  33. package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js +58 -95
  34. package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js.map +1 -1
  35. package/dist/alpha/components/TemplateEditorPage/TemplateIntroPage.esm.js +54 -0
  36. package/dist/alpha/components/TemplateEditorPage/TemplateIntroPage.esm.js.map +1 -0
  37. package/dist/alpha/components/TemplateEditorPage/useTemplateDirectory.esm.js +33 -0
  38. package/dist/alpha/components/TemplateEditorPage/useTemplateDirectory.esm.js.map +1 -0
  39. package/dist/alpha/components/TemplateListPage/RegisterExistingButton.esm.js +1 -1
  40. package/dist/alpha/components/TemplateListPage/RegisterExistingButton.esm.js.map +1 -1
  41. package/dist/alpha.d.ts +24 -5
  42. package/dist/api.esm.js +5 -3
  43. package/dist/api.esm.js.map +1 -1
  44. package/dist/components/ActionsPage/ActionsPage.esm.js +42 -8
  45. package/dist/components/ActionsPage/ActionsPage.esm.js.map +1 -1
  46. package/dist/components/ListTasksPage/ListTasksPage.esm.js +17 -3
  47. package/dist/components/ListTasksPage/ListTasksPage.esm.js.map +1 -1
  48. package/dist/components/Router/Router.esm.js +4 -4
  49. package/dist/components/Router/Router.esm.js.map +1 -1
  50. package/dist/components/fields/EntityPicker/EntityPicker.esm.js +1 -1
  51. package/dist/components/fields/EntityPicker/EntityPicker.esm.js.map +1 -1
  52. package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js +1 -0
  53. package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js.map +1 -1
  54. package/dist/index.d.ts +3 -0
  55. package/dist/lib/filesystem/WebFileSystemAccess.esm.js +1 -13
  56. package/dist/lib/filesystem/WebFileSystemAccess.esm.js.map +1 -1
  57. package/dist/lib/filesystem/WebFileSystemStore.esm.js +15 -0
  58. package/dist/lib/filesystem/WebFileSystemStore.esm.js.map +1 -0
  59. package/dist/lib/filesystem/createExampleTemplate.esm.js +1 -0
  60. package/dist/lib/filesystem/createExampleTemplate.esm.js.map +1 -1
  61. package/dist/translation.esm.js +39 -4
  62. package/dist/translation.esm.js.map +1 -1
  63. package/package.json +33 -24
  64. package/dist/alpha/components/TemplateEditorPage/TemplatePage.esm.js +0 -52
  65. package/dist/alpha/components/TemplateEditorPage/TemplatePage.esm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"api.esm.js","sources":["../src/api.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 { parseEntityRef } from '@backstage/catalog-model';\nimport {\n DiscoveryApi,\n FetchApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { Observable } from '@backstage/types';\nimport qs from 'qs';\nimport ObservableImpl from 'zen-observable';\nimport {\n ListActionsResponse,\n LogEvent,\n ScaffolderApi,\n ScaffolderScaffoldOptions,\n ScaffolderScaffoldResponse,\n ScaffolderStreamLogsOptions,\n ScaffolderGetIntegrationsListOptions,\n ScaffolderGetIntegrationsListResponse,\n ScaffolderTask,\n ScaffolderDryRunOptions,\n ScaffolderDryRunResponse,\n TemplateParameterSchema,\n} from '@backstage/plugin-scaffolder-react';\n\nimport queryString from 'qs';\nimport {\n EventSourceMessage,\n fetchEventSource,\n} from '@microsoft/fetch-event-source';\n\n/**\n * An API to interact with the scaffolder backend.\n *\n * @public\n */\nexport class ScaffolderClient implements ScaffolderApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly scmIntegrationsApi: ScmIntegrationRegistry;\n private readonly fetchApi: FetchApi;\n private readonly identityApi?: IdentityApi;\n private readonly useLongPollingLogs: boolean;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n identityApi?: IdentityApi;\n scmIntegrationsApi: ScmIntegrationRegistry;\n useLongPollingLogs?: boolean;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi ?? { fetch };\n this.scmIntegrationsApi = options.scmIntegrationsApi;\n this.useLongPollingLogs = options.useLongPollingLogs ?? false;\n this.identityApi = options.identityApi;\n }\n\n async listTasks(options: {\n filterByOwnership: 'owned' | 'all';\n }): Promise<{ tasks: ScaffolderTask[] }> {\n if (!this.identityApi) {\n throw new Error(\n 'IdentityApi is not available in the ScaffolderClient, please pass through the IdentityApi to the ScaffolderClient constructor in order to use the listTasks method',\n );\n }\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const { userEntityRef } = await this.identityApi.getBackstageIdentity();\n\n const query = queryString.stringify(\n options.filterByOwnership === 'owned' ? { createdBy: userEntityRef } : {},\n );\n\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/tasks?${query}`);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async getIntegrationsList(\n options: ScaffolderGetIntegrationsListOptions,\n ): Promise<ScaffolderGetIntegrationsListResponse> {\n const integrations = [\n ...this.scmIntegrationsApi.azure.list(),\n ...this.scmIntegrationsApi.bitbucket\n .list()\n .filter(\n item =>\n !this.scmIntegrationsApi.bitbucketCloud.byHost(item.config.host) &&\n !this.scmIntegrationsApi.bitbucketServer.byHost(item.config.host),\n ),\n ...this.scmIntegrationsApi.bitbucketCloud.list(),\n ...this.scmIntegrationsApi.bitbucketServer.list(),\n ...this.scmIntegrationsApi.gerrit.list(),\n ...this.scmIntegrationsApi.gitea.list(),\n ...this.scmIntegrationsApi.github.list(),\n ...this.scmIntegrationsApi.gitlab.list(),\n ]\n .map(c => ({ type: c.type, title: c.title, host: c.config.host }))\n .filter(c => options.allowedHosts.includes(c.host));\n\n return {\n integrations,\n };\n }\n\n async getTemplateParameterSchema(\n templateRef: string,\n ): Promise<TemplateParameterSchema> {\n const { namespace, kind, name } = parseEntityRef(templateRef, {\n defaultKind: 'template',\n });\n\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const templatePath = [namespace, kind, name]\n .map(s => encodeURIComponent(s))\n .join('/');\n\n const url = `${baseUrl}/v2/templates/${templatePath}/parameter-schema`;\n\n const response = await this.fetchApi.fetch(url);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const schema: TemplateParameterSchema = await response.json();\n return schema;\n }\n\n async scaffold(\n options: ScaffolderScaffoldOptions,\n ): Promise<ScaffolderScaffoldResponse> {\n const { templateRef, values, secrets = {} } = options;\n const url = `${await this.discoveryApi.getBaseUrl('scaffolder')}/v2/tasks`;\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n templateRef,\n values: { ...values },\n secrets,\n }),\n });\n\n if (response.status !== 201) {\n const status = `${response.status} ${response.statusText}`;\n const body = await response.text();\n throw new Error(`Backend request failed, ${status} ${body.trim()}`);\n }\n\n const { id } = (await response.json()) as { id: string };\n return { taskId: id };\n }\n\n async getTask(taskId: string): Promise<ScaffolderTask> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}`;\n\n const response = await this.fetchApi.fetch(url);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n streamLogs(options: ScaffolderStreamLogsOptions): Observable<LogEvent> {\n if (this.useLongPollingLogs) {\n return this.streamLogsPolling(options);\n }\n\n return this.streamLogsEventStream(options);\n }\n\n async dryRun(\n options: ScaffolderDryRunOptions,\n ): Promise<ScaffolderDryRunResponse> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/dry-run`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n template: options.template,\n values: options.values,\n secrets: options.secrets,\n directoryContents: options.directoryContents,\n }),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json();\n }\n\n private streamLogsEventStream({\n isTaskRecoverable,\n taskId,\n after,\n }: ScaffolderStreamLogsOptions): Observable<LogEvent> {\n return new ObservableImpl(subscriber => {\n const params = new URLSearchParams();\n if (after !== undefined) {\n params.set('after', String(Number(after)));\n }\n\n this.discoveryApi.getBaseUrl('scaffolder').then(\n baseUrl => {\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(\n taskId,\n )}/eventstream`;\n\n const processEvent = (event: any) => {\n if (event.data) {\n try {\n subscriber.next(JSON.parse(event.data));\n } catch (ex) {\n subscriber.error(ex);\n }\n }\n };\n\n const ctrl = new AbortController();\n void fetchEventSource(url, {\n fetch: this.fetchApi.fetch,\n signal: ctrl.signal,\n onmessage(e: EventSourceMessage) {\n if (e.event === 'log') {\n processEvent(e);\n return;\n } else if (e.event === 'completion' && !isTaskRecoverable) {\n processEvent(e);\n subscriber.complete();\n ctrl.abort();\n return;\n }\n processEvent(e);\n },\n onerror(err) {\n subscriber.error(err);\n },\n });\n },\n error => {\n subscriber.error(error);\n },\n );\n });\n }\n\n private streamLogsPolling({\n taskId,\n after: inputAfter,\n }: {\n taskId: string;\n after?: number;\n }): Observable<LogEvent> {\n let after = inputAfter;\n\n return new ObservableImpl(subscriber => {\n this.discoveryApi.getBaseUrl('scaffolder').then(async baseUrl => {\n while (!subscriber.closed) {\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(\n taskId,\n )}/events?${qs.stringify({ after })}`;\n const response = await this.fetchApi.fetch(url);\n\n if (!response.ok) {\n // wait for one second to not run into an\n await new Promise(resolve => setTimeout(resolve, 1000));\n continue;\n }\n\n const logs = (await response.json()) as LogEvent[];\n\n for (const event of logs) {\n after = Number(event.id);\n\n subscriber.next(event);\n\n if (event.type === 'completion') {\n subscriber.complete();\n return;\n }\n }\n }\n });\n });\n }\n\n async listActions(): Promise<ListActionsResponse> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/actions`);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async cancelTask(taskId: string): Promise<void> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/cancel`;\n\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async retry?(taskId: string): Promise<void> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/retry`;\n\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async autocomplete({\n token,\n resource,\n provider,\n context,\n }: {\n token: string;\n provider: string;\n resource: string;\n context?: Record<string, string>;\n }): Promise<{ results: { title: string }[] }> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n\n const url = `${baseUrl}/v2/autocomplete/${provider}/${resource}`;\n\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n token,\n context: context ?? {},\n }),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const { results } = await response.json();\n return { results };\n }\n}\n"],"names":["queryString"],"mappings":"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"}
1
+ {"version":3,"file":"api.esm.js","sources":["../src/api.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 { parseEntityRef } from '@backstage/catalog-model';\nimport {\n DiscoveryApi,\n FetchApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { Observable } from '@backstage/types';\nimport qs from 'qs';\nimport queryString from 'qs';\nimport ObservableImpl from 'zen-observable';\nimport {\n ListActionsResponse,\n LogEvent,\n ScaffolderApi,\n ScaffolderDryRunOptions,\n ScaffolderDryRunResponse,\n ScaffolderGetIntegrationsListOptions,\n ScaffolderGetIntegrationsListResponse,\n ScaffolderScaffoldOptions,\n ScaffolderScaffoldResponse,\n ScaffolderStreamLogsOptions,\n ScaffolderTask,\n TemplateParameterSchema,\n} from '@backstage/plugin-scaffolder-react';\nimport {\n EventSourceMessage,\n fetchEventSource,\n} from '@microsoft/fetch-event-source';\n\n/**\n * An API to interact with the scaffolder backend.\n *\n * @public\n */\nexport class ScaffolderClient implements ScaffolderApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly scmIntegrationsApi: ScmIntegrationRegistry;\n private readonly fetchApi: FetchApi;\n private readonly identityApi?: IdentityApi;\n private readonly useLongPollingLogs: boolean;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n identityApi?: IdentityApi;\n scmIntegrationsApi: ScmIntegrationRegistry;\n useLongPollingLogs?: boolean;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi ?? { fetch };\n this.scmIntegrationsApi = options.scmIntegrationsApi;\n this.useLongPollingLogs = options.useLongPollingLogs ?? false;\n this.identityApi = options.identityApi;\n }\n\n async listTasks(options: {\n filterByOwnership: 'owned' | 'all';\n limit?: number;\n offset?: number;\n }): Promise<{ tasks: ScaffolderTask[]; totalTasks?: number }> {\n if (!this.identityApi) {\n throw new Error(\n 'IdentityApi is not available in the ScaffolderClient, please pass through the IdentityApi to the ScaffolderClient constructor in order to use the listTasks method',\n );\n }\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const { userEntityRef } = await this.identityApi.getBackstageIdentity();\n\n const query = queryString.stringify({\n createdBy:\n options.filterByOwnership === 'owned' ? userEntityRef : undefined,\n limit: options.limit,\n offset: options.offset,\n });\n\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/tasks?${query}`);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async getIntegrationsList(\n options: ScaffolderGetIntegrationsListOptions,\n ): Promise<ScaffolderGetIntegrationsListResponse> {\n const integrations = [\n ...this.scmIntegrationsApi.azure.list(),\n ...this.scmIntegrationsApi.bitbucket\n .list()\n .filter(\n item =>\n !this.scmIntegrationsApi.bitbucketCloud.byHost(item.config.host) &&\n !this.scmIntegrationsApi.bitbucketServer.byHost(item.config.host),\n ),\n ...this.scmIntegrationsApi.bitbucketCloud.list(),\n ...this.scmIntegrationsApi.bitbucketServer.list(),\n ...this.scmIntegrationsApi.gerrit.list(),\n ...this.scmIntegrationsApi.gitea.list(),\n ...this.scmIntegrationsApi.github.list(),\n ...this.scmIntegrationsApi.gitlab.list(),\n ]\n .map(c => ({ type: c.type, title: c.title, host: c.config.host }))\n .filter(c => options.allowedHosts.includes(c.host));\n\n return {\n integrations,\n };\n }\n\n async getTemplateParameterSchema(\n templateRef: string,\n ): Promise<TemplateParameterSchema> {\n const { namespace, kind, name } = parseEntityRef(templateRef, {\n defaultKind: 'template',\n });\n\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const templatePath = [namespace, kind, name]\n .map(s => encodeURIComponent(s))\n .join('/');\n\n const url = `${baseUrl}/v2/templates/${templatePath}/parameter-schema`;\n\n const response = await this.fetchApi.fetch(url);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const schema: TemplateParameterSchema = await response.json();\n return schema;\n }\n\n async scaffold(\n options: ScaffolderScaffoldOptions,\n ): Promise<ScaffolderScaffoldResponse> {\n const { templateRef, values, secrets = {} } = options;\n const url = `${await this.discoveryApi.getBaseUrl('scaffolder')}/v2/tasks`;\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n templateRef,\n values: { ...values },\n secrets,\n }),\n });\n\n if (response.status !== 201) {\n const status = `${response.status} ${response.statusText}`;\n const body = await response.text();\n throw new Error(`Backend request failed, ${status} ${body.trim()}`);\n }\n\n const { id } = (await response.json()) as { id: string };\n return { taskId: id };\n }\n\n async getTask(taskId: string): Promise<ScaffolderTask> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}`;\n\n const response = await this.fetchApi.fetch(url);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n streamLogs(options: ScaffolderStreamLogsOptions): Observable<LogEvent> {\n if (this.useLongPollingLogs) {\n return this.streamLogsPolling(options);\n }\n\n return this.streamLogsEventStream(options);\n }\n\n async dryRun(\n options: ScaffolderDryRunOptions,\n ): Promise<ScaffolderDryRunResponse> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/dry-run`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n template: options.template,\n values: options.values,\n secrets: options.secrets,\n directoryContents: options.directoryContents,\n }),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json();\n }\n\n private streamLogsEventStream({\n isTaskRecoverable,\n taskId,\n after,\n }: ScaffolderStreamLogsOptions): Observable<LogEvent> {\n return new ObservableImpl(subscriber => {\n const params = new URLSearchParams();\n if (after !== undefined) {\n params.set('after', String(Number(after)));\n }\n\n this.discoveryApi.getBaseUrl('scaffolder').then(\n baseUrl => {\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(\n taskId,\n )}/eventstream`;\n\n const processEvent = (event: any) => {\n if (event.data) {\n try {\n subscriber.next(JSON.parse(event.data));\n } catch (ex) {\n subscriber.error(ex);\n }\n }\n };\n\n const ctrl = new AbortController();\n void fetchEventSource(url, {\n fetch: this.fetchApi.fetch,\n signal: ctrl.signal,\n onmessage(e: EventSourceMessage) {\n if (e.event === 'log') {\n processEvent(e);\n return;\n } else if (e.event === 'completion' && !isTaskRecoverable) {\n processEvent(e);\n subscriber.complete();\n ctrl.abort();\n return;\n }\n processEvent(e);\n },\n onerror(err) {\n subscriber.error(err);\n },\n });\n },\n error => {\n subscriber.error(error);\n },\n );\n });\n }\n\n private streamLogsPolling({\n taskId,\n after: inputAfter,\n }: {\n taskId: string;\n after?: number;\n }): Observable<LogEvent> {\n let after = inputAfter;\n\n return new ObservableImpl(subscriber => {\n this.discoveryApi.getBaseUrl('scaffolder').then(async baseUrl => {\n while (!subscriber.closed) {\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(\n taskId,\n )}/events?${qs.stringify({ after })}`;\n const response = await this.fetchApi.fetch(url);\n\n if (!response.ok) {\n // wait for one second to not run into an\n await new Promise(resolve => setTimeout(resolve, 1000));\n continue;\n }\n\n const logs = (await response.json()) as LogEvent[];\n\n for (const event of logs) {\n after = Number(event.id);\n\n subscriber.next(event);\n\n if (event.type === 'completion') {\n subscriber.complete();\n return;\n }\n }\n }\n });\n });\n }\n\n async listActions(): Promise<ListActionsResponse> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/actions`);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async cancelTask(taskId: string): Promise<void> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/cancel`;\n\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async retry?(taskId: string): Promise<void> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/retry`;\n\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async autocomplete({\n token,\n resource,\n provider,\n context,\n }: {\n token: string;\n provider: string;\n resource: string;\n context?: Record<string, string>;\n }): Promise<{ results: { title: string }[] }> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n\n const url = `${baseUrl}/v2/autocomplete/${provider}/${resource}`;\n\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n token,\n context: context ?? {},\n }),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const { results } = await response.json();\n return { results };\n }\n}\n"],"names":["queryString"],"mappings":"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"}
@@ -20,6 +20,10 @@ import classNames from 'classnames';
20
20
  import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
21
21
  import ExpandLessIcon from '@material-ui/icons/ExpandLess';
22
22
  import LinkIcon from '@material-ui/icons/Link';
23
+ import Autocomplete from '@material-ui/lab/Autocomplete';
24
+ import TextField from '@material-ui/core/TextField';
25
+ import InputAdornment from '@material-ui/core/InputAdornment';
26
+ import SearchIcon from '@material-ui/icons/Search';
23
27
  import { useRouteRef, useApi } from '@backstage/core-plugin-api';
24
28
  import { Page, Header, Content, Progress, ErrorPanel, EmptyState, Link, MarkdownContent, CodeSnippet } from '@backstage/core-components';
25
29
  import Chip from '@material-ui/core/Chip';
@@ -70,12 +74,17 @@ const ActionPageContent = () => {
70
74
  const api = useApi(scaffolderApiRef);
71
75
  const { t } = useTranslationRef(scaffolderTranslationRef);
72
76
  const classes = useStyles();
73
- const { loading, value, error } = useAsync(async () => {
77
+ const {
78
+ loading,
79
+ value = [],
80
+ error
81
+ } = useAsync(async () => {
74
82
  return api.listActions();
75
83
  }, [api]);
84
+ const [selectedAction, setSelectedAction] = useState(null);
76
85
  const [isExpanded, setIsExpanded] = useState({});
77
86
  useEffect(() => {
78
- if (value && window.location.hash) {
87
+ if (value.length && window.location.hash) {
79
88
  document.querySelector(window.location.hash)?.scrollIntoView();
80
89
  }
81
90
  }, [value]);
@@ -155,7 +164,32 @@ const ActionPageContent = () => {
155
164
  formatRows(`${id}.${index}`, i)
156
165
  ))));
157
166
  };
158
- return value?.map((action) => {
167
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { pb: 3 }, /* @__PURE__ */ React.createElement(
168
+ Autocomplete,
169
+ {
170
+ id: "actions-autocomplete",
171
+ options: value,
172
+ loading,
173
+ getOptionLabel: (option) => option.id,
174
+ renderInput: (params) => /* @__PURE__ */ React.createElement(
175
+ TextField,
176
+ {
177
+ ...params,
178
+ "aria-label": t("actionsPage.content.searchFieldPlaceholder"),
179
+ placeholder: t("actionsPage.content.searchFieldPlaceholder"),
180
+ variant: "outlined",
181
+ InputProps: {
182
+ ...params.InputProps,
183
+ startAdornment: /* @__PURE__ */ React.createElement(InputAdornment, { position: "start" }, /* @__PURE__ */ React.createElement(SearchIcon, null))
184
+ }
185
+ }
186
+ ),
187
+ onChange: (_event, option) => {
188
+ setSelectedAction(option);
189
+ },
190
+ fullWidth: true
191
+ }
192
+ )), (selectedAction ? [selectedAction] : value).map((action) => {
159
193
  if (action.id.startsWith("legacy:")) {
160
194
  return void 0;
161
195
  }
@@ -164,11 +198,11 @@ const ActionPageContent = () => {
164
198
  `${action.id}.input`,
165
199
  action.schema?.input?.oneOf
166
200
  );
167
- return /* @__PURE__ */ React.createElement(Box, { pb: 4, key: action.id }, /* @__PURE__ */ React.createElement(
201
+ return /* @__PURE__ */ React.createElement(Box, { pb: 3, key: action.id }, /* @__PURE__ */ React.createElement(Box, { display: "flex", alignItems: "center" }, /* @__PURE__ */ React.createElement(
168
202
  Typography,
169
203
  {
170
204
  id: action.id.replaceAll(":", "-"),
171
- variant: "h4",
205
+ variant: "h5",
172
206
  component: "h2",
173
207
  className: classes.code
174
208
  },
@@ -180,12 +214,12 @@ const ActionPageContent = () => {
180
214
  to: `#${action.id.replaceAll(":", "-")}`
181
215
  },
182
216
  /* @__PURE__ */ React.createElement(LinkIcon, null)
183
- ), action.description && /* @__PURE__ */ React.createElement(MarkdownContent, { content: action.description }), action.schema?.input && /* @__PURE__ */ React.createElement(Box, { pb: 2 }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5", component: "h3" }, t("actionsPage.action.input")), renderTable(
217
+ )), action.description && /* @__PURE__ */ React.createElement(MarkdownContent, { content: action.description }), action.schema?.input && /* @__PURE__ */ React.createElement(Box, { pb: 2 }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6", component: "h3" }, t("actionsPage.action.input")), renderTable(
184
218
  formatRows(`${action.id}.input`, action?.schema?.input)
185
219
  ), oneOf), action.schema?.output && /* @__PURE__ */ React.createElement(Box, { pb: 2 }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5", component: "h3" }, t("actionsPage.action.output")), renderTable(
186
220
  formatRows(`${action.id}.output`, action?.schema?.output)
187
- )), action.examples && /* @__PURE__ */ React.createElement(Accordion, null, /* @__PURE__ */ React.createElement(AccordionSummary, { expandIcon: /* @__PURE__ */ React.createElement(ExpandMoreIcon, null) }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5", component: "h3" }, t("actionsPage.action.examples"))), /* @__PURE__ */ React.createElement(AccordionDetails, null, /* @__PURE__ */ React.createElement(Box, { pb: 2 }, /* @__PURE__ */ React.createElement(ExamplesTable, { examples: action.examples })))));
188
- });
221
+ )), action.examples && /* @__PURE__ */ React.createElement(Accordion, null, /* @__PURE__ */ React.createElement(AccordionSummary, { expandIcon: /* @__PURE__ */ React.createElement(ExpandMoreIcon, null) }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6", component: "h3" }, t("actionsPage.action.examples"))), /* @__PURE__ */ React.createElement(AccordionDetails, null, /* @__PURE__ */ React.createElement(Box, { pb: 2 }, /* @__PURE__ */ React.createElement(ExamplesTable, { examples: action.examples })))));
222
+ }));
189
223
  };
190
224
  const ActionsPage = () => {
191
225
  const navigate = useNavigate();
@@ -1 +1 @@
1
- {"version":3,"file":"ActionsPage.esm.js","sources":["../../../src/components/ActionsPage/ActionsPage.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { Fragment, useEffect, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n ActionExample,\n scaffolderApiRef,\n} from '@backstage/plugin-scaffolder-react';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport Box from '@material-ui/core/Box';\nimport Collapse from '@material-ui/core/Collapse';\nimport Grid from '@material-ui/core/Grid';\nimport Paper from '@material-ui/core/Paper';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { JSONSchema7, JSONSchema7Definition } from 'json-schema';\nimport classNames from 'classnames';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport LinkIcon from '@material-ui/icons/Link';\n\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n CodeSnippet,\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n MarkdownContent,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport Chip from '@material-ui/core/Chip';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport {\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n} from '../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nconst useStyles = makeStyles(theme => ({\n code: {\n fontFamily: 'Menlo, monospace',\n padding: theme.spacing(1),\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[700]\n : theme.palette.grey[300],\n display: 'inline-block',\n borderRadius: 5,\n border: `1px solid ${theme.palette.grey[500]}`,\n position: 'relative',\n },\n\n codeRequired: {\n '&::after': {\n position: 'absolute',\n content: '\"*\"',\n top: 0,\n right: theme.spacing(0.5),\n fontWeight: 'bolder',\n color: theme.palette.error.light,\n },\n },\n link: {\n paddingLeft: theme.spacing(1),\n },\n}));\n\nconst ExamplesTable = (props: { examples: ActionExample[] }) => {\n return (\n <Grid container>\n {props.examples.map((example, index) => {\n return (\n <Fragment key={`example-${index}`}>\n <Grid item lg={3}>\n <Box padding={4}>\n <Typography>{example.description}</Typography>\n </Box>\n </Grid>\n <Grid item lg={9}>\n <Box padding={1}>\n <CodeSnippet\n text={example.example}\n showLineNumbers\n showCopyCodeButton\n language=\"yaml\"\n />\n </Box>\n </Grid>\n </Fragment>\n );\n })}\n </Grid>\n );\n};\n\nexport const ActionPageContent = () => {\n const api = useApi(scaffolderApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const classes = useStyles();\n const { loading, value, error } = useAsync(async () => {\n return api.listActions();\n }, [api]);\n\n const [isExpanded, setIsExpanded] = useState<{ [key: string]: boolean }>({});\n\n useEffect(() => {\n if (value && window.location.hash) {\n document.querySelector(window.location.hash)?.scrollIntoView();\n }\n }, [value]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n const renderTable = (rows?: JSX.Element[]) => {\n if (!rows || rows.length < 1) {\n return (\n <Typography>{t('actionsPage.content.noRowsDescription')}</Typography>\n );\n }\n return (\n <TableContainer component={Paper}>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{t('actionsPage.content.tableCell.name')}</TableCell>\n <TableCell>{t('actionsPage.content.tableCell.title')}</TableCell>\n <TableCell>\n {t('actionsPage.content.tableCell.description')}\n </TableCell>\n <TableCell>{t('actionsPage.content.tableCell.type')}</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>{rows}</TableBody>\n </Table>\n </TableContainer>\n );\n };\n\n const getTypes = (properties: JSONSchema7) => {\n if (!properties.type) {\n return ['unknown'];\n }\n\n if (properties.type !== 'array') {\n return [properties.type].flat();\n }\n\n return [\n `${properties.type}(${\n (properties.items as JSONSchema7 | undefined)?.type ?? 'unknown'\n })`,\n ];\n };\n\n const formatRows = (parentId: string, input?: JSONSchema7) => {\n const properties = input?.properties;\n if (!properties) {\n return undefined;\n }\n\n return Object.entries(properties).map(entry => {\n const [key] = entry;\n const id = `${parentId}.${key}`;\n const props = entry[1] as unknown as JSONSchema7;\n const codeClassname = classNames(classes.code, {\n [classes.codeRequired]: input.required?.includes(key),\n });\n const types = getTypes(props);\n\n return (\n <React.Fragment key={id}>\n <TableRow key={id}>\n <TableCell>\n <div className={codeClassname}>{key}</div>\n </TableCell>\n <TableCell>{props.title}</TableCell>\n <TableCell>{props.description}</TableCell>\n <TableCell>\n {types.map(type =>\n type.includes('object') ? (\n <Chip\n label={type}\n key={type}\n icon={\n isExpanded[id] ? <ExpandLessIcon /> : <ExpandMoreIcon />\n }\n variant=\"outlined\"\n onClick={() =>\n setIsExpanded(prevState => {\n const state = { ...prevState };\n state[id] = !prevState[id];\n return state;\n })\n }\n />\n ) : (\n <Chip label={type} key={type} variant=\"outlined\" />\n ),\n )}\n </TableCell>\n </TableRow>\n <TableRow>\n <TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={6}>\n <Collapse in={isExpanded[id]} timeout=\"auto\" unmountOnExit>\n <Box sx={{ margin: 1 }}>\n <Typography variant=\"h6\" component=\"div\">\n {key}\n </Typography>\n {renderTable(\n formatRows(\n id,\n props.type === 'array'\n ? ({\n properties:\n (props.items as JSONSchema7 | undefined)\n ?.properties ?? {},\n } as unknown as JSONSchema7 | undefined)\n : props,\n ),\n )}\n </Box>\n </Collapse>\n </TableCell>\n </TableRow>\n </React.Fragment>\n );\n });\n };\n\n const renderTables = (\n name: string,\n id: string,\n input?: JSONSchema7Definition[],\n ) => {\n if (!input) {\n return undefined;\n }\n\n return (\n <>\n <Typography variant=\"h6\" component=\"h4\">\n {name}\n </Typography>\n {input.map((i, index) => (\n <div key={index}>\n {renderTable(\n formatRows(`${id}.${index}`, i as unknown as JSONSchema7),\n )}\n </div>\n ))}\n </>\n );\n };\n\n return value?.map(action => {\n if (action.id.startsWith('legacy:')) {\n return undefined;\n }\n\n const oneOf = renderTables(\n 'oneOf',\n `${action.id}.input`,\n action.schema?.input?.oneOf,\n );\n return (\n <Box pb={4} key={action.id}>\n <Typography\n id={action.id.replaceAll(':', '-')}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {action.id}\n </Typography>\n <Link\n className={classes.link}\n to={`#${action.id.replaceAll(':', '-')}`}\n >\n <LinkIcon />\n </Link>\n {action.description && <MarkdownContent content={action.description} />}\n {action.schema?.input && (\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('actionsPage.action.input')}\n </Typography>\n {renderTable(\n formatRows(`${action.id}.input`, action?.schema?.input),\n )}\n {oneOf}\n </Box>\n )}\n {action.schema?.output && (\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('actionsPage.action.output')}\n </Typography>\n {renderTable(\n formatRows(`${action.id}.output`, action?.schema?.output),\n )}\n </Box>\n )}\n {action.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('actionsPage.action.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ExamplesTable examples={action.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Box>\n );\n });\n};\nexport const ActionsPage = () => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked: () => navigate(editorLink()),\n onActionsClicked: undefined,\n onTasksClicked: () => navigate(tasksLink()),\n onCreateClicked: () => navigate(createLink()),\n };\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('actionsPage.pageTitle')}\n title={t('actionsPage.title')}\n subtitle={t('actionsPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ActionPageContent />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ActionsPage.esm.js","sources":["../../../src/components/ActionsPage/ActionsPage.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { Fragment, useEffect, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n Action,\n ActionExample,\n scaffolderApiRef,\n} from '@backstage/plugin-scaffolder-react';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport Box from '@material-ui/core/Box';\nimport Collapse from '@material-ui/core/Collapse';\nimport Grid from '@material-ui/core/Grid';\nimport Paper from '@material-ui/core/Paper';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { JSONSchema7, JSONSchema7Definition } from 'json-schema';\nimport classNames from 'classnames';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport LinkIcon from '@material-ui/icons/Link';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport TextField from '@material-ui/core/TextField';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport SearchIcon from '@material-ui/icons/Search';\n\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n CodeSnippet,\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n MarkdownContent,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport Chip from '@material-ui/core/Chip';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport {\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n} from '../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nconst useStyles = makeStyles(theme => ({\n code: {\n fontFamily: 'Menlo, monospace',\n padding: theme.spacing(1),\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[700]\n : theme.palette.grey[300],\n display: 'inline-block',\n borderRadius: 5,\n border: `1px solid ${theme.palette.grey[500]}`,\n position: 'relative',\n },\n\n codeRequired: {\n '&::after': {\n position: 'absolute',\n content: '\"*\"',\n top: 0,\n right: theme.spacing(0.5),\n fontWeight: 'bolder',\n color: theme.palette.error.light,\n },\n },\n link: {\n paddingLeft: theme.spacing(1),\n },\n}));\n\nconst ExamplesTable = (props: { examples: ActionExample[] }) => {\n return (\n <Grid container>\n {props.examples.map((example, index) => {\n return (\n <Fragment key={`example-${index}`}>\n <Grid item lg={3}>\n <Box padding={4}>\n <Typography>{example.description}</Typography>\n </Box>\n </Grid>\n <Grid item lg={9}>\n <Box padding={1}>\n <CodeSnippet\n text={example.example}\n showLineNumbers\n showCopyCodeButton\n language=\"yaml\"\n />\n </Box>\n </Grid>\n </Fragment>\n );\n })}\n </Grid>\n );\n};\n\nexport const ActionPageContent = () => {\n const api = useApi(scaffolderApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const classes = useStyles();\n const {\n loading,\n value = [],\n error,\n } = useAsync(async () => {\n return api.listActions();\n }, [api]);\n\n const [selectedAction, setSelectedAction] = useState<Action | null>(null);\n const [isExpanded, setIsExpanded] = useState<{ [key: string]: boolean }>({});\n\n useEffect(() => {\n if (value.length && window.location.hash) {\n document.querySelector(window.location.hash)?.scrollIntoView();\n }\n }, [value]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n const renderTable = (rows?: JSX.Element[]) => {\n if (!rows || rows.length < 1) {\n return (\n <Typography>{t('actionsPage.content.noRowsDescription')}</Typography>\n );\n }\n return (\n <TableContainer component={Paper}>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{t('actionsPage.content.tableCell.name')}</TableCell>\n <TableCell>{t('actionsPage.content.tableCell.title')}</TableCell>\n <TableCell>\n {t('actionsPage.content.tableCell.description')}\n </TableCell>\n <TableCell>{t('actionsPage.content.tableCell.type')}</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>{rows}</TableBody>\n </Table>\n </TableContainer>\n );\n };\n\n const getTypes = (properties: JSONSchema7) => {\n if (!properties.type) {\n return ['unknown'];\n }\n\n if (properties.type !== 'array') {\n return [properties.type].flat();\n }\n\n return [\n `${properties.type}(${\n (properties.items as JSONSchema7 | undefined)?.type ?? 'unknown'\n })`,\n ];\n };\n\n const formatRows = (parentId: string, input?: JSONSchema7) => {\n const properties = input?.properties;\n if (!properties) {\n return undefined;\n }\n\n return Object.entries(properties).map(entry => {\n const [key] = entry;\n const id = `${parentId}.${key}`;\n const props = entry[1] as unknown as JSONSchema7;\n const codeClassname = classNames(classes.code, {\n [classes.codeRequired]: input.required?.includes(key),\n });\n const types = getTypes(props);\n\n return (\n <React.Fragment key={id}>\n <TableRow key={id}>\n <TableCell>\n <div className={codeClassname}>{key}</div>\n </TableCell>\n <TableCell>{props.title}</TableCell>\n <TableCell>{props.description}</TableCell>\n <TableCell>\n {types.map(type =>\n type.includes('object') ? (\n <Chip\n label={type}\n key={type}\n icon={\n isExpanded[id] ? <ExpandLessIcon /> : <ExpandMoreIcon />\n }\n variant=\"outlined\"\n onClick={() =>\n setIsExpanded(prevState => {\n const state = { ...prevState };\n state[id] = !prevState[id];\n return state;\n })\n }\n />\n ) : (\n <Chip label={type} key={type} variant=\"outlined\" />\n ),\n )}\n </TableCell>\n </TableRow>\n <TableRow>\n <TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={6}>\n <Collapse in={isExpanded[id]} timeout=\"auto\" unmountOnExit>\n <Box sx={{ margin: 1 }}>\n <Typography variant=\"h6\" component=\"div\">\n {key}\n </Typography>\n {renderTable(\n formatRows(\n id,\n props.type === 'array'\n ? ({\n properties:\n (props.items as JSONSchema7 | undefined)\n ?.properties ?? {},\n } as unknown as JSONSchema7 | undefined)\n : props,\n ),\n )}\n </Box>\n </Collapse>\n </TableCell>\n </TableRow>\n </React.Fragment>\n );\n });\n };\n\n const renderTables = (\n name: string,\n id: string,\n input?: JSONSchema7Definition[],\n ) => {\n if (!input) {\n return undefined;\n }\n\n return (\n <>\n <Typography variant=\"h6\" component=\"h4\">\n {name}\n </Typography>\n {input.map((i, index) => (\n <div key={index}>\n {renderTable(\n formatRows(`${id}.${index}`, i as unknown as JSONSchema7),\n )}\n </div>\n ))}\n </>\n );\n };\n\n return (\n <>\n <Box pb={3}>\n <Autocomplete\n id=\"actions-autocomplete\"\n options={value}\n loading={loading}\n getOptionLabel={option => option.id}\n renderInput={params => (\n <TextField\n {...params}\n aria-label={t('actionsPage.content.searchFieldPlaceholder')}\n placeholder={t('actionsPage.content.searchFieldPlaceholder')}\n variant=\"outlined\"\n InputProps={{\n ...params.InputProps,\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n }}\n />\n )}\n onChange={(_event, option) => {\n setSelectedAction(option);\n }}\n fullWidth\n />\n </Box>\n {(selectedAction ? [selectedAction] : value).map(action => {\n if (action.id.startsWith('legacy:')) {\n return undefined;\n }\n\n const oneOf = renderTables(\n 'oneOf',\n `${action.id}.input`,\n action.schema?.input?.oneOf,\n );\n return (\n <Box pb={3} key={action.id}>\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n id={action.id.replaceAll(':', '-')}\n variant=\"h5\"\n component=\"h2\"\n className={classes.code}\n >\n {action.id}\n </Typography>\n <Link\n className={classes.link}\n to={`#${action.id.replaceAll(':', '-')}`}\n >\n <LinkIcon />\n </Link>\n </Box>\n {action.description && (\n <MarkdownContent content={action.description} />\n )}\n {action.schema?.input && (\n <Box pb={2}>\n <Typography variant=\"h6\" component=\"h3\">\n {t('actionsPage.action.input')}\n </Typography>\n {renderTable(\n formatRows(`${action.id}.input`, action?.schema?.input),\n )}\n {oneOf}\n </Box>\n )}\n {action.schema?.output && (\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('actionsPage.action.output')}\n </Typography>\n {renderTable(\n formatRows(`${action.id}.output`, action?.schema?.output),\n )}\n </Box>\n )}\n {action.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h6\" component=\"h3\">\n {t('actionsPage.action.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ExamplesTable examples={action.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Box>\n );\n })}\n </>\n );\n};\nexport const ActionsPage = () => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked: () => navigate(editorLink()),\n onActionsClicked: undefined,\n onTasksClicked: () => navigate(tasksLink()),\n onCreateClicked: () => navigate(createLink()),\n };\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('actionsPage.pageTitle')}\n title={t('actionsPage.title')}\n subtitle={t('actionsPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ActionPageContent />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -18,18 +18,24 @@ import { scaffolderTranslationRef } from '../../translation.esm.js';
18
18
  const ListTaskPageContent = (props) => {
19
19
  const { initiallySelectedFilter = "owned" } = props;
20
20
  const { t } = useTranslationRef(scaffolderTranslationRef);
21
+ const [limit, setLimit] = useState(5);
22
+ const [page, setPage] = useState(0);
21
23
  const scaffolderApi = useApi(scaffolderApiRef);
22
24
  const rootLink = useRouteRef(rootRouteRef);
23
25
  const [ownerFilter, setOwnerFilter] = useState(initiallySelectedFilter);
24
26
  const { value, loading, error } = useAsync(() => {
25
27
  if (scaffolderApi.listTasks) {
26
- return scaffolderApi.listTasks?.({ filterByOwnership: ownerFilter });
28
+ return scaffolderApi.listTasks?.({
29
+ filterByOwnership: ownerFilter,
30
+ limit,
31
+ offset: page * limit
32
+ });
27
33
  }
28
34
  console.warn(
29
35
  "listTasks is not implemented in the scaffolderApi, please make sure to implement this method."
30
36
  );
31
- return Promise.resolve({ tasks: [] });
32
- }, [scaffolderApi, ownerFilter]);
37
+ return Promise.resolve({ tasks: [], totalTasks: 0 });
38
+ }, [scaffolderApi, ownerFilter, limit, page]);
33
39
  if (loading) {
34
40
  return /* @__PURE__ */ React.createElement(Progress, null);
35
41
  }
@@ -52,7 +58,15 @@ const ListTaskPageContent = (props) => {
52
58
  )), /* @__PURE__ */ React.createElement(CatalogFilterLayout.Content, null, /* @__PURE__ */ React.createElement(
53
59
  Table,
54
60
  {
61
+ onRowsPerPageChange: (pageSize) => {
62
+ setPage(0);
63
+ setLimit(pageSize);
64
+ },
65
+ onPageChange: (newPage) => setPage(newPage),
66
+ options: { pageSize: limit, emptyRowsWhenPaging: false },
55
67
  data: value?.tasks ?? [],
68
+ page,
69
+ totalCount: value?.totalTasks ?? 0,
56
70
  title: t("listTaskPage.content.tableTitle"),
57
71
  columns: [
58
72
  {
@@ -1 +1 @@
1
- {"version":3,"file":"ListTasksPage.esm.js","sources":["../../../src/components/ListTasksPage/ListTasksPage.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 {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n Page,\n Progress,\n Table,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { CatalogFilterLayout } from '@backstage/plugin-catalog-react';\nimport useAsync from 'react-use/esm/useAsync';\nimport React, { useState } from 'react';\nimport {\n ScaffolderTask,\n scaffolderApiRef,\n} from '@backstage/plugin-scaffolder-react';\nimport { OwnerListPicker } from './OwnerListPicker';\nimport {\n CreatedAtColumn,\n OwnerEntityColumn,\n TaskStatusColumn,\n TemplateTitleColumn,\n} from './columns';\nimport { actionsRouteRef, editRouteRef, rootRouteRef } from '../../routes';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nexport interface MyTaskPageProps {\n initiallySelectedFilter?: 'owned' | 'all';\n}\n\nconst ListTaskPageContent = (props: MyTaskPageProps) => {\n const { initiallySelectedFilter = 'owned' } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderApi = useApi(scaffolderApiRef);\n const rootLink = useRouteRef(rootRouteRef);\n\n const [ownerFilter, setOwnerFilter] = useState(initiallySelectedFilter);\n const { value, loading, error } = useAsync(() => {\n if (scaffolderApi.listTasks) {\n return scaffolderApi.listTasks?.({ filterByOwnership: ownerFilter });\n }\n\n // eslint-disable-next-line no-console\n console.warn(\n 'listTasks is not implemented in the scaffolderApi, please make sure to implement this method.',\n );\n\n return Promise.resolve({ tasks: [] });\n }, [scaffolderApi, ownerFilter]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('listTaskPage.content.emptyState.title')}\n description={t('listTaskPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n return (\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <OwnerListPicker\n filter={ownerFilter}\n onSelectOwner={id => setOwnerFilter(id)}\n />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <Table<ScaffolderTask>\n data={value?.tasks ?? []}\n title={t('listTaskPage.content.tableTitle')}\n columns={[\n {\n title: t('listTaskPage.content.tableCell.taskID'),\n field: 'id',\n render: row => (\n <Link to={`${rootLink()}/tasks/${row.id}`}>{row.id}</Link>\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.template'),\n field: 'spec.templateInfo.entity.metadata.title',\n render: row => (\n <TemplateTitleColumn\n entityRef={row.spec.templateInfo?.entityRef}\n />\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.created'),\n field: 'createdAt',\n render: row => <CreatedAtColumn createdAt={row.createdAt} />,\n },\n {\n title: t('listTaskPage.content.tableCell.owner'),\n field: 'createdBy',\n render: row => (\n <OwnerEntityColumn entityRef={row.spec?.user?.ref} />\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.status'),\n field: 'status',\n render: row => <TaskStatusColumn status={row.status} />,\n },\n ]}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n );\n};\n\nexport const ListTasksPage = (props: MyTaskPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const actionsLink = useRouteRef(actionsRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked: () => navigate(editorLink()),\n onActionsClicked: () => navigate(actionsLink()),\n onTasksClicked: undefined,\n onCreateClicked: () => navigate(createLink()),\n };\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('listTaskPage.pageTitle')}\n title={t('listTaskPage.title')}\n subtitle={t('listTaskPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ListTaskPageContent {...props} />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ListTasksPage.esm.js","sources":["../../../src/components/ListTasksPage/ListTasksPage.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 {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n Page,\n Progress,\n Table,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { CatalogFilterLayout } from '@backstage/plugin-catalog-react';\nimport useAsync from 'react-use/esm/useAsync';\nimport React, { useState } from 'react';\nimport {\n scaffolderApiRef,\n ScaffolderTask,\n} from '@backstage/plugin-scaffolder-react';\nimport { OwnerListPicker } from './OwnerListPicker';\nimport {\n CreatedAtColumn,\n OwnerEntityColumn,\n TaskStatusColumn,\n TemplateTitleColumn,\n} from './columns';\nimport { actionsRouteRef, editRouteRef, rootRouteRef } from '../../routes';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nexport interface MyTaskPageProps {\n initiallySelectedFilter?: 'owned' | 'all';\n}\n\nconst ListTaskPageContent = (props: MyTaskPageProps) => {\n const { initiallySelectedFilter = 'owned' } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const [limit, setLimit] = useState(5);\n const [page, setPage] = useState(0);\n\n const scaffolderApi = useApi(scaffolderApiRef);\n const rootLink = useRouteRef(rootRouteRef);\n\n const [ownerFilter, setOwnerFilter] = useState(initiallySelectedFilter);\n const { value, loading, error } = useAsync(() => {\n if (scaffolderApi.listTasks) {\n return scaffolderApi.listTasks?.({\n filterByOwnership: ownerFilter,\n limit,\n offset: page * limit,\n });\n }\n\n // eslint-disable-next-line no-console\n console.warn(\n 'listTasks is not implemented in the scaffolderApi, please make sure to implement this method.',\n );\n\n return Promise.resolve({ tasks: [], totalTasks: 0 });\n }, [scaffolderApi, ownerFilter, limit, page]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('listTaskPage.content.emptyState.title')}\n description={t('listTaskPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n return (\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <OwnerListPicker\n filter={ownerFilter}\n onSelectOwner={id => setOwnerFilter(id)}\n />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <Table<ScaffolderTask>\n onRowsPerPageChange={pageSize => {\n setPage(0);\n setLimit(pageSize);\n }}\n onPageChange={newPage => setPage(newPage)}\n options={{ pageSize: limit, emptyRowsWhenPaging: false }}\n data={value?.tasks ?? []}\n page={page}\n totalCount={value?.totalTasks ?? 0}\n title={t('listTaskPage.content.tableTitle')}\n columns={[\n {\n title: t('listTaskPage.content.tableCell.taskID'),\n field: 'id',\n render: row => (\n <Link to={`${rootLink()}/tasks/${row.id}`}>{row.id}</Link>\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.template'),\n field: 'spec.templateInfo.entity.metadata.title',\n render: row => (\n <TemplateTitleColumn\n entityRef={row.spec.templateInfo?.entityRef}\n />\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.created'),\n field: 'createdAt',\n render: row => <CreatedAtColumn createdAt={row.createdAt} />,\n },\n {\n title: t('listTaskPage.content.tableCell.owner'),\n field: 'createdBy',\n render: row => (\n <OwnerEntityColumn entityRef={row.spec?.user?.ref} />\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.status'),\n field: 'status',\n render: row => <TaskStatusColumn status={row.status} />,\n },\n ]}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n );\n};\n\nexport const ListTasksPage = (props: MyTaskPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const actionsLink = useRouteRef(actionsRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked: () => navigate(editorLink()),\n onActionsClicked: () => navigate(actionsLink()),\n onTasksClicked: undefined,\n onCreateClicked: () => navigate(createLink()),\n };\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('listTaskPage.pageTitle')}\n title={t('listTaskPage.title')}\n subtitle={t('listTaskPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ListTaskPageContent {...props} />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAkDA,MAAM,mBAAA,GAAsB,CAAC,KAA2B,KAAA;AACtD,EAAM,MAAA,EAAE,uBAA0B,GAAA,OAAA,EAAY,GAAA,KAAA,CAAA;AAC9C,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA,CAAA;AACxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,CAAC,CAAA,CAAA;AACpC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,CAAC,CAAA,CAAA;AAElC,EAAM,MAAA,aAAA,GAAgB,OAAO,gBAAgB,CAAA,CAAA;AAC7C,EAAM,MAAA,QAAA,GAAW,YAAY,YAAY,CAAA,CAAA;AAEzC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,uBAAuB,CAAA,CAAA;AACtE,EAAA,MAAM,EAAE,KAAO,EAAA,OAAA,EAAS,KAAM,EAAA,GAAI,SAAS,MAAM;AAC/C,IAAA,IAAI,cAAc,SAAW,EAAA;AAC3B,MAAA,OAAO,cAAc,SAAY,GAAA;AAAA,QAC/B,iBAAmB,EAAA,WAAA;AAAA,QACnB,KAAA;AAAA,QACA,QAAQ,IAAO,GAAA,KAAA;AAAA,OAChB,CAAA,CAAA;AAAA,KACH;AAGA,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,+FAAA;AAAA,KACF,CAAA;AAEA,IAAO,OAAA,OAAA,CAAQ,QAAQ,EAAE,KAAA,EAAO,EAAI,EAAA,UAAA,EAAY,GAAG,CAAA,CAAA;AAAA,KAClD,CAAC,aAAA,EAAe,WAAa,EAAA,KAAA,EAAO,IAAI,CAAC,CAAA,CAAA;AAE5C,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2CAAQ,QAAS,EAAA,IAAA,CAAA,CAAA;AAAA,GACnB;AAEA,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,uBAEI,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAc,CAC1B,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,MAAA;AAAA,QACR,KAAA,EAAO,EAAE,uCAAuC,CAAA;AAAA,QAChD,WAAA,EAAa,EAAE,6CAA6C,CAAA;AAAA,OAAA;AAAA,KAEhE,CAAA,CAAA;AAAA,GAEJ;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,mBAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,mBAAA,CAAoB,SAApB,IACC,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,MAAQ,EAAA,WAAA;AAAA,MACR,aAAA,EAAe,CAAM,EAAA,KAAA,cAAA,CAAe,EAAE,CAAA;AAAA,KAAA;AAAA,GAE1C,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,mBAAA,CAAoB,SAApB,IACC,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,qBAAqB,CAAY,QAAA,KAAA;AAC/B,QAAA,OAAA,CAAQ,CAAC,CAAA,CAAA;AACT,QAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AAAA,OACnB;AAAA,MACA,YAAA,EAAc,CAAW,OAAA,KAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,MACxC,OAAS,EAAA,EAAE,QAAU,EAAA,KAAA,EAAO,qBAAqB,KAAM,EAAA;AAAA,MACvD,IAAA,EAAM,KAAO,EAAA,KAAA,IAAS,EAAC;AAAA,MACvB,IAAA;AAAA,MACA,UAAA,EAAY,OAAO,UAAc,IAAA,CAAA;AAAA,MACjC,KAAA,EAAO,EAAE,iCAAiC,CAAA;AAAA,MAC1C,OAAS,EAAA;AAAA,QACP;AAAA,UACE,KAAA,EAAO,EAAE,uCAAuC,CAAA;AAAA,UAChD,KAAO,EAAA,IAAA;AAAA,UACP,MAAQ,EAAA,CAAA,GAAA,qBACL,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,EAAI,EAAA,CAAA,EAAG,QAAS,EAAC,CAAU,OAAA,EAAA,GAAA,CAAI,EAAE,CAAA,CAAA,EAAA,EAAK,IAAI,EAAG,CAAA;AAAA,SAEvD;AAAA,QACA;AAAA,UACE,KAAA,EAAO,EAAE,yCAAyC,CAAA;AAAA,UAClD,KAAO,EAAA,yCAAA;AAAA,UACP,QAAQ,CACN,GAAA,qBAAA,KAAA,CAAA,aAAA;AAAA,YAAC,mBAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,GAAI,CAAA,IAAA,CAAK,YAAc,EAAA,SAAA;AAAA,aAAA;AAAA,WACpC;AAAA,SAEJ;AAAA,QACA;AAAA,UACE,KAAA,EAAO,EAAE,wCAAwC,CAAA;AAAA,UACjD,KAAO,EAAA,WAAA;AAAA,UACP,QAAQ,CAAO,GAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,eAAgB,EAAA,EAAA,SAAA,EAAW,IAAI,SAAW,EAAA,CAAA;AAAA,SAC5D;AAAA,QACA;AAAA,UACE,KAAA,EAAO,EAAE,sCAAsC,CAAA;AAAA,UAC/C,KAAO,EAAA,WAAA;AAAA,UACP,MAAA,EAAQ,yBACL,KAAA,CAAA,aAAA,CAAA,iBAAA,EAAA,EAAkB,WAAW,GAAI,CAAA,IAAA,EAAM,MAAM,GAAK,EAAA,CAAA;AAAA,SAEvD;AAAA,QACA;AAAA,UACE,KAAA,EAAO,EAAE,uCAAuC,CAAA;AAAA,UAChD,KAAO,EAAA,QAAA;AAAA,UACP,QAAQ,CAAO,GAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,gBAAiB,EAAA,EAAA,MAAA,EAAQ,IAAI,MAAQ,EAAA,CAAA;AAAA,SACvD;AAAA,OACF;AAAA,KAAA;AAAA,GAEJ,CACF,CAAA,CAAA;AAEJ,CAAA,CAAA;AAEa,MAAA,aAAA,GAAgB,CAAC,KAA2B,KAAA;AACvD,EAAA,MAAM,WAAW,WAAY,EAAA,CAAA;AAC7B,EAAM,MAAA,UAAA,GAAa,YAAY,YAAY,CAAA,CAAA;AAC3C,EAAM,MAAA,WAAA,GAAc,YAAY,eAAe,CAAA,CAAA;AAC/C,EAAM,MAAA,UAAA,GAAa,YAAY,YAAY,CAAA,CAAA;AAC3C,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA,CAAA;AAExD,EAAA,MAAM,8BAAiC,GAAA;AAAA,IACrC,eAAiB,EAAA,MAAM,QAAS,CAAA,UAAA,EAAY,CAAA;AAAA,IAC5C,gBAAkB,EAAA,MAAM,QAAS,CAAA,WAAA,EAAa,CAAA;AAAA,IAC9C,cAAgB,EAAA,KAAA,CAAA;AAAA,IAChB,eAAiB,EAAA,MAAM,QAAS,CAAA,UAAA,EAAY,CAAA;AAAA,GAC9C,CAAA;AACA,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,MACZ,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,iBAAA,EAAmB,EAAE,wBAAwB,CAAA;AAAA,MAC7C,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,MAC7B,QAAA,EAAU,EAAE,uBAAuB,CAAA;AAAA,KAAA;AAAA,oBAEnC,KAAA,CAAA,aAAA,CAAC,yBAA2B,EAAA,EAAA,GAAG,8BAAgC,EAAA,CAAA;AAAA,GACjE,sCACC,OACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,uBAAqB,GAAG,KAAA,EAAO,CAClC,CACF,CAAA,CAAA;AAEJ;;;;"}
@@ -9,9 +9,9 @@ import { ListTasksPage } from '../ListTasksPage/ListTasksPage.esm.js';
9
9
  import { TemplateListPage } from '../../alpha/components/TemplateListPage/TemplateListPage.esm.js';
10
10
  import { TemplateWizardPage } from '../../alpha/components/TemplateWizardPage/TemplateWizardPage.esm.js';
11
11
  import { OngoingTask } from '../OngoingTask/OngoingTask.esm.js';
12
- import { TemplatePage } from '../../alpha/components/TemplateEditorPage/TemplatePage.esm.js';
13
- import { TemplateFormPage } from '../../alpha/components/TemplateEditorPage/TemplateFormPage.esm.js';
14
12
  import { TemplateEditorPage } from '../../alpha/components/TemplateEditorPage/TemplateEditorPage.esm.js';
13
+ import { TemplateFormPage } from '../../alpha/components/TemplateEditorPage/TemplateFormPage.esm.js';
14
+ import { TemplateIntroPage } from '../../alpha/components/TemplateEditorPage/TemplateIntroPage.esm.js';
15
15
  import { CustomFieldsPage } from '../../alpha/components/TemplateEditorPage/CustomFieldsPage.esm.js';
16
16
 
17
17
  const Router = (props) => {
@@ -81,7 +81,7 @@ const Router = (props) => {
81
81
  Route,
82
82
  {
83
83
  path: editRouteRef.path,
84
- element: /* @__PURE__ */ React.createElement(SecretsContextProvider, null, /* @__PURE__ */ React.createElement(TemplateEditorPage, null))
84
+ element: /* @__PURE__ */ React.createElement(SecretsContextProvider, null, /* @__PURE__ */ React.createElement(TemplateIntroPage, null))
85
85
  }
86
86
  ), /* @__PURE__ */ React.createElement(
87
87
  Route,
@@ -113,7 +113,7 @@ const Router = (props) => {
113
113
  {
114
114
  path: editorRouteRef.path,
115
115
  element: /* @__PURE__ */ React.createElement(SecretsContextProvider, null, /* @__PURE__ */ React.createElement(
116
- TemplatePage,
116
+ TemplateEditorPage,
117
117
  {
118
118
  layouts: customLayouts,
119
119
  formProps: props.formProps,
@@ -1 +1 @@
1
- {"version":3,"file":"Router.esm.js","sources":["../../../src/components/Router/Router.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 React, { PropsWithChildren } from 'react';\nimport { Routes, Route, useOutlet } from 'react-router-dom';\n\nimport {\n FieldExtensionOptions,\n FormProps,\n ReviewStepProps,\n TemplateGroupFilter,\n} from '@backstage/plugin-scaffolder-react';\nimport {\n ScaffolderTaskOutput,\n SecretsContextProvider,\n useCustomFieldExtensions,\n useCustomLayouts,\n} from '@backstage/plugin-scaffolder-react';\n\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default';\n\nimport {\n actionsRouteRef,\n editorRouteRef,\n customFieldsRouteRef,\n editRouteRef,\n scaffolderListTaskRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n templateFormRouteRef,\n} from '../../routes';\nimport { ErrorPage } from '@backstage/core-components';\n\nimport { ActionsPage } from '../../components/ActionsPage';\nimport { ListTasksPage } from '../../components/ListTasksPage';\n\nimport {\n TemplateListPageProps,\n TemplateWizardPageProps,\n} from '@backstage/plugin-scaffolder/alpha';\nimport { TemplateListPage, TemplateWizardPage } from '../../alpha/components';\nimport { OngoingTask } from '../OngoingTask';\nimport {\n TemplatePage,\n TemplateFormPage,\n TemplateEditorPage,\n CustomFieldsPage,\n} from '../../alpha/components/TemplateEditorPage';\n\n/**\n * The Props for the Scaffolder Router\n *\n * @public\n */\nexport type RouterProps = {\n components?: {\n ReviewStepComponent?: React.ComponentType<ReviewStepProps>;\n TemplateCardComponent?: React.ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n TaskPageComponent?: React.ComponentType<PropsWithChildren<{}>>;\n EXPERIMENTAL_TemplateOutputsComponent?: React.ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n EXPERIMENTAL_TemplateListPageComponent?: React.ComponentType<TemplateListPageProps>;\n EXPERIMENTAL_TemplateWizardPageComponent?: React.ComponentType<TemplateWizardPageProps>;\n };\n groups?: TemplateGroupFilter[];\n templateFilter?: (entity: TemplateEntityV1beta3) => boolean;\n headerOptions?: {\n pageTitleOverride?: string;\n title?: string;\n subtitle?: string;\n };\n defaultPreviewTemplate?: string;\n formProps?: FormProps;\n contextMenu?: {\n /** Whether to show a link to the template editor */\n editor?: boolean;\n /** Whether to show a link to the actions documentation */\n actions?: boolean;\n /** Whether to show a link to the tasks page */\n tasks?: boolean;\n };\n};\n\n/**\n * The Scaffolder Router\n *\n * @public\n */\nexport const Router = (props: PropsWithChildren<RouterProps>) => {\n const {\n components: {\n TemplateCardComponent,\n TaskPageComponent = OngoingTask,\n ReviewStepComponent,\n EXPERIMENTAL_TemplateOutputsComponent: TemplateOutputsComponent,\n EXPERIMENTAL_TemplateListPageComponent:\n TemplateListPageComponent = TemplateListPage,\n EXPERIMENTAL_TemplateWizardPageComponent:\n TemplateWizardPageComponent = TemplateWizardPage,\n } = {},\n } = props;\n const outlet = useOutlet() || props.children;\n const customFieldExtensions =\n useCustomFieldExtensions<FieldExtensionOptions>(outlet);\n\n const fieldExtensions = [\n ...customFieldExtensions,\n ...DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter(\n ({ name }) =>\n !customFieldExtensions.some(\n customFieldExtension => customFieldExtension.name === name,\n ),\n ),\n ] as FieldExtensionOptions[];\n\n const customLayouts = useCustomLayouts(outlet);\n\n return (\n <Routes>\n <Route\n path=\"/\"\n element={\n <TemplateListPageComponent\n TemplateCardComponent={TemplateCardComponent}\n contextMenu={props.contextMenu}\n groups={props.groups}\n templateFilter={props.templateFilter}\n headerOptions={props.headerOptions}\n />\n }\n />\n <Route\n path={selectedTemplateRouteRef.path}\n element={\n <SecretsContextProvider>\n <TemplateWizardPageComponent\n headerOptions={props.headerOptions}\n customFieldExtensions={fieldExtensions}\n layouts={customLayouts}\n components={{ ReviewStepComponent }}\n formProps={props.formProps}\n />\n </SecretsContextProvider>\n }\n />\n <Route\n path={scaffolderTaskRouteRef.path}\n element={\n <TaskPageComponent\n TemplateOutputsComponent={TemplateOutputsComponent}\n />\n }\n />\n <Route\n path={editRouteRef.path}\n element={\n <SecretsContextProvider>\n <TemplateEditorPage />\n </SecretsContextProvider>\n }\n />\n <Route\n path={customFieldsRouteRef.path}\n element={\n <SecretsContextProvider>\n <CustomFieldsPage fieldExtensions={fieldExtensions} />\n </SecretsContextProvider>\n }\n />\n <Route\n path={templateFormRouteRef.path}\n element={\n <SecretsContextProvider>\n <TemplateFormPage\n layouts={customLayouts}\n formProps={props.formProps}\n fieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n }\n />\n\n <Route path={actionsRouteRef.path} element={<ActionsPage />} />\n <Route\n path={scaffolderListTaskRouteRef.path}\n element={<ListTasksPage />}\n />\n <Route\n path={editorRouteRef.path}\n element={\n <SecretsContextProvider>\n <TemplatePage\n layouts={customLayouts}\n formProps={props.formProps}\n fieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n }\n />\n <Route\n path=\"*\"\n element={<ErrorPage status=\"404\" statusMessage=\"Page not found\" />}\n />\n </Routes>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Router.esm.js","sources":["../../../src/components/Router/Router.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 React, { PropsWithChildren } from 'react';\nimport { Routes, Route, useOutlet } from 'react-router-dom';\n\nimport {\n FieldExtensionOptions,\n FormProps,\n ReviewStepProps,\n TemplateGroupFilter,\n} from '@backstage/plugin-scaffolder-react';\nimport {\n ScaffolderTaskOutput,\n SecretsContextProvider,\n useCustomFieldExtensions,\n useCustomLayouts,\n} from '@backstage/plugin-scaffolder-react';\n\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default';\n\nimport {\n actionsRouteRef,\n editorRouteRef,\n customFieldsRouteRef,\n editRouteRef,\n scaffolderListTaskRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n templateFormRouteRef,\n} from '../../routes';\nimport { ErrorPage } from '@backstage/core-components';\n\nimport { ActionsPage } from '../../components/ActionsPage';\nimport { ListTasksPage } from '../../components/ListTasksPage';\n\nimport {\n TemplateListPageProps,\n TemplateWizardPageProps,\n} from '@backstage/plugin-scaffolder/alpha';\nimport { TemplateListPage, TemplateWizardPage } from '../../alpha/components';\nimport { OngoingTask } from '../OngoingTask';\nimport {\n TemplateFormPage,\n TemplateIntroPage,\n TemplateEditorPage,\n CustomFieldsPage,\n} from '../../alpha/components/TemplateEditorPage';\n\n/**\n * The Props for the Scaffolder Router\n *\n * @public\n */\nexport type RouterProps = {\n components?: {\n ReviewStepComponent?: React.ComponentType<ReviewStepProps>;\n TemplateCardComponent?: React.ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n TaskPageComponent?: React.ComponentType<PropsWithChildren<{}>>;\n EXPERIMENTAL_TemplateOutputsComponent?: React.ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n EXPERIMENTAL_TemplateListPageComponent?: React.ComponentType<TemplateListPageProps>;\n EXPERIMENTAL_TemplateWizardPageComponent?: React.ComponentType<TemplateWizardPageProps>;\n };\n groups?: TemplateGroupFilter[];\n templateFilter?: (entity: TemplateEntityV1beta3) => boolean;\n headerOptions?: {\n pageTitleOverride?: string;\n title?: string;\n subtitle?: string;\n };\n defaultPreviewTemplate?: string;\n formProps?: FormProps;\n contextMenu?: {\n /** Whether to show a link to the template editor */\n editor?: boolean;\n /** Whether to show a link to the actions documentation */\n actions?: boolean;\n /** Whether to show a link to the tasks page */\n tasks?: boolean;\n };\n};\n\n/**\n * The Scaffolder Router\n *\n * @public\n */\nexport const Router = (props: PropsWithChildren<RouterProps>) => {\n const {\n components: {\n TemplateCardComponent,\n TaskPageComponent = OngoingTask,\n ReviewStepComponent,\n EXPERIMENTAL_TemplateOutputsComponent: TemplateOutputsComponent,\n EXPERIMENTAL_TemplateListPageComponent:\n TemplateListPageComponent = TemplateListPage,\n EXPERIMENTAL_TemplateWizardPageComponent:\n TemplateWizardPageComponent = TemplateWizardPage,\n } = {},\n } = props;\n const outlet = useOutlet() || props.children;\n const customFieldExtensions =\n useCustomFieldExtensions<FieldExtensionOptions>(outlet);\n\n const fieldExtensions = [\n ...customFieldExtensions,\n ...DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter(\n ({ name }) =>\n !customFieldExtensions.some(\n customFieldExtension => customFieldExtension.name === name,\n ),\n ),\n ] as FieldExtensionOptions[];\n\n const customLayouts = useCustomLayouts(outlet);\n\n return (\n <Routes>\n <Route\n path=\"/\"\n element={\n <TemplateListPageComponent\n TemplateCardComponent={TemplateCardComponent}\n contextMenu={props.contextMenu}\n groups={props.groups}\n templateFilter={props.templateFilter}\n headerOptions={props.headerOptions}\n />\n }\n />\n <Route\n path={selectedTemplateRouteRef.path}\n element={\n <SecretsContextProvider>\n <TemplateWizardPageComponent\n headerOptions={props.headerOptions}\n customFieldExtensions={fieldExtensions}\n layouts={customLayouts}\n components={{ ReviewStepComponent }}\n formProps={props.formProps}\n />\n </SecretsContextProvider>\n }\n />\n <Route\n path={scaffolderTaskRouteRef.path}\n element={\n <TaskPageComponent\n TemplateOutputsComponent={TemplateOutputsComponent}\n />\n }\n />\n <Route\n path={editRouteRef.path}\n element={\n <SecretsContextProvider>\n <TemplateIntroPage />\n </SecretsContextProvider>\n }\n />\n <Route\n path={customFieldsRouteRef.path}\n element={\n <SecretsContextProvider>\n <CustomFieldsPage fieldExtensions={fieldExtensions} />\n </SecretsContextProvider>\n }\n />\n <Route\n path={templateFormRouteRef.path}\n element={\n <SecretsContextProvider>\n <TemplateFormPage\n layouts={customLayouts}\n formProps={props.formProps}\n fieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n }\n />\n\n <Route path={actionsRouteRef.path} element={<ActionsPage />} />\n <Route\n path={scaffolderListTaskRouteRef.path}\n element={<ListTasksPage />}\n />\n <Route\n path={editorRouteRef.path}\n element={\n <SecretsContextProvider>\n <TemplateEditorPage\n layouts={customLayouts}\n formProps={props.formProps}\n fieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n }\n />\n <Route\n path=\"*\"\n element={<ErrorPage status=\"404\" statusMessage=\"Page not found\" />}\n />\n </Routes>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -114,7 +114,7 @@ const EntityPicker = (props) => {
114
114
  options: entities?.catalogEntities || [],
115
115
  getOptionLabel: (option) => (
116
116
  // option can be a string due to freeSolo.
117
- typeof option === "string" ? option : entities?.entityRefToPresentation.get(stringifyEntityRef(option))?.entityRef
117
+ typeof option === "string" ? option : entities?.entityRefToPresentation.get(stringifyEntityRef(option))?.primaryTitle
118
118
  ),
119
119
  autoSelect: true,
120
120
  freeSolo: allowArbitraryValues,
@@ -1 +1 @@
1
- {"version":3,"file":"EntityPicker.esm.js","sources":["../../../../src/components/fields/EntityPicker/EntityPicker.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 {\n type EntityFilterQuery,\n CATALOG_FILTER_EXISTS,\n} from '@backstage/catalog-client';\nimport {\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n EntityDisplayName,\n EntityRefPresentationSnapshot,\n catalogApiRef,\n entityPresentationApiRef,\n} from '@backstage/plugin-catalog-react';\nimport TextField from '@material-ui/core/TextField';\nimport FormControl from '@material-ui/core/FormControl';\nimport Autocomplete, {\n AutocompleteChangeReason,\n createFilterOptions,\n} from '@material-ui/lab/Autocomplete';\nimport React, { useCallback, useEffect } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n EntityPickerFilterQueryValue,\n EntityPickerProps,\n EntityPickerUiOptions,\n EntityPickerFilterQuery,\n} from './schema';\nimport { VirtualizedListbox } from '../VirtualizedListbox';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nexport { EntityPickerSchema } from './schema';\n\n/**\n * The underlying component that is rendered in the form for the `EntityPicker`\n * field extension.\n *\n * @public\n */\nexport const EntityPicker = (props: EntityPickerProps) => {\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const {\n onChange,\n schema: {\n title = t('fields.entityPicker.title'),\n description = t('fields.entityPicker.description'),\n },\n required,\n uiSchema,\n rawErrors,\n formData,\n idSchema,\n } = props;\n const catalogFilter = buildCatalogFilter(uiSchema);\n const defaultKind = uiSchema['ui:options']?.defaultKind;\n const defaultNamespace =\n uiSchema['ui:options']?.defaultNamespace || undefined;\n\n const catalogApi = useApi(catalogApiRef);\n const entityPresentationApi = useApi(entityPresentationApiRef);\n\n const { value: entities, loading } = useAsync(async () => {\n const fields = [\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n 'kind',\n ];\n const { items } = await catalogApi.getEntities(\n catalogFilter\n ? { filter: catalogFilter, fields }\n : { filter: undefined, fields },\n );\n\n const entityRefToPresentation = new Map<\n string,\n EntityRefPresentationSnapshot\n >(\n await Promise.all(\n items.map(async item => {\n const presentation = await entityPresentationApi.forEntity(item)\n .promise;\n return [stringifyEntityRef(item), presentation] as [\n string,\n EntityRefPresentationSnapshot,\n ];\n }),\n ),\n );\n\n return { catalogEntities: items, entityRefToPresentation };\n });\n\n const allowArbitraryValues =\n uiSchema['ui:options']?.allowArbitraryValues ?? true;\n\n const getLabel = useCallback(\n (freeSoloValue: string) => {\n try {\n // Will throw if defaultKind or defaultNamespace are not set\n const parsedRef = parseEntityRef(freeSoloValue, {\n defaultKind,\n defaultNamespace,\n });\n\n return stringifyEntityRef(parsedRef);\n } catch (err) {\n return freeSoloValue;\n }\n },\n [defaultKind, defaultNamespace],\n );\n\n const onSelect = useCallback(\n (_: any, ref: string | Entity | null, reason: AutocompleteChangeReason) => {\n // ref can either be a string from free solo entry or\n if (typeof ref !== 'string') {\n // if ref does not exist: pass 'undefined' to trigger validation for required value\n onChange(ref ? stringifyEntityRef(ref as Entity) : undefined);\n } else {\n if (reason === 'blur' || reason === 'create-option') {\n // Add in default namespace, etc.\n let entityRef = ref;\n try {\n // Attempt to parse the entity ref into it's full form.\n entityRef = stringifyEntityRef(\n parseEntityRef(ref as string, {\n defaultKind,\n defaultNamespace,\n }),\n );\n } catch (err) {\n // If the passed in value isn't an entity ref, do nothing.\n }\n // We need to check against formData here as that's the previous value for this field.\n if (formData !== ref || allowArbitraryValues) {\n onChange(entityRef);\n }\n }\n }\n },\n [onChange, formData, defaultKind, defaultNamespace, allowArbitraryValues],\n );\n\n // Since free solo can be enabled, attempt to parse as a full entity ref first, then fall\n // back to the given value.\n const selectedEntity =\n entities?.catalogEntities.find(e => stringifyEntityRef(e) === formData) ??\n (allowArbitraryValues && formData ? getLabel(formData) : '');\n\n useEffect(() => {\n if (entities?.catalogEntities.length === 1 && selectedEntity === '') {\n onChange(stringifyEntityRef(entities.catalogEntities[0]));\n }\n }, [entities, onChange, selectedEntity]);\n\n return (\n <FormControl\n margin=\"normal\"\n required={required}\n error={rawErrors?.length > 0 && !formData}\n >\n <Autocomplete\n disabled={entities?.catalogEntities.length === 1}\n id={idSchema?.$id}\n value={selectedEntity}\n loading={loading}\n onChange={onSelect}\n options={entities?.catalogEntities || []}\n getOptionLabel={option =>\n // option can be a string due to freeSolo.\n typeof option === 'string'\n ? option\n : entities?.entityRefToPresentation.get(stringifyEntityRef(option))\n ?.entityRef!\n }\n autoSelect\n freeSolo={allowArbitraryValues}\n renderInput={params => (\n <TextField\n {...params}\n label={title}\n margin=\"dense\"\n helperText={description}\n FormHelperTextProps={{ margin: 'dense', style: { marginLeft: 0 } }}\n variant=\"outlined\"\n required={required}\n InputProps={params.InputProps}\n />\n )}\n renderOption={option => <EntityDisplayName entityRef={option} />}\n filterOptions={createFilterOptions<Entity>({\n stringify: option =>\n entities?.entityRefToPresentation.get(stringifyEntityRef(option))\n ?.primaryTitle!,\n })}\n ListboxComponent={VirtualizedListbox}\n />\n </FormControl>\n );\n};\n\n/**\n * Converts a especial `{exists: true}` value to the `CATALOG_FILTER_EXISTS` symbol.\n *\n * @param value - The value to convert.\n * @returns The converted value.\n */\nfunction convertOpsValues(\n value: Exclude<EntityPickerFilterQueryValue, Array<any>>,\n): string | symbol {\n if (typeof value === 'object' && value.exists) {\n return CATALOG_FILTER_EXISTS;\n }\n return value?.toString();\n}\n\n/**\n * Converts schema filters to entity filter query, replacing `{exists:true}` values\n * with the constant `CATALOG_FILTER_EXISTS`.\n *\n * @param schemaFilters - An object containing schema filters with keys as filter names\n * and values as filter values.\n * @returns An object with the same keys as the input object, but with `{exists:true}` values\n * transformed to `CATALOG_FILTER_EXISTS` symbol.\n */\nfunction convertSchemaFiltersToQuery(\n schemaFilters: EntityPickerFilterQuery,\n): Exclude<EntityFilterQuery, Array<any>> {\n const query: EntityFilterQuery = {};\n\n for (const [key, value] of Object.entries(schemaFilters)) {\n if (Array.isArray(value)) {\n query[key] = value;\n } else {\n query[key] = convertOpsValues(value);\n }\n }\n\n return query;\n}\n\n/**\n * Builds an `EntityFilterQuery` based on the `uiSchema` passed in.\n * If `catalogFilter` is specified in the `uiSchema`, it is converted to a `EntityFilterQuery`.\n * If `allowedKinds` is specified in the `uiSchema` will support the legacy `allowedKinds` option.\n *\n * @param uiSchema The `uiSchema` of an `EntityPicker` component.\n * @returns An `EntityFilterQuery` based on the `uiSchema`, or `undefined` if `catalogFilter` is not specified in the `uiSchema`.\n */\nfunction buildCatalogFilter(\n uiSchema: EntityPickerProps['uiSchema'],\n): EntityFilterQuery | undefined {\n const allowedKinds = uiSchema['ui:options']?.allowedKinds;\n\n const catalogFilter: EntityPickerUiOptions['catalogFilter'] | undefined =\n uiSchema['ui:options']?.catalogFilter ||\n (allowedKinds && { kind: allowedKinds });\n\n if (!catalogFilter) {\n return undefined;\n }\n\n if (Array.isArray(catalogFilter)) {\n return catalogFilter.map(convertSchemaFiltersToQuery);\n }\n\n return convertSchemaFiltersToQuery(catalogFilter);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EntityPicker.esm.js","sources":["../../../../src/components/fields/EntityPicker/EntityPicker.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 {\n type EntityFilterQuery,\n CATALOG_FILTER_EXISTS,\n} from '@backstage/catalog-client';\nimport {\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n EntityDisplayName,\n EntityRefPresentationSnapshot,\n catalogApiRef,\n entityPresentationApiRef,\n} from '@backstage/plugin-catalog-react';\nimport TextField from '@material-ui/core/TextField';\nimport FormControl from '@material-ui/core/FormControl';\nimport Autocomplete, {\n AutocompleteChangeReason,\n createFilterOptions,\n} from '@material-ui/lab/Autocomplete';\nimport React, { useCallback, useEffect } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n EntityPickerFilterQueryValue,\n EntityPickerProps,\n EntityPickerUiOptions,\n EntityPickerFilterQuery,\n} from './schema';\nimport { VirtualizedListbox } from '../VirtualizedListbox';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nexport { EntityPickerSchema } from './schema';\n\n/**\n * The underlying component that is rendered in the form for the `EntityPicker`\n * field extension.\n *\n * @public\n */\nexport const EntityPicker = (props: EntityPickerProps) => {\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const {\n onChange,\n schema: {\n title = t('fields.entityPicker.title'),\n description = t('fields.entityPicker.description'),\n },\n required,\n uiSchema,\n rawErrors,\n formData,\n idSchema,\n } = props;\n const catalogFilter = buildCatalogFilter(uiSchema);\n const defaultKind = uiSchema['ui:options']?.defaultKind;\n const defaultNamespace =\n uiSchema['ui:options']?.defaultNamespace || undefined;\n\n const catalogApi = useApi(catalogApiRef);\n const entityPresentationApi = useApi(entityPresentationApiRef);\n\n const { value: entities, loading } = useAsync(async () => {\n const fields = [\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n 'kind',\n ];\n const { items } = await catalogApi.getEntities(\n catalogFilter\n ? { filter: catalogFilter, fields }\n : { filter: undefined, fields },\n );\n\n const entityRefToPresentation = new Map<\n string,\n EntityRefPresentationSnapshot\n >(\n await Promise.all(\n items.map(async item => {\n const presentation = await entityPresentationApi.forEntity(item)\n .promise;\n return [stringifyEntityRef(item), presentation] as [\n string,\n EntityRefPresentationSnapshot,\n ];\n }),\n ),\n );\n\n return { catalogEntities: items, entityRefToPresentation };\n });\n\n const allowArbitraryValues =\n uiSchema['ui:options']?.allowArbitraryValues ?? true;\n\n const getLabel = useCallback(\n (freeSoloValue: string) => {\n try {\n // Will throw if defaultKind or defaultNamespace are not set\n const parsedRef = parseEntityRef(freeSoloValue, {\n defaultKind,\n defaultNamespace,\n });\n\n return stringifyEntityRef(parsedRef);\n } catch (err) {\n return freeSoloValue;\n }\n },\n [defaultKind, defaultNamespace],\n );\n\n const onSelect = useCallback(\n (_: any, ref: string | Entity | null, reason: AutocompleteChangeReason) => {\n // ref can either be a string from free solo entry or\n if (typeof ref !== 'string') {\n // if ref does not exist: pass 'undefined' to trigger validation for required value\n onChange(ref ? stringifyEntityRef(ref as Entity) : undefined);\n } else {\n if (reason === 'blur' || reason === 'create-option') {\n // Add in default namespace, etc.\n let entityRef = ref;\n try {\n // Attempt to parse the entity ref into it's full form.\n entityRef = stringifyEntityRef(\n parseEntityRef(ref as string, {\n defaultKind,\n defaultNamespace,\n }),\n );\n } catch (err) {\n // If the passed in value isn't an entity ref, do nothing.\n }\n // We need to check against formData here as that's the previous value for this field.\n if (formData !== ref || allowArbitraryValues) {\n onChange(entityRef);\n }\n }\n }\n },\n [onChange, formData, defaultKind, defaultNamespace, allowArbitraryValues],\n );\n\n // Since free solo can be enabled, attempt to parse as a full entity ref first, then fall\n // back to the given value.\n const selectedEntity =\n entities?.catalogEntities.find(e => stringifyEntityRef(e) === formData) ??\n (allowArbitraryValues && formData ? getLabel(formData) : '');\n\n useEffect(() => {\n if (entities?.catalogEntities.length === 1 && selectedEntity === '') {\n onChange(stringifyEntityRef(entities.catalogEntities[0]));\n }\n }, [entities, onChange, selectedEntity]);\n\n return (\n <FormControl\n margin=\"normal\"\n required={required}\n error={rawErrors?.length > 0 && !formData}\n >\n <Autocomplete\n disabled={entities?.catalogEntities.length === 1}\n id={idSchema?.$id}\n value={selectedEntity}\n loading={loading}\n onChange={onSelect}\n options={entities?.catalogEntities || []}\n getOptionLabel={option =>\n // option can be a string due to freeSolo.\n typeof option === 'string'\n ? option\n : entities?.entityRefToPresentation.get(stringifyEntityRef(option))\n ?.primaryTitle!\n }\n autoSelect\n freeSolo={allowArbitraryValues}\n renderInput={params => (\n <TextField\n {...params}\n label={title}\n margin=\"dense\"\n helperText={description}\n FormHelperTextProps={{ margin: 'dense', style: { marginLeft: 0 } }}\n variant=\"outlined\"\n required={required}\n InputProps={params.InputProps}\n />\n )}\n renderOption={option => <EntityDisplayName entityRef={option} />}\n filterOptions={createFilterOptions<Entity>({\n stringify: option =>\n entities?.entityRefToPresentation.get(stringifyEntityRef(option))\n ?.primaryTitle!,\n })}\n ListboxComponent={VirtualizedListbox}\n />\n </FormControl>\n );\n};\n\n/**\n * Converts a especial `{exists: true}` value to the `CATALOG_FILTER_EXISTS` symbol.\n *\n * @param value - The value to convert.\n * @returns The converted value.\n */\nfunction convertOpsValues(\n value: Exclude<EntityPickerFilterQueryValue, Array<any>>,\n): string | symbol {\n if (typeof value === 'object' && value.exists) {\n return CATALOG_FILTER_EXISTS;\n }\n return value?.toString();\n}\n\n/**\n * Converts schema filters to entity filter query, replacing `{exists:true}` values\n * with the constant `CATALOG_FILTER_EXISTS`.\n *\n * @param schemaFilters - An object containing schema filters with keys as filter names\n * and values as filter values.\n * @returns An object with the same keys as the input object, but with `{exists:true}` values\n * transformed to `CATALOG_FILTER_EXISTS` symbol.\n */\nfunction convertSchemaFiltersToQuery(\n schemaFilters: EntityPickerFilterQuery,\n): Exclude<EntityFilterQuery, Array<any>> {\n const query: EntityFilterQuery = {};\n\n for (const [key, value] of Object.entries(schemaFilters)) {\n if (Array.isArray(value)) {\n query[key] = value;\n } else {\n query[key] = convertOpsValues(value);\n }\n }\n\n return query;\n}\n\n/**\n * Builds an `EntityFilterQuery` based on the `uiSchema` passed in.\n * If `catalogFilter` is specified in the `uiSchema`, it is converted to a `EntityFilterQuery`.\n * If `allowedKinds` is specified in the `uiSchema` will support the legacy `allowedKinds` option.\n *\n * @param uiSchema The `uiSchema` of an `EntityPicker` component.\n * @returns An `EntityFilterQuery` based on the `uiSchema`, or `undefined` if `catalogFilter` is not specified in the `uiSchema`.\n */\nfunction buildCatalogFilter(\n uiSchema: EntityPickerProps['uiSchema'],\n): EntityFilterQuery | undefined {\n const allowedKinds = uiSchema['ui:options']?.allowedKinds;\n\n const catalogFilter: EntityPickerUiOptions['catalogFilter'] | undefined =\n uiSchema['ui:options']?.catalogFilter ||\n (allowedKinds && { kind: allowedKinds });\n\n if (!catalogFilter) {\n return undefined;\n }\n\n if (Array.isArray(catalogFilter)) {\n return catalogFilter.map(convertSchemaFiltersToQuery);\n }\n\n return convertSchemaFiltersToQuery(catalogFilter);\n}\n"],"names":[],"mappings":"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"}
@@ -89,6 +89,7 @@ const MultiEntityPicker = (props) => {
89
89
  filterSelectedOptions: true,
90
90
  disabled: entities?.entities?.length === 1,
91
91
  id: idSchema?.$id,
92
+ defaultValue: formData,
92
93
  loading,
93
94
  onChange: onSelect,
94
95
  options: entities?.entities || [],