@backstage/plugin-scaffolder 1.39.0 → 1.39.1-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/alpha/api/FormDecoratorsApi.esm.js.map +1 -1
  3. package/dist/alpha/api/ref.esm.js.map +1 -1
  4. package/dist/alpha/components/EditorSubPage.esm.js.map +1 -1
  5. package/dist/alpha/components/TasksSubPage.esm.js.map +1 -1
  6. package/dist/alpha/components/TemplateEditorPage/CustomFieldExplorer.esm.js.map +1 -1
  7. package/dist/alpha/components/TemplateEditorPage/CustomFieldPlayground.esm.js.map +1 -1
  8. package/dist/alpha/components/TemplateEditorPage/CustomFieldsPage.esm.js.map +1 -1
  9. package/dist/alpha/components/TemplateEditorPage/DirectoryEditorContext.esm.js.map +1 -1
  10. package/dist/alpha/components/TemplateEditorPage/DryRunContext.esm.js.map +1 -1
  11. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResults.esm.js.map +1 -1
  12. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsList.esm.js.map +1 -1
  13. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsSplitView.esm.js.map +1 -1
  14. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsView.esm.js.map +1 -1
  15. package/dist/alpha/components/TemplateEditorPage/DryRunResults/IconLink.esm.js.map +1 -1
  16. package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskPageLinks.esm.js.map +1 -1
  17. package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskStatusStepper.esm.js.map +1 -1
  18. package/dist/alpha/components/TemplateEditorPage/TemplateEditor.esm.js.map +1 -1
  19. package/dist/alpha/components/TemplateEditorPage/TemplateEditorBrowser.esm.js.map +1 -1
  20. package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js.map +1 -1
  21. package/dist/alpha/components/TemplateEditorPage/TemplateEditorIntro.esm.js.map +1 -1
  22. package/dist/alpha/components/TemplateEditorPage/TemplateEditorLayout.esm.js.map +1 -1
  23. package/dist/alpha/components/TemplateEditorPage/TemplateEditorPage.esm.js.map +1 -1
  24. package/dist/alpha/components/TemplateEditorPage/TemplateEditorTextArea.esm.js.map +1 -1
  25. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js.map +1 -1
  26. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarFileMenu.esm.js.map +1 -1
  27. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarTemplatesMenu.esm.js.map +1 -1
  28. package/dist/alpha/components/TemplateEditorPage/TemplateFormPage.esm.js.map +1 -1
  29. package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js.map +1 -1
  30. package/dist/alpha/components/TemplateEditorPage/TemplateIntroPage.esm.js.map +1 -1
  31. package/dist/alpha/components/TemplateEditorPage/useTemplateDirectory.esm.js.map +1 -1
  32. package/dist/alpha/components/TemplateListPage/RegisterExistingButton.esm.js.map +1 -1
  33. package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js.map +1 -1
  34. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPage.esm.js +2 -2
  35. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPage.esm.js.map +1 -1
  36. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js.map +1 -1
  37. package/dist/alpha/components/TemplatesSubPage.esm.js.map +1 -1
  38. package/dist/alpha/extensions.esm.js.map +1 -1
  39. package/dist/alpha/fields/EntityNamePicker.esm.js.map +1 -1
  40. package/dist/alpha/fields/EntityPicker.esm.js.map +1 -1
  41. package/dist/alpha/fields/EntityTagsPicker.esm.js.map +1 -1
  42. package/dist/alpha/fields/MultiEntityPicker.esm.js.map +1 -1
  43. package/dist/alpha/fields/MyGroupsPicker.esm.js.map +1 -1
  44. package/dist/alpha/fields/OwnedEntityPicker.esm.js.map +1 -1
  45. package/dist/alpha/fields/OwnerPicker.esm.js.map +1 -1
  46. package/dist/alpha/fields/RepoBranchPicker.esm.js.map +1 -1
  47. package/dist/alpha/fields/RepoOwnerPicker.esm.js.map +1 -1
  48. package/dist/alpha/fields/RepoUrlPicker.esm.js.map +1 -1
  49. package/dist/alpha/formFieldsApi.esm.js.map +1 -1
  50. package/dist/alpha/hooks/useFormDecorators.esm.js.map +1 -1
  51. package/dist/alpha/hooks/useScaffolderTemplateIconLinkProps.esm.js.map +1 -1
  52. package/dist/alpha/lib/createGroupsWithOther.esm.js.map +1 -1
  53. package/dist/alpha/plugin.esm.js.map +1 -1
  54. package/dist/alpha.esm.js.map +1 -1
  55. package/dist/api.esm.js.map +1 -1
  56. package/dist/components/ActionsPage/ActionsPage.esm.js +3 -3
  57. package/dist/components/ActionsPage/ActionsPage.esm.js.map +1 -1
  58. package/dist/components/FileBrowser/FileBrowser.esm.js.map +1 -1
  59. package/dist/components/ListTasksPage/ListTasksPage.esm.js +4 -4
  60. package/dist/components/ListTasksPage/ListTasksPage.esm.js.map +1 -1
  61. package/dist/components/ListTasksPage/OwnerListPicker.esm.js.map +1 -1
  62. package/dist/components/ListTasksPage/columns/CreatedAtColumn.esm.js.map +1 -1
  63. package/dist/components/ListTasksPage/columns/OwnerEntityColumn.esm.js.map +1 -1
  64. package/dist/components/ListTasksPage/columns/TaskStatusColumn.esm.js.map +1 -1
  65. package/dist/components/ListTasksPage/columns/TemplateTitleColumn.esm.js.map +1 -1
  66. package/dist/components/OngoingTask/ContextMenu.esm.js.map +1 -1
  67. package/dist/components/OngoingTask/OngoingTask.esm.js +3 -3
  68. package/dist/components/OngoingTask/OngoingTask.esm.js.map +1 -1
  69. package/dist/components/OngoingTask/OngoingTaskContextMenu.esm.js.map +1 -1
  70. package/dist/components/RenderSchema/RenderSchema.esm.js.map +1 -1
  71. package/dist/components/Router/Router.esm.js.map +1 -1
  72. package/dist/components/ScaffolderUsageExamplesTable/ScaffolderUsageExamplesTable.esm.js.map +1 -1
  73. package/dist/components/TemplateTypePicker/TemplateTypePicker.esm.js.map +1 -1
  74. package/dist/components/TemplatingExtensionsPage/TemplateFilters.esm.js.map +1 -1
  75. package/dist/components/TemplatingExtensionsPage/TemplateGlobals.esm.js.map +1 -1
  76. package/dist/components/TemplatingExtensionsPage/TemplatingExtensionsPage.esm.js.map +1 -1
  77. package/dist/components/TemplatingExtensionsPage/functionArgs.esm.js.map +1 -1
  78. package/dist/components/TemplatingExtensionsPage/navigation.esm.js.map +1 -1
  79. package/dist/components/fields/Autocomplete/Autocomplete.esm.js.map +1 -1
  80. package/dist/components/fields/EntityNamePicker/EntityNamePicker.esm.js.map +1 -1
  81. package/dist/components/fields/EntityNamePicker/schema.esm.js.map +1 -1
  82. package/dist/components/fields/EntityNamePicker/validation.esm.js.map +1 -1
  83. package/dist/components/fields/EntityPicker/EntityPicker.esm.js.map +1 -1
  84. package/dist/components/fields/EntityPicker/schema.esm.js.map +1 -1
  85. package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js.map +1 -1
  86. package/dist/components/fields/EntityTagsPicker/schema.esm.js.map +1 -1
  87. package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js.map +1 -1
  88. package/dist/components/fields/MultiEntityPicker/schema.esm.js.map +1 -1
  89. package/dist/components/fields/MyGroupsPicker/MyGroupsPicker.esm.js.map +1 -1
  90. package/dist/components/fields/MyGroupsPicker/schema.esm.js.map +1 -1
  91. package/dist/components/fields/OwnedEntityPicker/OwnedEntityPicker.esm.js.map +1 -1
  92. package/dist/components/fields/OwnedEntityPicker/schema.esm.js.map +1 -1
  93. package/dist/components/fields/OwnerPicker/OwnerPicker.esm.js.map +1 -1
  94. package/dist/components/fields/OwnerPicker/schema.esm.js.map +1 -1
  95. package/dist/components/fields/RepoBranchPicker/BitbucketRepoBranchPicker.esm.js.map +1 -1
  96. package/dist/components/fields/RepoBranchPicker/DefaultRepoBranchPicker.esm.js.map +1 -1
  97. package/dist/components/fields/RepoBranchPicker/GitHubRepoBranchPicker.esm.js.map +1 -1
  98. package/dist/components/fields/RepoBranchPicker/RepoBranchPicker.esm.js.map +1 -1
  99. package/dist/components/fields/RepoBranchPicker/schema.esm.js.map +1 -1
  100. package/dist/components/fields/RepoOwnerPicker/DefaultRepoOwnerPicker.esm.js.map +1 -1
  101. package/dist/components/fields/RepoOwnerPicker/GitHubRepoOwnerPicker.esm.js.map +1 -1
  102. package/dist/components/fields/RepoOwnerPicker/GitLabRepoOwnerPicker.esm.js.map +1 -1
  103. package/dist/components/fields/RepoOwnerPicker/RepoOwnerPicker.esm.js.map +1 -1
  104. package/dist/components/fields/RepoOwnerPicker/schema.esm.js.map +1 -1
  105. package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js.map +1 -1
  106. package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js.map +1 -1
  107. package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js.map +1 -1
  108. package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js.map +1 -1
  109. package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js.map +1 -1
  110. package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js.map +1 -1
  111. package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js.map +1 -1
  112. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerHost.esm.js.map +1 -1
  113. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js.map +1 -1
  114. package/dist/components/fields/RepoUrlPicker/schema.esm.js.map +1 -1
  115. package/dist/components/fields/RepoUrlPicker/utils.esm.js.map +1 -1
  116. package/dist/components/fields/RepoUrlPicker/validation.esm.js.map +1 -1
  117. package/dist/components/fields/SecretInput/SecretInput.esm.js.map +1 -1
  118. package/dist/components/fields/VirtualizedListbox.esm.js +1 -1
  119. package/dist/components/fields/VirtualizedListbox.esm.js.map +1 -1
  120. package/dist/components/fields/buiChipStyles.esm.js.map +1 -1
  121. package/dist/components/fields/scaffolderFieldOverrides.module.css.esm.js.map +1 -1
  122. package/dist/components/fields/utils.esm.js.map +1 -1
  123. package/dist/deprecated.esm.js.map +1 -1
  124. package/dist/extensions/default.esm.js.map +1 -1
  125. package/dist/lib/download/helpers.esm.js.map +1 -1
  126. package/dist/lib/filesystem/WebFileSystemAccess.esm.js.map +1 -1
  127. package/dist/lib/filesystem/WebFileSystemStore.esm.js.map +1 -1
  128. package/dist/lib/filesystem/createExampleTemplate.esm.js.map +1 -1
  129. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -1
  130. package/dist/packages/opaque-internal/src/OpaqueType.esm.js.map +1 -1
  131. package/dist/packages/scaffolder-internal/src/wiring/InternalFormDecorator.esm.js.map +1 -1
  132. package/dist/packages/scaffolder-internal/src/wiring/InternalFormField.esm.js.map +1 -1
  133. package/dist/plugin.esm.js.map +1 -1
  134. package/dist/plugins/scaffolder/package.json.esm.js +1 -1
  135. package/dist/plugins/scaffolder/package.json.esm.js.map +1 -1
  136. package/dist/routes.esm.js.map +1 -1
  137. package/dist/translation.esm.js.map +1 -1
  138. package/package.json +27 -27
@@ -1 +1 @@
1
- {"version":3,"file":"OngoingTask.esm.js","sources":["../../../src/components/OngoingTask/OngoingTask.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ComponentType,\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { Content, ErrorPanel, Header, Page } from '@backstage/core-components';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport Paper from '@material-ui/core/Paper';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n scaffolderApiRef,\n ScaffolderTaskOutput,\n useTaskEventStream,\n} from '@backstage/plugin-scaffolder-react';\nimport { selectedTemplateRouteRef } from '../../routes';\nimport {\n AnalyticsContext,\n useAnalytics,\n useApi,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport qs from 'qs';\nimport { ContextMenu } from './ContextMenu';\nimport {\n DefaultTemplateOutputs,\n TaskLogStream,\n TaskSteps,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { useAsync } from '@react-hookz/web';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n taskCancelPermission,\n taskCreatePermission,\n taskReadPermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { entityPresentationApiRef } from '@backstage/plugin-catalog-react';\nimport { default as reactUseAsync } from 'react-use/esm/useAsync';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { OngoingTaskContextMenu } from './OngoingTaskContextMenu';\n\nconst useStyles = makeStyles(theme => ({\n contentWrapper: {\n display: 'flex',\n flexDirection: 'column',\n },\n buttonBar: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'right',\n },\n cancelButton: {\n marginRight: theme.spacing(1),\n },\n retryButton: {\n marginRight: theme.spacing(1),\n },\n logsVisibilityButton: {\n marginRight: theme.spacing(1),\n },\n}));\n\nfunction OngoingTaskAnalyticsContext(props: { children: ReactNode }) {\n const { taskId } = useParams();\n const taskStream = useTaskEventStream(taskId!);\n const { namespace, name } =\n taskStream.task?.spec.templateInfo?.entity?.metadata ?? {};\n\n return (\n <AnalyticsContext\n attributes={{\n entityRef:\n name &&\n stringifyEntityRef({\n kind: 'template',\n namespace,\n name,\n }),\n taskId,\n }}\n >\n {props.children}\n </AnalyticsContext>\n );\n}\n\n/**\n * @public\n */\nexport const OngoingTask = (props: {\n TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n}) => {\n return (\n <OngoingTaskAnalyticsContext>\n <Page themeId=\"website\">\n <OngoingTaskChrome {...props} />\n </Page>\n </OngoingTaskAnalyticsContext>\n );\n};\n\n/**\n * Content-only version of the ongoing task, for use within the NFS page layout\n * where the header is provided by the framework.\n *\n * @internal\n */\nexport function OngoingTaskBody(props: {\n TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n}) {\n const { taskId } = useParams();\n const taskStream = useTaskEventStream(taskId!);\n const entityPresentationApi = useApi(entityPresentationApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const [logsVisible, setLogVisibleState] = useState(false);\n const [buttonBarVisible, setButtonBarVisibleState] = useState(true);\n\n const { allowed: canCancelTask } = usePermission({\n permission: taskCancelPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n const isRetryableTask =\n taskStream.task?.spec.EXPERIMENTAL_recovery?.EXPERIMENTAL_strategy ===\n 'startOver';\n\n const canRetry = canReadTask && canCreateTask && isRetryableTask;\n\n const cancelEnabled = !(taskStream.cancelled || taskStream.completed);\n const isCancelButtonDisabled = !cancelEnabled || !canCancelTask;\n\n const { value: presentation } = reactUseAsync(async () => {\n const templateEntityRef = taskStream.task?.spec.templateInfo?.entityRef;\n if (!templateEntityRef) {\n return undefined;\n }\n return entityPresentationApi.forEntity(templateEntityRef).promise;\n }, [entityPresentationApi, taskStream.task?.spec.templateInfo?.entityRef]);\n\n const templateRouteRef = useRouteRef(selectedTemplateRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const scaffolderApi = useApi(scaffolderApiRef);\n\n const startOver = useCallback(() => {\n const { namespace, name } =\n taskStream.task?.spec.templateInfo?.entity?.metadata ?? {};\n\n const formData = taskStream.task?.spec.parameters ?? {};\n\n if (!namespace || !name) {\n return;\n }\n\n analytics.captureEvent('click', `Task has been started over`);\n\n navigate({\n pathname: templateRouteRef({\n namespace,\n templateName: name,\n }),\n search: `?${qs.stringify({ formData: JSON.stringify(formData) })}`,\n });\n }, [\n analytics,\n navigate,\n taskStream.task?.spec.parameters,\n taskStream.task?.spec.templateInfo?.entity?.metadata,\n templateRouteRef,\n ]);\n\n const [, { execute: triggerRetry }] = useAsync(async () => {\n if (taskId) {\n analytics.captureEvent('retried', 'Template has been retried');\n await scaffolderApi.retry?.(taskId);\n }\n });\n\n const [{ status: cancelStatus }, { execute: triggerCancel }] = useAsync(\n async () => {\n if (taskId) {\n analytics.captureEvent('cancelled', 'Template has been cancelled');\n await scaffolderApi.cancelTask(taskId);\n }\n },\n );\n\n return (\n <OngoingTaskAnalyticsContext>\n <OngoingTaskContextMenu\n title={presentation?.primaryTitle ?? t('ongoingTask.title')}\n cancelEnabled={cancelEnabled}\n canRetry={canRetry}\n isRetryableTask={isRetryableTask}\n logsVisible={logsVisible}\n buttonBarVisible={buttonBarVisible}\n onStartOver={startOver}\n onRetry={triggerRetry}\n onToggleLogs={setLogVisibleState}\n onToggleButtonBar={setButtonBarVisibleState}\n taskId={taskId}\n onCancel={triggerCancel}\n isCancelButtonDisabled={\n isCancelButtonDisabled || cancelStatus !== 'not-executed'\n }\n />\n <OngoingTaskContent\n {...props}\n logsVisibleOverride={logsVisible}\n buttonBarVisibleOverride={buttonBarVisible}\n onToggleLogs={setLogVisibleState}\n onToggleButtonBar={setButtonBarVisibleState}\n />\n </OngoingTaskAnalyticsContext>\n );\n}\n\nfunction OngoingTaskChrome(props: {\n TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n}) {\n const { taskId } = useParams();\n const taskStream = useTaskEventStream(taskId!);\n const entityPresentationApi = useApi(entityPresentationApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const [logsVisible, setLogVisibleState] = useState(false);\n const [buttonBarVisible, setButtonBarVisibleState] = useState(true);\n\n const { allowed: canCancelTask } = usePermission({\n permission: taskCancelPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n const isRetryableTask =\n taskStream.task?.spec.EXPERIMENTAL_recovery?.EXPERIMENTAL_strategy ===\n 'startOver';\n\n const canRetry = canReadTask && canCreateTask && isRetryableTask;\n\n const cancelEnabled = !(taskStream.cancelled || taskStream.completed);\n const isCancelButtonDisabled = !cancelEnabled || !canCancelTask;\n\n const { value: presentation } = reactUseAsync(async () => {\n const templateEntityRef = taskStream.task?.spec.templateInfo?.entityRef;\n if (!templateEntityRef) {\n return undefined;\n }\n return entityPresentationApi.forEntity(templateEntityRef).promise;\n }, [entityPresentationApi, taskStream.task?.spec.templateInfo?.entityRef]);\n\n const templateRouteRef = useRouteRef(selectedTemplateRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const scaffolderApi = useApi(scaffolderApiRef);\n\n const startOver = useCallback(() => {\n const { namespace, name } =\n taskStream.task?.spec.templateInfo?.entity?.metadata ?? {};\n\n const formData = taskStream.task?.spec.parameters ?? {};\n\n if (!namespace || !name) {\n return;\n }\n\n analytics.captureEvent('click', `Task has been started over`);\n\n navigate({\n pathname: templateRouteRef({\n namespace,\n templateName: name,\n }),\n search: `?${qs.stringify({ formData: JSON.stringify(formData) })}`,\n });\n }, [\n analytics,\n navigate,\n taskStream.task?.spec.parameters,\n taskStream.task?.spec.templateInfo?.entity?.metadata,\n templateRouteRef,\n ]);\n\n const [, { execute: triggerRetry }] = useAsync(async () => {\n if (taskId) {\n analytics.captureEvent('retried', 'Template has been retried');\n await scaffolderApi.retry?.(taskId);\n }\n });\n\n const [{ status: cancelStatus }, { execute: triggerCancel }] = useAsync(\n async () => {\n if (taskId) {\n analytics.captureEvent('cancelled', 'Template has been cancelled');\n await scaffolderApi.cancelTask(taskId);\n }\n },\n );\n\n return (\n <>\n <Header\n pageTitleOverride={\n presentation\n ? t('ongoingTask.pageTitle.hasTemplateName', {\n templateName: presentation.primaryTitle,\n })\n : t('ongoingTask.pageTitle.noTemplateName')\n }\n title={\n <div>\n {t('ongoingTask.title')}{' '}\n <code>{presentation ? presentation.primaryTitle : ''}</code>\n </div>\n }\n subtitle={t('ongoingTask.subtitle', { taskId: taskId as string })}\n >\n <ContextMenu\n cancelEnabled={cancelEnabled}\n canRetry={canRetry}\n isRetryableTask={isRetryableTask}\n logsVisible={logsVisible}\n buttonBarVisible={buttonBarVisible}\n onStartOver={startOver}\n onRetry={triggerRetry}\n onToggleLogs={setLogVisibleState}\n onToggleButtonBar={setButtonBarVisibleState}\n taskId={taskId}\n onCancel={triggerCancel}\n isCancelButtonDisabled={\n isCancelButtonDisabled || cancelStatus !== 'not-executed'\n }\n />\n </Header>\n <OngoingTaskContent\n {...props}\n logsVisibleOverride={logsVisible}\n buttonBarVisibleOverride={buttonBarVisible}\n onToggleLogs={setLogVisibleState}\n onToggleButtonBar={setButtonBarVisibleState}\n />\n </>\n );\n}\n\nfunction OngoingTaskContent(props: {\n TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n logsVisibleOverride?: boolean;\n buttonBarVisibleOverride?: boolean;\n onToggleLogs?: (state: boolean) => void;\n onToggleButtonBar?: (state: boolean) => void;\n}) {\n const { taskId } = useParams();\n const templateRouteRef = useRouteRef(selectedTemplateRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const scaffolderApi = useApi(scaffolderApiRef);\n const taskStream = useTaskEventStream(taskId!);\n const classes = useStyles();\n const steps = useMemo(\n () =>\n taskStream.task?.spec.steps.map(step => ({\n ...step,\n ...taskStream?.steps?.[step.id],\n })) ?? [],\n [taskStream],\n );\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const [logsVisibleLocal, setLogVisibleStateLocal] = useState(false);\n const [buttonBarVisibleLocal, setButtonBarVisibleStateLocal] = useState(true);\n\n const logsVisible = props.logsVisibleOverride ?? logsVisibleLocal;\n const setLogVisibleState = props.onToggleLogs ?? setLogVisibleStateLocal;\n const buttonBarVisible =\n props.buttonBarVisibleOverride ?? buttonBarVisibleLocal;\n const setButtonBarVisibleState =\n props.onToggleButtonBar ?? setButtonBarVisibleStateLocal;\n\n const { allowed: canCancelTask } = usePermission({\n permission: taskCancelPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n const canStartOver = canReadTask && canCreateTask;\n\n useEffect(() => {\n if (taskStream.error) {\n setLogVisibleState(true);\n }\n }, [taskStream.error, setLogVisibleState]);\n\n useEffect(() => {\n if (taskStream.completed && !taskStream.error) {\n setLogVisibleState(true);\n setButtonBarVisibleState(false);\n }\n }, [\n taskStream.error,\n taskStream.completed,\n setLogVisibleState,\n setButtonBarVisibleState,\n ]);\n\n const activeStep = useMemo(() => {\n for (let i = steps.length - 1; i >= 0; i--) {\n if (steps[i].status !== 'open') {\n return i;\n }\n }\n\n return 0;\n }, [steps]);\n\n const isRetryableTask =\n taskStream.task?.spec.EXPERIMENTAL_recovery?.EXPERIMENTAL_strategy ===\n 'startOver';\n\n const canRetry = canReadTask && canCreateTask && isRetryableTask;\n\n const startOver = useCallback(() => {\n const { namespace, name } =\n taskStream.task?.spec.templateInfo?.entity?.metadata ?? {};\n\n const formData = taskStream.task?.spec.parameters ?? {};\n\n if (!namespace || !name) {\n return;\n }\n\n analytics.captureEvent('click', `Task has been started over`);\n\n navigate({\n pathname: templateRouteRef({\n namespace,\n templateName: name,\n }),\n search: `?${qs.stringify({ formData: JSON.stringify(formData) })}`,\n });\n }, [\n analytics,\n navigate,\n taskStream.task?.spec.parameters,\n taskStream.task?.spec.templateInfo?.entity?.metadata,\n templateRouteRef,\n ]);\n\n const [, { execute: triggerRetry }] = useAsync(async () => {\n if (taskId) {\n analytics.captureEvent('retried', 'Template has been retried');\n await scaffolderApi.retry?.(taskId);\n }\n });\n\n const [{ status: cancelStatus }, { execute: triggerCancel }] = useAsync(\n async () => {\n if (taskId) {\n analytics.captureEvent('cancelled', 'Template has been cancelled');\n await scaffolderApi.cancelTask(taskId);\n }\n },\n );\n\n const Outputs = props.TemplateOutputsComponent ?? DefaultTemplateOutputs;\n\n const cancelEnabled = !(taskStream.cancelled || taskStream.completed);\n\n return (\n <Content className={classes.contentWrapper}>\n {taskStream.error ? (\n <Box paddingBottom={2}>\n <ErrorPanel\n error={taskStream.error}\n titleFormat=\"markdown\"\n title={taskStream.error.message}\n />\n </Box>\n ) : null}\n\n <Box paddingBottom={2}>\n <TaskSteps\n steps={steps}\n activeStep={activeStep}\n isComplete={taskStream.completed}\n isError={Boolean(taskStream.error)}\n />\n </Box>\n\n <Outputs output={taskStream.output} />\n\n {buttonBarVisible ? (\n <Box paddingBottom={2}>\n <Paper>\n <Box padding={2}>\n <div className={classes.buttonBar}>\n <Button\n className={classes.cancelButton}\n disabled={\n !cancelEnabled ||\n (cancelStatus !== 'not-executed' && !isRetryableTask) ||\n !canCancelTask\n }\n onClick={triggerCancel}\n data-testid=\"cancel-button\"\n >\n {t('ongoingTask.cancelButtonTitle')}\n </Button>\n {isRetryableTask && (\n <Button\n className={classes.retryButton}\n disabled={cancelEnabled || !canRetry}\n onClick={triggerRetry}\n data-testid=\"retry-button\"\n >\n {t('ongoingTask.retryButtonTitle')}\n </Button>\n )}\n <Button\n className={classes.logsVisibilityButton}\n color=\"primary\"\n variant=\"outlined\"\n onClick={() => setLogVisibleState(!logsVisible)}\n >\n {logsVisible\n ? t('ongoingTask.hideLogsButtonTitle')\n : t('ongoingTask.showLogsButtonTitle')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={cancelEnabled || !canStartOver}\n onClick={startOver}\n data-testid=\"start-over-button\"\n >\n {t('ongoingTask.startOverButtonTitle')}\n </Button>\n </div>\n </Box>\n </Paper>\n </Box>\n ) : null}\n\n {logsVisible ? (\n <Paper style={{ height: '100%' }}>\n <Box padding={2} height=\"100%\">\n <TaskLogStream logs={taskStream.stepLogs} />\n </Box>\n </Paper>\n ) : null}\n </Content>\n );\n}\n"],"names":["reactUseAsync","useAsync"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA8DA,MAAM,SAAA,GAAY,WAAW,CAAA,KAAA,MAAU;AAAA,EACrC,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC9B;AAAA,EACA,WAAA,EAAa;AAAA,IACX,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC9B;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA;AAEhC,CAAA,CAAE,CAAA;AAEF,SAAS,4BAA4B,KAAA,EAAgC;AACnE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,UAAA,GAAa,mBAAmB,MAAO,CAAA;AAC7C,EAAA,MAAM,EAAE,SAAA,EAAW,IAAA,EAAK,GACtB,UAAA,CAAW,MAAM,IAAA,CAAK,YAAA,EAAc,MAAA,EAAQ,QAAA,IAAY,EAAC;AAE3D,EAAA,uBACE,GAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY;AAAA,QACV,SAAA,EACE,QACA,kBAAA,CAAmB;AAAA,UACjB,IAAA,EAAM,UAAA;AAAA,UACN,SAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,QACH;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,GACT;AAEJ;AAKO,MAAM,WAAA,GAAc,CAAC,KAAA,KAItB;AACJ,EAAA,uBACE,GAAA,CAAC,2BAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,SAAA,EACZ,QAAA,kBAAA,GAAA,CAAC,iBAAA,EAAA,EAAmB,GAAG,KAAA,EAAO,CAAA,EAChC,CAAA,EACF,CAAA;AAEJ;AAQO,SAAS,gBAAgB,KAAA,EAI7B;AACD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,UAAA,GAAa,mBAAmB,MAAO,CAAA;AAC7C,EAAA,MAAM,qBAAA,GAAwB,OAAO,wBAAwB,CAAA;AAC7D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,CAAC,WAAA,EAAa,kBAAkB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,gBAAA,EAAkB,wBAAwB,CAAA,GAAI,SAAS,IAAI,CAAA;AAElE,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,aAAA,CAAc;AAAA,IAC/C,UAAA,EAAY,oBAAA;AAAA,IACZ,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,aAAA,CAAc;AAAA,IAC7C,UAAA,EAAY,kBAAA;AAAA,IACZ,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,aAAA,CAAc;AAAA,IAC/C,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,MAAM,eAAA,GACJ,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,uBAAuB,qBAAA,KAC7C,WAAA;AAEF,EAAA,MAAM,QAAA,GAAW,eAAe,aAAA,IAAiB,eAAA;AAEjD,EAAA,MAAM,aAAA,GAAgB,EAAE,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,SAAA,CAAA;AAC3D,EAAA,MAAM,sBAAA,GAAyB,CAAC,aAAA,IAAiB,CAAC,aAAA;AAElD,EAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAa,GAAIA,SAAc,YAAY;AACxD,IAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,YAAA,EAAc,SAAA;AAC9D,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,qBAAA,CAAsB,SAAA,CAAU,iBAAiB,CAAA,CAAE,OAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,qBAAA,EAAuB,UAAA,CAAW,MAAM,IAAA,CAAK,YAAA,EAAc,SAAS,CAAC,CAAA;AAEzE,EAAA,MAAM,gBAAA,GAAmB,YAAY,wBAAwB,CAAA;AAC7D,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAE7C,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,MAAM,EAAE,SAAA,EAAW,IAAA,EAAK,GACtB,UAAA,CAAW,MAAM,IAAA,CAAK,YAAA,EAAc,MAAA,EAAQ,QAAA,IAAY,EAAC;AAE3D,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,cAAc,EAAC;AAEtD,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,IAAA,EAAM;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,YAAA,CAAa,SAAS,CAAA,0BAAA,CAA4B,CAAA;AAE5D,IAAA,QAAA,CAAS;AAAA,MACP,UAAU,gBAAA,CAAiB;AAAA,QACzB,SAAA;AAAA,QACA,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,MAAA,EAAQ,CAAA,CAAA,EAAI,EAAA,CAAG,SAAA,CAAU,EAAE,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,KACjE,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,SAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA,CAAW,MAAM,IAAA,CAAK,UAAA;AAAA,IACtB,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,YAAA,EAAc,MAAA,EAAQ,QAAA;AAAA,IAC5C;AAAA,GACD,CAAA;AAED,EAAA,MAAM,GAAG,EAAE,OAAA,EAAS,cAAc,CAAA,GAAIC,WAAS,YAAY;AACzD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,SAAA,CAAU,YAAA,CAAa,WAAW,2BAA2B,CAAA;AAC7D,MAAA,MAAM,aAAA,CAAc,QAAQ,MAAM,CAAA;AAAA,IACpC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,CAAC,EAAE,MAAA,EAAQ,YAAA,IAAgB,EAAE,OAAA,EAAS,aAAA,EAAe,CAAA,GAAIA,UAAA;AAAA,IAC7D,YAAY;AACV,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,SAAA,CAAU,YAAA,CAAa,aAAa,6BAA6B,CAAA;AACjE,QAAA,MAAM,aAAA,CAAc,WAAW,MAAM,CAAA;AAAA,MACvC;AAAA,IACF;AAAA,GACF;AAEA,EAAA,4BACG,2BAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,YAAA,EAAc,YAAA,IAAgB,CAAA,CAAE,mBAAmB,CAAA;AAAA,QAC1D,aAAA;AAAA,QACA,QAAA;AAAA,QACA,eAAA;AAAA,QACA,WAAA;AAAA,QACA,gBAAA;AAAA,QACA,WAAA,EAAa,SAAA;AAAA,QACb,OAAA,EAAS,YAAA;AAAA,QACT,YAAA,EAAc,kBAAA;AAAA,QACd,iBAAA,EAAmB,wBAAA;AAAA,QACnB,MAAA;AAAA,QACA,QAAA,EAAU,aAAA;AAAA,QACV,sBAAA,EACE,0BAA0B,YAAA,KAAiB;AAAA;AAAA,KAE/C;AAAA,oBACA,GAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,mBAAA,EAAqB,WAAA;AAAA,QACrB,wBAAA,EAA0B,gBAAA;AAAA,QAC1B,YAAA,EAAc,kBAAA;AAAA,QACd,iBAAA,EAAmB;AAAA;AAAA;AACrB,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,kBAAkB,KAAA,EAIxB;AACD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,UAAA,GAAa,mBAAmB,MAAO,CAAA;AAC7C,EAAA,MAAM,qBAAA,GAAwB,OAAO,wBAAwB,CAAA;AAC7D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,CAAC,WAAA,EAAa,kBAAkB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,gBAAA,EAAkB,wBAAwB,CAAA,GAAI,SAAS,IAAI,CAAA;AAElE,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,aAAA,CAAc;AAAA,IAC/C,UAAA,EAAY,oBAAA;AAAA,IACZ,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,aAAA,CAAc;AAAA,IAC7C,UAAA,EAAY,kBAAA;AAAA,IACZ,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,aAAA,CAAc;AAAA,IAC/C,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,MAAM,eAAA,GACJ,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,uBAAuB,qBAAA,KAC7C,WAAA;AAEF,EAAA,MAAM,QAAA,GAAW,eAAe,aAAA,IAAiB,eAAA;AAEjD,EAAA,MAAM,aAAA,GAAgB,EAAE,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,SAAA,CAAA;AAC3D,EAAA,MAAM,sBAAA,GAAyB,CAAC,aAAA,IAAiB,CAAC,aAAA;AAElD,EAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAa,GAAID,SAAc,YAAY;AACxD,IAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,YAAA,EAAc,SAAA;AAC9D,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,qBAAA,CAAsB,SAAA,CAAU,iBAAiB,CAAA,CAAE,OAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,qBAAA,EAAuB,UAAA,CAAW,MAAM,IAAA,CAAK,YAAA,EAAc,SAAS,CAAC,CAAA;AAEzE,EAAA,MAAM,gBAAA,GAAmB,YAAY,wBAAwB,CAAA;AAC7D,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAE7C,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,MAAM,EAAE,SAAA,EAAW,IAAA,EAAK,GACtB,UAAA,CAAW,MAAM,IAAA,CAAK,YAAA,EAAc,MAAA,EAAQ,QAAA,IAAY,EAAC;AAE3D,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,cAAc,EAAC;AAEtD,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,IAAA,EAAM;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,YAAA,CAAa,SAAS,CAAA,0BAAA,CAA4B,CAAA;AAE5D,IAAA,QAAA,CAAS;AAAA,MACP,UAAU,gBAAA,CAAiB;AAAA,QACzB,SAAA;AAAA,QACA,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,MAAA,EAAQ,CAAA,CAAA,EAAI,EAAA,CAAG,SAAA,CAAU,EAAE,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,KACjE,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,SAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA,CAAW,MAAM,IAAA,CAAK,UAAA;AAAA,IACtB,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,YAAA,EAAc,MAAA,EAAQ,QAAA;AAAA,IAC5C;AAAA,GACD,CAAA;AAED,EAAA,MAAM,GAAG,EAAE,OAAA,EAAS,cAAc,CAAA,GAAIC,WAAS,YAAY;AACzD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,SAAA,CAAU,YAAA,CAAa,WAAW,2BAA2B,CAAA;AAC7D,MAAA,MAAM,aAAA,CAAc,QAAQ,MAAM,CAAA;AAAA,IACpC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,CAAC,EAAE,MAAA,EAAQ,YAAA,IAAgB,EAAE,OAAA,EAAS,aAAA,EAAe,CAAA,GAAIA,UAAA;AAAA,IAC7D,YAAY;AACV,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,SAAA,CAAU,YAAA,CAAa,aAAa,6BAA6B,CAAA;AACjE,QAAA,MAAM,aAAA,CAAc,WAAW,MAAM,CAAA;AAAA,MACvC;AAAA,IACF;AAAA,GACF;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,iBAAA,EACE,YAAA,GACI,CAAA,CAAE,uCAAA,EAAyC;AAAA,UACzC,cAAc,YAAA,CAAa;AAAA,SAC5B,CAAA,GACD,CAAA,CAAE,sCAAsC,CAAA;AAAA,QAE9C,KAAA,uBACG,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,mBAAmB,CAAA;AAAA,UAAG,GAAA;AAAA,0BACzB,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,YAAA,GAAe,YAAA,CAAa,eAAe,EAAA,EAAG;AAAA,SAAA,EACvD,CAAA;AAAA,QAEF,QAAA,EAAU,CAAA,CAAE,sBAAA,EAAwB,EAAE,QAA0B,CAAA;AAAA,QAEhE,QAAA,kBAAA,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,aAAA;AAAA,YACA,QAAA;AAAA,YACA,eAAA;AAAA,YACA,WAAA;AAAA,YACA,gBAAA;AAAA,YACA,WAAA,EAAa,SAAA;AAAA,YACb,OAAA,EAAS,YAAA;AAAA,YACT,YAAA,EAAc,kBAAA;AAAA,YACd,iBAAA,EAAmB,wBAAA;AAAA,YACnB,MAAA;AAAA,YACA,QAAA,EAAU,aAAA;AAAA,YACV,sBAAA,EACE,0BAA0B,YAAA,KAAiB;AAAA;AAAA;AAE/C;AAAA,KACF;AAAA,oBACA,GAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,mBAAA,EAAqB,WAAA;AAAA,QACrB,wBAAA,EAA0B,gBAAA;AAAA,QAC1B,YAAA,EAAc,kBAAA;AAAA,QACd,iBAAA,EAAmB;AAAA;AAAA;AACrB,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,mBAAmB,KAAA,EAQzB;AACD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,gBAAA,GAAmB,YAAY,wBAAwB,CAAA;AAC7D,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,mBAAmB,MAAO,CAAA;AAC7C,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,MACE,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAA,MAAS;AAAA,MACvC,GAAG,IAAA;AAAA,MACH,GAAG,UAAA,EAAY,KAAA,GAAQ,IAAA,CAAK,EAAE;AAAA,KAChC,CAAE,KAAK,EAAC;AAAA,IACV,CAAC,UAAU;AAAA,GACb;AACA,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,CAAC,gBAAA,EAAkB,uBAAuB,CAAA,GAAI,SAAS,KAAK,CAAA;AAClE,EAAA,MAAM,CAAC,qBAAA,EAAuB,6BAA6B,CAAA,GAAI,SAAS,IAAI,CAAA;AAE5E,EAAA,MAAM,WAAA,GAAc,MAAM,mBAAA,IAAuB,gBAAA;AACjD,EAAA,MAAM,kBAAA,GAAqB,MAAM,YAAA,IAAgB,uBAAA;AACjD,EAAA,MAAM,gBAAA,GACJ,MAAM,wBAAA,IAA4B,qBAAA;AACpC,EAAA,MAAM,wBAAA,GACJ,MAAM,iBAAA,IAAqB,6BAAA;AAE7B,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,aAAA,CAAc;AAAA,IAC/C,UAAA,EAAY,oBAAA;AAAA,IACZ,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,aAAA,CAAc;AAAA,IAC7C,UAAA,EAAY,kBAAA;AAAA,IACZ,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,aAAA,CAAc;AAAA,IAC/C,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,MAAM,eAAe,WAAA,IAAe,aAAA;AAEpC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,CAAW,KAAA,EAAO,kBAAkB,CAAC,CAAA;AAEzC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,UAAA,CAAW,SAAA,IAAa,CAAC,UAAA,CAAW,KAAA,EAAO;AAC7C,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,wBAAA,CAAyB,KAAK,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,EAAG;AAAA,IACD,UAAA,CAAW,KAAA;AAAA,IACX,UAAA,CAAW,SAAA;AAAA,IACX,kBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,MAAA,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,KAAW,MAAA,EAAQ;AAC9B,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,CAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,eAAA,GACJ,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,uBAAuB,qBAAA,KAC7C,WAAA;AAEF,EAAA,MAAM,QAAA,GAAW,eAAe,aAAA,IAAiB,eAAA;AAEjD,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,MAAM,EAAE,SAAA,EAAW,IAAA,EAAK,GACtB,UAAA,CAAW,MAAM,IAAA,CAAK,YAAA,EAAc,MAAA,EAAQ,QAAA,IAAY,EAAC;AAE3D,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,cAAc,EAAC;AAEtD,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,IAAA,EAAM;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,YAAA,CAAa,SAAS,CAAA,0BAAA,CAA4B,CAAA;AAE5D,IAAA,QAAA,CAAS;AAAA,MACP,UAAU,gBAAA,CAAiB;AAAA,QACzB,SAAA;AAAA,QACA,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,MAAA,EAAQ,CAAA,CAAA,EAAI,EAAA,CAAG,SAAA,CAAU,EAAE,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,KACjE,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,SAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA,CAAW,MAAM,IAAA,CAAK,UAAA;AAAA,IACtB,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,YAAA,EAAc,MAAA,EAAQ,QAAA;AAAA,IAC5C;AAAA,GACD,CAAA;AAED,EAAA,MAAM,GAAG,EAAE,OAAA,EAAS,cAAc,CAAA,GAAIA,WAAS,YAAY;AACzD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,SAAA,CAAU,YAAA,CAAa,WAAW,2BAA2B,CAAA;AAC7D,MAAA,MAAM,aAAA,CAAc,QAAQ,MAAM,CAAA;AAAA,IACpC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,CAAC,EAAE,MAAA,EAAQ,YAAA,IAAgB,EAAE,OAAA,EAAS,aAAA,EAAe,CAAA,GAAIA,UAAA;AAAA,IAC7D,YAAY;AACV,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,SAAA,CAAU,YAAA,CAAa,aAAa,6BAA6B,CAAA;AACjE,QAAA,MAAM,aAAA,CAAc,WAAW,MAAM,CAAA;AAAA,MACvC;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,wBAAA,IAA4B,sBAAA;AAElD,EAAA,MAAM,aAAA,GAAgB,EAAE,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,SAAA,CAAA;AAE3D,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,cAAA,EACzB,QAAA,EAAA;AAAA,IAAA,UAAA,CAAW,KAAA,mBACV,GAAA,CAAC,GAAA,EAAA,EAAI,aAAA,EAAe,CAAA,EAClB,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB,WAAA,EAAY,UAAA;AAAA,QACZ,KAAA,EAAO,WAAW,KAAA,CAAM;AAAA;AAAA,OAE5B,CAAA,GACE,IAAA;AAAA,oBAEJ,GAAA,CAAC,GAAA,EAAA,EAAI,aAAA,EAAe,CAAA,EAClB,QAAA,kBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAY,UAAA,CAAW,SAAA;AAAA,QACvB,OAAA,EAAS,OAAA,CAAQ,UAAA,CAAW,KAAK;AAAA;AAAA,KACnC,EACF,CAAA;AAAA,oBAEA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAQ,CAAA;AAAA,IAEnC,gBAAA,mBACC,GAAA,CAAC,GAAA,EAAA,EAAI,aAAA,EAAe,GAClB,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAS,CAAA,EACZ,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,SAAA,EACtB,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,WAAW,OAAA,CAAQ,YAAA;AAAA,UACnB,UACE,CAAC,aAAA,IACA,iBAAiB,cAAA,IAAkB,CAAC,mBACrC,CAAC,aAAA;AAAA,UAEH,OAAA,EAAS,aAAA;AAAA,UACT,aAAA,EAAY,eAAA;AAAA,UAEX,YAAE,+BAA+B;AAAA;AAAA,OACpC;AAAA,MACC,eAAA,oBACC,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,WAAW,OAAA,CAAQ,WAAA;AAAA,UACnB,QAAA,EAAU,iBAAiB,CAAC,QAAA;AAAA,UAC5B,OAAA,EAAS,YAAA;AAAA,UACT,aAAA,EAAY,cAAA;AAAA,UAEX,YAAE,8BAA8B;AAAA;AAAA,OACnC;AAAA,sBAEF,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,WAAW,OAAA,CAAQ,oBAAA;AAAA,UACnB,KAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAQ,UAAA;AAAA,UACR,OAAA,EAAS,MAAM,kBAAA,CAAmB,CAAC,WAAW,CAAA;AAAA,UAE7C,QAAA,EAAA,WAAA,GACG,CAAA,CAAE,iCAAiC,CAAA,GACnC,EAAE,iCAAiC;AAAA;AAAA,OACzC;AAAA,sBACA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,WAAA;AAAA,UACR,KAAA,EAAM,SAAA;AAAA,UACN,QAAA,EAAU,iBAAiB,CAAC,YAAA;AAAA,UAC5B,OAAA,EAAS,SAAA;AAAA,UACT,aAAA,EAAY,mBAAA;AAAA,UAEX,YAAE,kCAAkC;AAAA;AAAA;AACvC,KAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA,GACE,IAAA;AAAA,IAEH,WAAA,uBACE,KAAA,EAAA,EAAM,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,IACtB,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAS,CAAA,EAAG,MAAA,EAAO,QACtB,QAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,MAAM,UAAA,CAAW,QAAA,EAAU,CAAA,EAC5C,CAAA,EACF,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"OngoingTask.esm.js","sources":["../../../src/components/OngoingTask/OngoingTask.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ComponentType,\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { Content, ErrorPanel, Header, Page } from '@backstage/core-components';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport Paper from '@material-ui/core/Paper';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n scaffolderApiRef,\n ScaffolderTaskOutput,\n useTaskEventStream,\n} from '@backstage/plugin-scaffolder-react';\nimport { selectedTemplateRouteRef } from '../../routes';\nimport {\n AnalyticsContext,\n useAnalytics,\n useApi,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport qs from 'qs';\nimport { ContextMenu } from './ContextMenu';\nimport {\n DefaultTemplateOutputs,\n TaskLogStream,\n TaskSteps,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { useAsync } from '@react-hookz/web';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n taskCancelPermission,\n taskCreatePermission,\n taskReadPermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { entityPresentationApiRef } from '@backstage/plugin-catalog-react';\nimport { default as reactUseAsync } from 'react-use/esm/useAsync';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { OngoingTaskContextMenu } from './OngoingTaskContextMenu';\n\nconst useStyles = makeStyles(theme => ({\n contentWrapper: {\n display: 'flex',\n flexDirection: 'column',\n },\n buttonBar: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'right',\n },\n cancelButton: {\n marginRight: theme.spacing(1),\n },\n retryButton: {\n marginRight: theme.spacing(1),\n },\n logsVisibilityButton: {\n marginRight: theme.spacing(1),\n },\n}));\n\nfunction OngoingTaskAnalyticsContext(props: { children: ReactNode }) {\n const { taskId } = useParams();\n const taskStream = useTaskEventStream(taskId!);\n const { namespace, name } =\n taskStream.task?.spec.templateInfo?.entity?.metadata ?? {};\n\n return (\n <AnalyticsContext\n attributes={{\n entityRef:\n name &&\n stringifyEntityRef({\n kind: 'template',\n namespace,\n name,\n }),\n taskId,\n }}\n >\n {props.children}\n </AnalyticsContext>\n );\n}\n\n/**\n * @public\n */\nexport const OngoingTask = (props: {\n TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n}) => {\n return (\n <OngoingTaskAnalyticsContext>\n <Page themeId=\"website\">\n <OngoingTaskChrome {...props} />\n </Page>\n </OngoingTaskAnalyticsContext>\n );\n};\n\n/**\n * Content-only version of the ongoing task, for use within the NFS page layout\n * where the header is provided by the framework.\n *\n * @internal\n */\nexport function OngoingTaskBody(props: {\n TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n}) {\n const { taskId } = useParams();\n const taskStream = useTaskEventStream(taskId!);\n const entityPresentationApi = useApi(entityPresentationApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const [logsVisible, setLogVisibleState] = useState(false);\n const [buttonBarVisible, setButtonBarVisibleState] = useState(true);\n\n const { allowed: canCancelTask } = usePermission({\n permission: taskCancelPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n const isRetryableTask =\n taskStream.task?.spec.EXPERIMENTAL_recovery?.EXPERIMENTAL_strategy ===\n 'startOver';\n\n const canRetry = canReadTask && canCreateTask && isRetryableTask;\n\n const cancelEnabled = !(taskStream.cancelled || taskStream.completed);\n const isCancelButtonDisabled = !cancelEnabled || !canCancelTask;\n\n const { value: presentation } = reactUseAsync(async () => {\n const templateEntityRef = taskStream.task?.spec.templateInfo?.entityRef;\n if (!templateEntityRef) {\n return undefined;\n }\n return entityPresentationApi.forEntity(templateEntityRef).promise;\n }, [entityPresentationApi, taskStream.task?.spec.templateInfo?.entityRef]);\n\n const templateRouteRef = useRouteRef(selectedTemplateRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const scaffolderApi = useApi(scaffolderApiRef);\n\n const startOver = useCallback(() => {\n const { namespace, name } =\n taskStream.task?.spec.templateInfo?.entity?.metadata ?? {};\n\n const formData = taskStream.task?.spec.parameters ?? {};\n\n if (!namespace || !name) {\n return;\n }\n\n analytics.captureEvent('click', `Task has been started over`);\n\n navigate({\n pathname: templateRouteRef({\n namespace,\n templateName: name,\n }),\n search: `?${qs.stringify({ formData: JSON.stringify(formData) })}`,\n });\n }, [\n analytics,\n navigate,\n taskStream.task?.spec.parameters,\n taskStream.task?.spec.templateInfo?.entity?.metadata,\n templateRouteRef,\n ]);\n\n const [, { execute: triggerRetry }] = useAsync(async () => {\n if (taskId) {\n analytics.captureEvent('retried', 'Template has been retried');\n await scaffolderApi.retry?.(taskId);\n }\n });\n\n const [{ status: cancelStatus }, { execute: triggerCancel }] = useAsync(\n async () => {\n if (taskId) {\n analytics.captureEvent('cancelled', 'Template has been cancelled');\n await scaffolderApi.cancelTask(taskId);\n }\n },\n );\n\n return (\n <OngoingTaskAnalyticsContext>\n <OngoingTaskContextMenu\n title={presentation?.primaryTitle ?? t('ongoingTask.title')}\n cancelEnabled={cancelEnabled}\n canRetry={canRetry}\n isRetryableTask={isRetryableTask}\n logsVisible={logsVisible}\n buttonBarVisible={buttonBarVisible}\n onStartOver={startOver}\n onRetry={triggerRetry}\n onToggleLogs={setLogVisibleState}\n onToggleButtonBar={setButtonBarVisibleState}\n taskId={taskId}\n onCancel={triggerCancel}\n isCancelButtonDisabled={\n isCancelButtonDisabled || cancelStatus !== 'not-executed'\n }\n />\n <OngoingTaskContent\n {...props}\n logsVisibleOverride={logsVisible}\n buttonBarVisibleOverride={buttonBarVisible}\n onToggleLogs={setLogVisibleState}\n onToggleButtonBar={setButtonBarVisibleState}\n />\n </OngoingTaskAnalyticsContext>\n );\n}\n\nfunction OngoingTaskChrome(props: {\n TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n}) {\n const { taskId } = useParams();\n const taskStream = useTaskEventStream(taskId!);\n const entityPresentationApi = useApi(entityPresentationApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const [logsVisible, setLogVisibleState] = useState(false);\n const [buttonBarVisible, setButtonBarVisibleState] = useState(true);\n\n const { allowed: canCancelTask } = usePermission({\n permission: taskCancelPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n const isRetryableTask =\n taskStream.task?.spec.EXPERIMENTAL_recovery?.EXPERIMENTAL_strategy ===\n 'startOver';\n\n const canRetry = canReadTask && canCreateTask && isRetryableTask;\n\n const cancelEnabled = !(taskStream.cancelled || taskStream.completed);\n const isCancelButtonDisabled = !cancelEnabled || !canCancelTask;\n\n const { value: presentation } = reactUseAsync(async () => {\n const templateEntityRef = taskStream.task?.spec.templateInfo?.entityRef;\n if (!templateEntityRef) {\n return undefined;\n }\n return entityPresentationApi.forEntity(templateEntityRef).promise;\n }, [entityPresentationApi, taskStream.task?.spec.templateInfo?.entityRef]);\n\n const templateRouteRef = useRouteRef(selectedTemplateRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const scaffolderApi = useApi(scaffolderApiRef);\n\n const startOver = useCallback(() => {\n const { namespace, name } =\n taskStream.task?.spec.templateInfo?.entity?.metadata ?? {};\n\n const formData = taskStream.task?.spec.parameters ?? {};\n\n if (!namespace || !name) {\n return;\n }\n\n analytics.captureEvent('click', `Task has been started over`);\n\n navigate({\n pathname: templateRouteRef({\n namespace,\n templateName: name,\n }),\n search: `?${qs.stringify({ formData: JSON.stringify(formData) })}`,\n });\n }, [\n analytics,\n navigate,\n taskStream.task?.spec.parameters,\n taskStream.task?.spec.templateInfo?.entity?.metadata,\n templateRouteRef,\n ]);\n\n const [, { execute: triggerRetry }] = useAsync(async () => {\n if (taskId) {\n analytics.captureEvent('retried', 'Template has been retried');\n await scaffolderApi.retry?.(taskId);\n }\n });\n\n const [{ status: cancelStatus }, { execute: triggerCancel }] = useAsync(\n async () => {\n if (taskId) {\n analytics.captureEvent('cancelled', 'Template has been cancelled');\n await scaffolderApi.cancelTask(taskId);\n }\n },\n );\n\n return (\n <>\n <Header\n pageTitleOverride={\n presentation\n ? t('ongoingTask.pageTitle.hasTemplateName', {\n templateName: presentation.primaryTitle,\n })\n : t('ongoingTask.pageTitle.noTemplateName')\n }\n title={\n <div>\n {t('ongoingTask.title')}{' '}\n <code>{presentation ? presentation.primaryTitle : ''}</code>\n </div>\n }\n subtitle={t('ongoingTask.subtitle', { taskId: taskId as string })}\n >\n <ContextMenu\n cancelEnabled={cancelEnabled}\n canRetry={canRetry}\n isRetryableTask={isRetryableTask}\n logsVisible={logsVisible}\n buttonBarVisible={buttonBarVisible}\n onStartOver={startOver}\n onRetry={triggerRetry}\n onToggleLogs={setLogVisibleState}\n onToggleButtonBar={setButtonBarVisibleState}\n taskId={taskId}\n onCancel={triggerCancel}\n isCancelButtonDisabled={\n isCancelButtonDisabled || cancelStatus !== 'not-executed'\n }\n />\n </Header>\n <OngoingTaskContent\n {...props}\n logsVisibleOverride={logsVisible}\n buttonBarVisibleOverride={buttonBarVisible}\n onToggleLogs={setLogVisibleState}\n onToggleButtonBar={setButtonBarVisibleState}\n />\n </>\n );\n}\n\nfunction OngoingTaskContent(props: {\n TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n logsVisibleOverride?: boolean;\n buttonBarVisibleOverride?: boolean;\n onToggleLogs?: (state: boolean) => void;\n onToggleButtonBar?: (state: boolean) => void;\n}) {\n const { taskId } = useParams();\n const templateRouteRef = useRouteRef(selectedTemplateRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const scaffolderApi = useApi(scaffolderApiRef);\n const taskStream = useTaskEventStream(taskId!);\n const classes = useStyles();\n const steps = useMemo(\n () =>\n taskStream.task?.spec.steps.map(step => ({\n ...step,\n ...taskStream?.steps?.[step.id],\n })) ?? [],\n [taskStream],\n );\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const [logsVisibleLocal, setLogVisibleStateLocal] = useState(false);\n const [buttonBarVisibleLocal, setButtonBarVisibleStateLocal] = useState(true);\n\n const logsVisible = props.logsVisibleOverride ?? logsVisibleLocal;\n const setLogVisibleState = props.onToggleLogs ?? setLogVisibleStateLocal;\n const buttonBarVisible =\n props.buttonBarVisibleOverride ?? buttonBarVisibleLocal;\n const setButtonBarVisibleState =\n props.onToggleButtonBar ?? setButtonBarVisibleStateLocal;\n\n const { allowed: canCancelTask } = usePermission({\n permission: taskCancelPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n const canStartOver = canReadTask && canCreateTask;\n\n useEffect(() => {\n if (taskStream.error) {\n setLogVisibleState(true);\n }\n }, [taskStream.error, setLogVisibleState]);\n\n useEffect(() => {\n if (taskStream.completed && !taskStream.error) {\n setLogVisibleState(true);\n setButtonBarVisibleState(false);\n }\n }, [\n taskStream.error,\n taskStream.completed,\n setLogVisibleState,\n setButtonBarVisibleState,\n ]);\n\n const activeStep = useMemo(() => {\n for (let i = steps.length - 1; i >= 0; i--) {\n if (steps[i].status !== 'open') {\n return i;\n }\n }\n\n return 0;\n }, [steps]);\n\n const isRetryableTask =\n taskStream.task?.spec.EXPERIMENTAL_recovery?.EXPERIMENTAL_strategy ===\n 'startOver';\n\n const canRetry = canReadTask && canCreateTask && isRetryableTask;\n\n const startOver = useCallback(() => {\n const { namespace, name } =\n taskStream.task?.spec.templateInfo?.entity?.metadata ?? {};\n\n const formData = taskStream.task?.spec.parameters ?? {};\n\n if (!namespace || !name) {\n return;\n }\n\n analytics.captureEvent('click', `Task has been started over`);\n\n navigate({\n pathname: templateRouteRef({\n namespace,\n templateName: name,\n }),\n search: `?${qs.stringify({ formData: JSON.stringify(formData) })}`,\n });\n }, [\n analytics,\n navigate,\n taskStream.task?.spec.parameters,\n taskStream.task?.spec.templateInfo?.entity?.metadata,\n templateRouteRef,\n ]);\n\n const [, { execute: triggerRetry }] = useAsync(async () => {\n if (taskId) {\n analytics.captureEvent('retried', 'Template has been retried');\n await scaffolderApi.retry?.(taskId);\n }\n });\n\n const [{ status: cancelStatus }, { execute: triggerCancel }] = useAsync(\n async () => {\n if (taskId) {\n analytics.captureEvent('cancelled', 'Template has been cancelled');\n await scaffolderApi.cancelTask(taskId);\n }\n },\n );\n\n const Outputs = props.TemplateOutputsComponent ?? DefaultTemplateOutputs;\n\n const cancelEnabled = !(taskStream.cancelled || taskStream.completed);\n\n return (\n <Content className={classes.contentWrapper}>\n {taskStream.error ? (\n <Box paddingBottom={2}>\n <ErrorPanel\n error={taskStream.error}\n titleFormat=\"markdown\"\n title={taskStream.error.message}\n />\n </Box>\n ) : null}\n\n <Box paddingBottom={2}>\n <TaskSteps\n steps={steps}\n activeStep={activeStep}\n isComplete={taskStream.completed}\n isError={Boolean(taskStream.error)}\n />\n </Box>\n\n <Outputs output={taskStream.output} />\n\n {buttonBarVisible ? (\n <Box paddingBottom={2}>\n <Paper>\n <Box padding={2}>\n <div className={classes.buttonBar}>\n <Button\n className={classes.cancelButton}\n disabled={\n !cancelEnabled ||\n (cancelStatus !== 'not-executed' && !isRetryableTask) ||\n !canCancelTask\n }\n onClick={triggerCancel}\n data-testid=\"cancel-button\"\n >\n {t('ongoingTask.cancelButtonTitle')}\n </Button>\n {isRetryableTask && (\n <Button\n className={classes.retryButton}\n disabled={cancelEnabled || !canRetry}\n onClick={triggerRetry}\n data-testid=\"retry-button\"\n >\n {t('ongoingTask.retryButtonTitle')}\n </Button>\n )}\n <Button\n className={classes.logsVisibilityButton}\n color=\"primary\"\n variant=\"outlined\"\n onClick={() => setLogVisibleState(!logsVisible)}\n >\n {logsVisible\n ? t('ongoingTask.hideLogsButtonTitle')\n : t('ongoingTask.showLogsButtonTitle')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={cancelEnabled || !canStartOver}\n onClick={startOver}\n data-testid=\"start-over-button\"\n >\n {t('ongoingTask.startOverButtonTitle')}\n </Button>\n </div>\n </Box>\n </Paper>\n </Box>\n ) : null}\n\n {logsVisible ? (\n <Paper style={{ height: '100%' }}>\n <Box padding={2} height=\"100%\">\n <TaskLogStream logs={taskStream.stepLogs} />\n </Box>\n </Paper>\n ) : null}\n </Content>\n );\n}\n"],"names":["reactUseAsync","useAsync"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"OngoingTaskContextMenu.esm.js","sources":["../../../src/components/OngoingTask/OngoingTaskContextMenu.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Header, MenuTrigger, ButtonIcon, Menu, MenuItem } from '@backstage/ui';\nimport {\n RiMore2Line,\n RiFileListLine,\n RiAddCircleLine,\n RiRepeatLine,\n RiReplay10Line,\n RiCloseCircleLine,\n} from '@remixicon/react';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n taskReadPermission,\n taskCreatePermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\ntype OngoingTaskContextMenuProps = {\n title: string;\n cancelEnabled?: boolean;\n canRetry: boolean;\n isRetryableTask: boolean;\n logsVisible?: boolean;\n buttonBarVisible?: boolean;\n onRetry?: () => void;\n onStartOver?: () => void;\n onToggleLogs?: (state: boolean) => void;\n onToggleButtonBar?: (state: boolean) => void;\n taskId?: string;\n isCancelButtonDisabled: boolean;\n onCancel: () => void;\n};\n\nexport function OngoingTaskContextMenu(props: OngoingTaskContextMenuProps) {\n const {\n title,\n cancelEnabled,\n canRetry,\n isRetryableTask,\n logsVisible,\n buttonBarVisible,\n onRetry,\n onStartOver,\n onToggleLogs,\n onToggleButtonBar,\n taskId,\n } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n const canStartOver = canReadTask && canCreateTask;\n\n return (\n <Header\n title={title}\n customActions={\n <MenuTrigger>\n <ButtonIcon\n variant=\"tertiary\"\n icon={<RiMore2Line />}\n aria-label={t('ongoingTask.contextMenu.moreOptions')}\n />\n <Menu placement=\"bottom end\">\n <MenuItem\n onAction={() => onToggleLogs?.(!logsVisible)}\n iconStart={<RiFileListLine size={16} />}\n >\n {logsVisible\n ? t('ongoingTask.contextMenu.hideLogs')\n : t('ongoingTask.contextMenu.showLogs')}\n </MenuItem>\n <MenuItem\n onAction={() => onToggleButtonBar?.(!buttonBarVisible)}\n iconStart={<RiAddCircleLine size={16} />}\n >\n {buttonBarVisible\n ? t('ongoingTask.contextMenu.hideButtonBar')\n : t('ongoingTask.contextMenu.showButtonBar')}\n </MenuItem>\n <MenuItem\n onAction={onStartOver}\n isDisabled={cancelEnabled || !canStartOver}\n iconStart={<RiRepeatLine size={16} />}\n >\n {t('ongoingTask.contextMenu.startOver')}\n </MenuItem>\n {isRetryableTask && (\n <MenuItem\n onAction={onRetry}\n isDisabled={cancelEnabled || !canRetry}\n iconStart={<RiReplay10Line size={16} />}\n >\n {t('ongoingTask.contextMenu.retry')}\n </MenuItem>\n )}\n <MenuItem\n onAction={props.onCancel}\n isDisabled={props.isCancelButtonDisabled}\n iconStart={<RiCloseCircleLine size={16} />}\n color=\"danger\"\n >\n {t('ongoingTask.contextMenu.cancel')}\n </MenuItem>\n </Menu>\n </MenuTrigger>\n }\n />\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OngoingTaskContextMenu.esm.js","sources":["../../../src/components/OngoingTask/OngoingTaskContextMenu.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Header, MenuTrigger, ButtonIcon, Menu, MenuItem } from '@backstage/ui';\nimport {\n RiMore2Line,\n RiFileListLine,\n RiAddCircleLine,\n RiRepeatLine,\n RiReplay10Line,\n RiCloseCircleLine,\n} from '@remixicon/react';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n taskReadPermission,\n taskCreatePermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\ntype OngoingTaskContextMenuProps = {\n title: string;\n cancelEnabled?: boolean;\n canRetry: boolean;\n isRetryableTask: boolean;\n logsVisible?: boolean;\n buttonBarVisible?: boolean;\n onRetry?: () => void;\n onStartOver?: () => void;\n onToggleLogs?: (state: boolean) => void;\n onToggleButtonBar?: (state: boolean) => void;\n taskId?: string;\n isCancelButtonDisabled: boolean;\n onCancel: () => void;\n};\n\nexport function OngoingTaskContextMenu(props: OngoingTaskContextMenuProps) {\n const {\n title,\n cancelEnabled,\n canRetry,\n isRetryableTask,\n logsVisible,\n buttonBarVisible,\n onRetry,\n onStartOver,\n onToggleLogs,\n onToggleButtonBar,\n taskId,\n } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n const canStartOver = canReadTask && canCreateTask;\n\n return (\n <Header\n title={title}\n customActions={\n <MenuTrigger>\n <ButtonIcon\n variant=\"tertiary\"\n icon={<RiMore2Line />}\n aria-label={t('ongoingTask.contextMenu.moreOptions')}\n />\n <Menu placement=\"bottom end\">\n <MenuItem\n onAction={() => onToggleLogs?.(!logsVisible)}\n iconStart={<RiFileListLine size={16} />}\n >\n {logsVisible\n ? t('ongoingTask.contextMenu.hideLogs')\n : t('ongoingTask.contextMenu.showLogs')}\n </MenuItem>\n <MenuItem\n onAction={() => onToggleButtonBar?.(!buttonBarVisible)}\n iconStart={<RiAddCircleLine size={16} />}\n >\n {buttonBarVisible\n ? t('ongoingTask.contextMenu.hideButtonBar')\n : t('ongoingTask.contextMenu.showButtonBar')}\n </MenuItem>\n <MenuItem\n onAction={onStartOver}\n isDisabled={cancelEnabled || !canStartOver}\n iconStart={<RiRepeatLine size={16} />}\n >\n {t('ongoingTask.contextMenu.startOver')}\n </MenuItem>\n {isRetryableTask && (\n <MenuItem\n onAction={onRetry}\n isDisabled={cancelEnabled || !canRetry}\n iconStart={<RiReplay10Line size={16} />}\n >\n {t('ongoingTask.contextMenu.retry')}\n </MenuItem>\n )}\n <MenuItem\n onAction={props.onCancel}\n isDisabled={props.isCancelButtonDisabled}\n iconStart={<RiCloseCircleLine size={16} />}\n color=\"danger\"\n >\n {t('ongoingTask.contextMenu.cancel')}\n </MenuItem>\n </Menu>\n </MenuTrigger>\n }\n />\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RenderSchema.esm.js","sources":["../../../src/components/RenderSchema/RenderSchema.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { MarkdownContent } from '@backstage/core-components';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n Button,\n Cell,\n CellText,\n ColumnConfig,\n Flex,\n Table,\n Text,\n Tooltip,\n TooltipTrigger,\n} from '@backstage/ui';\nimport type {\n JSONSchema7,\n JSONSchema7Definition,\n JSONSchema7Type,\n} from 'json-schema';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { SchemaRenderContext, SchemaRenderStrategy } from './types';\n\nconst compositeSchemaProperties = ['allOf', 'anyOf', 'not', 'oneOf'] as const;\n\ntype subSchemasType = {\n [K in (typeof compositeSchemaProperties)[number]]?: JSONSchema7Definition[];\n};\n\nconst getTypes = (schema: JSONSchema7) => {\n if (!schema.type) {\n if (\n Object.getOwnPropertyNames(schema).some(p =>\n compositeSchemaProperties.includes(p as any),\n )\n ) {\n return undefined;\n }\n return ['unknown'];\n }\n if (schema.type !== 'array') {\n return [schema.type].flat();\n }\n return [\n `${schema.type}(${\n (schema.items as JSONSchema7 | undefined)?.type ?? 'unknown'\n })`,\n ];\n};\n\nconst getSubschemas = (schema: JSONSchema7Definition): subSchemasType => {\n if (typeof schema === 'boolean') {\n return {};\n }\n const base: Omit<JSONSchema7, keyof subSchemasType> = {};\n\n const subschemas: subSchemasType = {};\n\n for (const [key, value] of Object.entries(schema) as [\n keyof JSONSchema7,\n any,\n ][]) {\n if (compositeSchemaProperties.includes(key as keyof subSchemasType)) {\n let v;\n if (Array.isArray(value)) {\n if (!value.length) {\n continue;\n }\n v = value;\n } else if (value) {\n v = [value];\n } else {\n continue;\n }\n subschemas[key as keyof subSchemasType] = v as any;\n } else {\n base[key as Exclude<keyof JSONSchema7, keyof subSchemasType>] = value;\n }\n }\n if (!(base?.type === 'object' || 'properties' in base)) {\n return subschemas;\n }\n return Object.fromEntries(\n Object.entries(subschemas).map(([key, sub]) => {\n const mergedSubschema = sub.map(alt => {\n if (typeof alt !== 'boolean' && alt.required) {\n const properties: JSONSchema7['properties'] = {};\n if (schema.properties) {\n for (const k of alt.required) {\n if (k in schema.properties) {\n properties[k] = schema.properties[k];\n }\n }\n }\n Object.assign(properties, alt.properties);\n return {\n ...base,\n ...alt,\n properties,\n };\n }\n return alt;\n });\n return [key, mergedSubschema];\n }),\n );\n};\n\ninterface SchemaTableItem {\n id: string;\n schema: JSONSchema7Definition;\n propKey?: string;\n required?: boolean;\n}\n\nconst generateId = (\n item: { propKey?: string },\n context: SchemaRenderContext,\n) => {\n return item.propKey\n ? `${context.parentId}.${item.propKey}`\n : context.parentId;\n};\n\nconst enumFrom = (schema: JSONSchema7) => {\n if (schema.type === 'array') {\n if (schema.items && typeof schema.items !== 'boolean') {\n if (Array.isArray(schema.items)) {\n const itemsWithEnum = schema.items\n .filter(e => typeof e === 'object' && 'enum' in e)\n .map(e => e as JSONSchema7);\n if (itemsWithEnum.length) {\n return itemsWithEnum[0].enum;\n }\n } else {\n return schema.items?.enum;\n }\n }\n return undefined;\n }\n return schema.enum;\n};\n\nconst inspectSchema = (\n schema: JSONSchema7Definition,\n): {\n canSubschema: boolean;\n hasEnum: boolean;\n} => {\n if (typeof schema === 'boolean') {\n return { canSubschema: false, hasEnum: false };\n }\n return {\n canSubschema:\n Object.getOwnPropertyNames(schema).some(p =>\n compositeSchemaProperties.includes(p as any),\n ) || getTypes(schema)!.some(t => t.includes('object')),\n hasEnum: !!enumFrom(schema),\n };\n};\n\nexport function RenderEnum({\n e,\n ...props\n}: {\n e: JSONSchema7Type[];\n [key: string]: any;\n}) {\n return (\n <ul {...props} style={{ listStyle: 'none', padding: 0, margin: 0 }}>\n {e.map((v, i) => {\n const text = JSON.stringify(v);\n const isComplex = v !== null && ['object', 'array'].includes(typeof v);\n return (\n <li key={i} style={{ padding: '2px 0' }}>\n <Flex gap=\"2\" align=\"center\">\n <Text\n as=\"span\"\n variant=\"body-small\"\n data-testid={`enum_el${i}`}\n style={{ fontFamily: 'monospace' }}\n >\n {text}\n </Text>\n {isComplex && (\n <TooltipTrigger>\n <Button\n data-testid={`wrap-text_${i}`}\n variant=\"tertiary\"\n size=\"small\"\n aria-label=\"Show formatted value\"\n >\n ↵\n </Button>\n <Tooltip>\n <Text\n as=\"span\"\n data-testid={`pretty_${i}`}\n style={{\n fontFamily: 'monospace',\n whiteSpace: 'pre-wrap',\n }}\n >\n {JSON.stringify(v, undefined, 2)}\n </Text>\n </Tooltip>\n </TooltipTrigger>\n )}\n </Flex>\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport const RenderSchema = ({\n strategy,\n context,\n schema,\n}: {\n strategy: SchemaRenderStrategy;\n context: SchemaRenderContext;\n schema?: JSONSchema7Definition;\n}) => {\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const columnConfig: ColumnConfig<SchemaTableItem>[] =\n strategy === 'root'\n ? [\n {\n id: 'value',\n label: t('renderSchema.tableCell.value'),\n isRowHeader: true,\n defaultWidth: '3fr',\n cell: item => <ValueCell item={item} context={context} />,\n },\n ]\n : [\n {\n id: 'name',\n label: t('renderSchema.tableCell.name'),\n isRowHeader: true,\n defaultWidth: 300,\n cell: item => {\n const name = item.propKey ?? '';\n return (\n <Cell>\n <Text\n as=\"span\"\n variant=\"body-medium\"\n style={{ fontFamily: 'monospace' }}\n >\n {item.required ? `${name} *` : name}\n </Text>\n </Cell>\n );\n },\n },\n {\n id: 'value',\n label: t('renderSchema.tableCell.value'),\n defaultWidth: '1fr',\n cell: item => <ValueCell item={item} context={context} />,\n },\n ];\n\n const result = (() => {\n if (typeof schema === 'object') {\n const subschemas = getSubschemas(schema);\n let data: SchemaTableItem[] | undefined;\n if (strategy === 'root') {\n if ('type' in schema || !Object.keys(subschemas).length) {\n data = [{ id: `root-row_${context.parentId}`, schema }];\n }\n } else if (schema.properties) {\n data = Object.entries(schema.properties).map(([key, v]) => ({\n id: `${strategy}-row_${context.parentId}.${key}`,\n schema: v,\n propKey: key,\n required: schema.required?.includes(key),\n }));\n } else if (!Object.keys(subschemas).length) {\n return undefined;\n }\n const [isExpanded, setIsExpanded] = context.expanded;\n\n return (\n <Flex direction=\"column\" gap=\"2\">\n {data && (\n <div data-testid={`${strategy}_${context.parentId}`}>\n <Table\n columnConfig={columnConfig}\n data={data}\n pagination={{ type: 'none' }}\n />\n </div>\n )}\n {(Object.keys(subschemas) as Array<keyof subSchemasType>).map(sk => {\n const subId = `${context.parentId}_${sk}`;\n const isSubOpen = isExpanded[subId];\n return (\n <Flex key={sk} direction=\"column\" gap=\"2\">\n <Button\n data-testid={`expand_${subId}`}\n variant=\"tertiary\"\n size=\"small\"\n onPress={() =>\n setIsExpanded(prevState => ({\n ...prevState,\n [subId]: !prevState[subId],\n }))\n }\n style={{ alignSelf: 'flex-start' }}\n >\n {isSubOpen ? '▴' : '▾'} {sk}\n </Button>\n {isSubOpen &&\n subschemas[sk]!.map((sub, index) => (\n <RenderSchema\n key={index}\n strategy={\n typeof sub !== 'boolean' && 'properties' in sub\n ? strategy\n : 'root'\n }\n context={{\n ...context,\n parentId: `${context.parentId}_${sk}${index}`,\n }}\n schema={sub}\n />\n ))}\n </Flex>\n );\n })}\n </Flex>\n );\n }\n return undefined;\n })();\n return result ?? <Text as=\"p\">{t('renderSchema.undefined')}</Text>;\n};\n\nfunction RenderExpansion({\n item,\n context,\n}: {\n item: SchemaTableItem;\n context: SchemaRenderContext;\n}) {\n const id = generateId(item, context);\n const info = inspectSchema(item.schema);\n const hasDetails =\n typeof item.schema !== 'boolean' && (info.canSubschema || info.hasEnum);\n const s =\n typeof item.schema !== 'boolean' ? (item.schema as JSONSchema7) : undefined;\n const [isExpanded] = context.expanded;\n const isOpen = hasDetails && s && (!getTypes(s) || isExpanded[id]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div data-testid={`expansion_${id}`} style={{ paddingLeft: 16 }}>\n {info.canSubschema && (\n <RenderSchema\n strategy=\"properties\"\n context={{\n ...context,\n parentId: id,\n parent: context,\n }}\n schema={\n s!.type === 'array' ? (s!.items as JSONSchema7 | undefined) : s\n }\n />\n )}\n {info.hasEnum && (\n <>\n <Text as=\"h4\" variant=\"title-small\" weight=\"bold\">\n Valid values:\n </Text>\n <RenderEnum data-testid={`enum_${id}`} e={enumFrom(s!)!} />\n </>\n )}\n </div>\n );\n}\n\nfunction ValueCell({\n item,\n context,\n}: {\n item: SchemaTableItem;\n context: SchemaRenderContext;\n}) {\n if (typeof item.schema === 'boolean') {\n return <CellText title={item.schema ? 'any' : 'none'} />;\n }\n const types = getTypes(item.schema);\n const [isExpanded, setIsExpanded] = context.expanded;\n const id = generateId(item, context);\n const info = inspectSchema(item.schema);\n const { title, description } = item.schema;\n return (\n <Cell>\n <Flex direction=\"column\" gap=\"1\">\n <Flex gap=\"1\" align=\"center\">\n {types?.map((type, index) =>\n (info.canSubschema || info.hasEnum) && index === 0 ? (\n <Button\n key={type}\n data-testid={`expand_${id}`}\n variant=\"tertiary\"\n size=\"small\"\n onPress={() =>\n setIsExpanded(prevState => ({\n ...prevState,\n [id]: !prevState[id],\n }))\n }\n >\n {isExpanded[id] ? '▴' : '▾'} {type}\n </Button>\n ) : (\n <Text\n key={type}\n as=\"span\"\n variant=\"body-small\"\n color=\"secondary\"\n style={{\n fontFamily: 'monospace',\n background: 'var(--bui-bg-neutral-2)',\n padding: '1px 6px',\n borderRadius: 4,\n }}\n >\n {type}\n </Text>\n ),\n )}\n </Flex>\n {title && <MarkdownContent content={title} />}\n {description && <MarkdownContent content={description} />}\n <RenderExpansion item={item} context={context} />\n </Flex>\n </Cell>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RenderSchema.esm.js","sources":["../../../src/components/RenderSchema/RenderSchema.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { MarkdownContent } from '@backstage/core-components';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n Button,\n Cell,\n CellText,\n ColumnConfig,\n Flex,\n Table,\n Text,\n Tooltip,\n TooltipTrigger,\n} from '@backstage/ui';\nimport type {\n JSONSchema7,\n JSONSchema7Definition,\n JSONSchema7Type,\n} from 'json-schema';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { SchemaRenderContext, SchemaRenderStrategy } from './types';\n\nconst compositeSchemaProperties = ['allOf', 'anyOf', 'not', 'oneOf'] as const;\n\ntype subSchemasType = {\n [K in (typeof compositeSchemaProperties)[number]]?: JSONSchema7Definition[];\n};\n\nconst getTypes = (schema: JSONSchema7) => {\n if (!schema.type) {\n if (\n Object.getOwnPropertyNames(schema).some(p =>\n compositeSchemaProperties.includes(p as any),\n )\n ) {\n return undefined;\n }\n return ['unknown'];\n }\n if (schema.type !== 'array') {\n return [schema.type].flat();\n }\n return [\n `${schema.type}(${\n (schema.items as JSONSchema7 | undefined)?.type ?? 'unknown'\n })`,\n ];\n};\n\nconst getSubschemas = (schema: JSONSchema7Definition): subSchemasType => {\n if (typeof schema === 'boolean') {\n return {};\n }\n const base: Omit<JSONSchema7, keyof subSchemasType> = {};\n\n const subschemas: subSchemasType = {};\n\n for (const [key, value] of Object.entries(schema) as [\n keyof JSONSchema7,\n any,\n ][]) {\n if (compositeSchemaProperties.includes(key as keyof subSchemasType)) {\n let v;\n if (Array.isArray(value)) {\n if (!value.length) {\n continue;\n }\n v = value;\n } else if (value) {\n v = [value];\n } else {\n continue;\n }\n subschemas[key as keyof subSchemasType] = v as any;\n } else {\n base[key as Exclude<keyof JSONSchema7, keyof subSchemasType>] = value;\n }\n }\n if (!(base?.type === 'object' || 'properties' in base)) {\n return subschemas;\n }\n return Object.fromEntries(\n Object.entries(subschemas).map(([key, sub]) => {\n const mergedSubschema = sub.map(alt => {\n if (typeof alt !== 'boolean' && alt.required) {\n const properties: JSONSchema7['properties'] = {};\n if (schema.properties) {\n for (const k of alt.required) {\n if (k in schema.properties) {\n properties[k] = schema.properties[k];\n }\n }\n }\n Object.assign(properties, alt.properties);\n return {\n ...base,\n ...alt,\n properties,\n };\n }\n return alt;\n });\n return [key, mergedSubschema];\n }),\n );\n};\n\ninterface SchemaTableItem {\n id: string;\n schema: JSONSchema7Definition;\n propKey?: string;\n required?: boolean;\n}\n\nconst generateId = (\n item: { propKey?: string },\n context: SchemaRenderContext,\n) => {\n return item.propKey\n ? `${context.parentId}.${item.propKey}`\n : context.parentId;\n};\n\nconst enumFrom = (schema: JSONSchema7) => {\n if (schema.type === 'array') {\n if (schema.items && typeof schema.items !== 'boolean') {\n if (Array.isArray(schema.items)) {\n const itemsWithEnum = schema.items\n .filter(e => typeof e === 'object' && 'enum' in e)\n .map(e => e as JSONSchema7);\n if (itemsWithEnum.length) {\n return itemsWithEnum[0].enum;\n }\n } else {\n return schema.items?.enum;\n }\n }\n return undefined;\n }\n return schema.enum;\n};\n\nconst inspectSchema = (\n schema: JSONSchema7Definition,\n): {\n canSubschema: boolean;\n hasEnum: boolean;\n} => {\n if (typeof schema === 'boolean') {\n return { canSubschema: false, hasEnum: false };\n }\n return {\n canSubschema:\n Object.getOwnPropertyNames(schema).some(p =>\n compositeSchemaProperties.includes(p as any),\n ) || getTypes(schema)!.some(t => t.includes('object')),\n hasEnum: !!enumFrom(schema),\n };\n};\n\nexport function RenderEnum({\n e,\n ...props\n}: {\n e: JSONSchema7Type[];\n [key: string]: any;\n}) {\n return (\n <ul {...props} style={{ listStyle: 'none', padding: 0, margin: 0 }}>\n {e.map((v, i) => {\n const text = JSON.stringify(v);\n const isComplex = v !== null && ['object', 'array'].includes(typeof v);\n return (\n <li key={i} style={{ padding: '2px 0' }}>\n <Flex gap=\"2\" align=\"center\">\n <Text\n as=\"span\"\n variant=\"body-small\"\n data-testid={`enum_el${i}`}\n style={{ fontFamily: 'monospace' }}\n >\n {text}\n </Text>\n {isComplex && (\n <TooltipTrigger>\n <Button\n data-testid={`wrap-text_${i}`}\n variant=\"tertiary\"\n size=\"small\"\n aria-label=\"Show formatted value\"\n >\n ↵\n </Button>\n <Tooltip>\n <Text\n as=\"span\"\n data-testid={`pretty_${i}`}\n style={{\n fontFamily: 'monospace',\n whiteSpace: 'pre-wrap',\n }}\n >\n {JSON.stringify(v, undefined, 2)}\n </Text>\n </Tooltip>\n </TooltipTrigger>\n )}\n </Flex>\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport const RenderSchema = ({\n strategy,\n context,\n schema,\n}: {\n strategy: SchemaRenderStrategy;\n context: SchemaRenderContext;\n schema?: JSONSchema7Definition;\n}) => {\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const columnConfig: ColumnConfig<SchemaTableItem>[] =\n strategy === 'root'\n ? [\n {\n id: 'value',\n label: t('renderSchema.tableCell.value'),\n isRowHeader: true,\n defaultWidth: '3fr',\n cell: item => <ValueCell item={item} context={context} />,\n },\n ]\n : [\n {\n id: 'name',\n label: t('renderSchema.tableCell.name'),\n isRowHeader: true,\n defaultWidth: 300,\n cell: item => {\n const name = item.propKey ?? '';\n return (\n <Cell>\n <Text\n as=\"span\"\n variant=\"body-medium\"\n style={{ fontFamily: 'monospace' }}\n >\n {item.required ? `${name} *` : name}\n </Text>\n </Cell>\n );\n },\n },\n {\n id: 'value',\n label: t('renderSchema.tableCell.value'),\n defaultWidth: '1fr',\n cell: item => <ValueCell item={item} context={context} />,\n },\n ];\n\n const result = (() => {\n if (typeof schema === 'object') {\n const subschemas = getSubschemas(schema);\n let data: SchemaTableItem[] | undefined;\n if (strategy === 'root') {\n if ('type' in schema || !Object.keys(subschemas).length) {\n data = [{ id: `root-row_${context.parentId}`, schema }];\n }\n } else if (schema.properties) {\n data = Object.entries(schema.properties).map(([key, v]) => ({\n id: `${strategy}-row_${context.parentId}.${key}`,\n schema: v,\n propKey: key,\n required: schema.required?.includes(key),\n }));\n } else if (!Object.keys(subschemas).length) {\n return undefined;\n }\n const [isExpanded, setIsExpanded] = context.expanded;\n\n return (\n <Flex direction=\"column\" gap=\"2\">\n {data && (\n <div data-testid={`${strategy}_${context.parentId}`}>\n <Table\n columnConfig={columnConfig}\n data={data}\n pagination={{ type: 'none' }}\n />\n </div>\n )}\n {(Object.keys(subschemas) as Array<keyof subSchemasType>).map(sk => {\n const subId = `${context.parentId}_${sk}`;\n const isSubOpen = isExpanded[subId];\n return (\n <Flex key={sk} direction=\"column\" gap=\"2\">\n <Button\n data-testid={`expand_${subId}`}\n variant=\"tertiary\"\n size=\"small\"\n onPress={() =>\n setIsExpanded(prevState => ({\n ...prevState,\n [subId]: !prevState[subId],\n }))\n }\n style={{ alignSelf: 'flex-start' }}\n >\n {isSubOpen ? '▴' : '▾'} {sk}\n </Button>\n {isSubOpen &&\n subschemas[sk]!.map((sub, index) => (\n <RenderSchema\n key={index}\n strategy={\n typeof sub !== 'boolean' && 'properties' in sub\n ? strategy\n : 'root'\n }\n context={{\n ...context,\n parentId: `${context.parentId}_${sk}${index}`,\n }}\n schema={sub}\n />\n ))}\n </Flex>\n );\n })}\n </Flex>\n );\n }\n return undefined;\n })();\n return result ?? <Text as=\"p\">{t('renderSchema.undefined')}</Text>;\n};\n\nfunction RenderExpansion({\n item,\n context,\n}: {\n item: SchemaTableItem;\n context: SchemaRenderContext;\n}) {\n const id = generateId(item, context);\n const info = inspectSchema(item.schema);\n const hasDetails =\n typeof item.schema !== 'boolean' && (info.canSubschema || info.hasEnum);\n const s =\n typeof item.schema !== 'boolean' ? (item.schema as JSONSchema7) : undefined;\n const [isExpanded] = context.expanded;\n const isOpen = hasDetails && s && (!getTypes(s) || isExpanded[id]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div data-testid={`expansion_${id}`} style={{ paddingLeft: 16 }}>\n {info.canSubschema && (\n <RenderSchema\n strategy=\"properties\"\n context={{\n ...context,\n parentId: id,\n parent: context,\n }}\n schema={\n s!.type === 'array' ? (s!.items as JSONSchema7 | undefined) : s\n }\n />\n )}\n {info.hasEnum && (\n <>\n <Text as=\"h4\" variant=\"title-small\" weight=\"bold\">\n Valid values:\n </Text>\n <RenderEnum data-testid={`enum_${id}`} e={enumFrom(s!)!} />\n </>\n )}\n </div>\n );\n}\n\nfunction ValueCell({\n item,\n context,\n}: {\n item: SchemaTableItem;\n context: SchemaRenderContext;\n}) {\n if (typeof item.schema === 'boolean') {\n return <CellText title={item.schema ? 'any' : 'none'} />;\n }\n const types = getTypes(item.schema);\n const [isExpanded, setIsExpanded] = context.expanded;\n const id = generateId(item, context);\n const info = inspectSchema(item.schema);\n const { title, description } = item.schema;\n return (\n <Cell>\n <Flex direction=\"column\" gap=\"1\">\n <Flex gap=\"1\" align=\"center\">\n {types?.map((type, index) =>\n (info.canSubschema || info.hasEnum) && index === 0 ? (\n <Button\n key={type}\n data-testid={`expand_${id}`}\n variant=\"tertiary\"\n size=\"small\"\n onPress={() =>\n setIsExpanded(prevState => ({\n ...prevState,\n [id]: !prevState[id],\n }))\n }\n >\n {isExpanded[id] ? '▴' : '▾'} {type}\n </Button>\n ) : (\n <Text\n key={type}\n as=\"span\"\n variant=\"body-small\"\n color=\"secondary\"\n style={{\n fontFamily: 'monospace',\n background: 'var(--bui-bg-neutral-2)',\n padding: '1px 6px',\n borderRadius: 4,\n }}\n >\n {type}\n </Text>\n ),\n )}\n </Flex>\n {title && <MarkdownContent content={title} />}\n {description && <MarkdownContent content={description} />}\n <RenderExpansion item={item} context={context} />\n </Flex>\n </Cell>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -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 { ComponentType, 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 templatingExtensionsRouteRef,\n} from '../../routes';\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';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { templateManagementPermission } from '@backstage/plugin-scaffolder-common/alpha';\nimport { useApp } from '@backstage/core-plugin-api';\nimport { OpaqueFormField } from '@internal/scaffolder';\nimport { TemplatingExtensionsPage } from '../TemplatingExtensionsPage';\nimport { FormField } from '@backstage/plugin-scaffolder-react/alpha';\n\n/**\n * The Props for the Scaffolder Router\n *\n * @public\n */\nexport type RouterProps = {\n components?: {\n ReviewStepComponent?: ComponentType<ReviewStepProps>;\n TemplateCardComponent?: ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n TaskPageComponent?: ComponentType<PropsWithChildren<{}>>;\n EXPERIMENTAL_TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n EXPERIMENTAL_TemplateListPageComponent?: ComponentType<TemplateListPageProps>;\n EXPERIMENTAL_TemplateWizardPageComponent?: 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 /** Whether to show a link to the create page (on /create subroutes) */\n create?: boolean;\n /** Whether to show a link to the templating extensions page */\n templatingExtensions?: boolean;\n };\n};\n\n/**\n * Internal router with additional props that aren't available in the public API\n * for the old frontend system.\n *\n * @internal\n */\nexport const InternalRouter = (\n props: PropsWithChildren<\n RouterProps & {\n formFields?: Array<FormField>;\n }\n >,\n) => {\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 = useCustomFieldExtensions(outlet);\n\n const app = useApp();\n const { NotFoundErrorPage } = app.getComponents();\n\n const fieldExtensions = [\n ...customFieldExtensions,\n ...(props.formFields?.map(OpaqueFormField.toInternal) ?? []),\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 <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <TemplateIntroPage />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n <Route\n path={customFieldsRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <CustomFieldsPage fieldExtensions={fieldExtensions} />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n <Route\n path={templateFormRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <TemplateFormPage\n layouts={customLayouts}\n formProps={props.formProps}\n fieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n\n <Route\n path={actionsRouteRef.path}\n element={<ActionsPage contextMenu={props.contextMenu} />}\n />\n <Route\n path={scaffolderListTaskRouteRef.path}\n element={<ListTasksPage contextMenu={props.contextMenu} />}\n />\n <Route\n path={editorRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <TemplateEditorPage\n layouts={customLayouts}\n formProps={props.formProps}\n fieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n <Route\n path={templatingExtensionsRouteRef.path}\n element={<TemplatingExtensionsPage contextMenu={props.contextMenu} />}\n />\n <Route path=\"*\" element={<NotFoundErrorPage />} />\n </Routes>\n );\n};\n\n/**\n * The Scaffolder Router\n *\n * @public\n */\nexport const Router = (props: PropsWithChildren<RouterProps>) => {\n return <InternalRouter {...props} />;\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 { ComponentType, 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 templatingExtensionsRouteRef,\n} from '../../routes';\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';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { templateManagementPermission } from '@backstage/plugin-scaffolder-common/alpha';\nimport { useApp } from '@backstage/core-plugin-api';\nimport { OpaqueFormField } from '@internal/scaffolder';\nimport { TemplatingExtensionsPage } from '../TemplatingExtensionsPage';\nimport { FormField } from '@backstage/plugin-scaffolder-react/alpha';\n\n/**\n * The Props for the Scaffolder Router\n *\n * @public\n */\nexport type RouterProps = {\n components?: {\n ReviewStepComponent?: ComponentType<ReviewStepProps>;\n TemplateCardComponent?: ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n TaskPageComponent?: ComponentType<PropsWithChildren<{}>>;\n EXPERIMENTAL_TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n EXPERIMENTAL_TemplateListPageComponent?: ComponentType<TemplateListPageProps>;\n EXPERIMENTAL_TemplateWizardPageComponent?: 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 /** Whether to show a link to the create page (on /create subroutes) */\n create?: boolean;\n /** Whether to show a link to the templating extensions page */\n templatingExtensions?: boolean;\n };\n};\n\n/**\n * Internal router with additional props that aren't available in the public API\n * for the old frontend system.\n *\n * @internal\n */\nexport const InternalRouter = (\n props: PropsWithChildren<\n RouterProps & {\n formFields?: Array<FormField>;\n }\n >,\n) => {\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 = useCustomFieldExtensions(outlet);\n\n const app = useApp();\n const { NotFoundErrorPage } = app.getComponents();\n\n const fieldExtensions = [\n ...customFieldExtensions,\n ...(props.formFields?.map(OpaqueFormField.toInternal) ?? []),\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 <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <TemplateIntroPage />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n <Route\n path={customFieldsRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <CustomFieldsPage fieldExtensions={fieldExtensions} />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n <Route\n path={templateFormRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <TemplateFormPage\n layouts={customLayouts}\n formProps={props.formProps}\n fieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n\n <Route\n path={actionsRouteRef.path}\n element={<ActionsPage contextMenu={props.contextMenu} />}\n />\n <Route\n path={scaffolderListTaskRouteRef.path}\n element={<ListTasksPage contextMenu={props.contextMenu} />}\n />\n <Route\n path={editorRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <TemplateEditorPage\n layouts={customLayouts}\n formProps={props.formProps}\n fieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n <Route\n path={templatingExtensionsRouteRef.path}\n element={<TemplatingExtensionsPage contextMenu={props.contextMenu} />}\n />\n <Route path=\"*\" element={<NotFoundErrorPage />} />\n </Routes>\n );\n};\n\n/**\n * The Scaffolder Router\n *\n * @public\n */\nexport const Router = (props: PropsWithChildren<RouterProps>) => {\n return <InternalRouter {...props} />;\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScaffolderUsageExamplesTable.esm.js","sources":["../../../src/components/ScaffolderUsageExamplesTable/ScaffolderUsageExamplesTable.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { CodeSnippet, MarkdownContent } from '@backstage/core-components';\nimport { ScaffolderUsageExample } from '@backstage/plugin-scaffolder-react';\nimport Box from '@material-ui/core/Box';\nimport Grid from '@material-ui/core/Grid';\nimport { Fragment } from 'react';\n\nexport const ScaffolderUsageExamplesTable = (props: {\n examples: ScaffolderUsageExample[];\n}) => {\n return (\n <Grid data-testid=\"examples\" container>\n {props.examples.map((example, index) => {\n return (\n <Fragment key={`example-${index}`}>\n <Grid data-testid={`example_desc${index}`} item lg={3}>\n <Box padding={1} style={{ overflowX: 'auto' }}>\n {example.description && (\n <MarkdownContent content={example.description} />\n )}\n {example.notes?.length && (\n <MarkdownContent content={example.notes} />\n )}\n </Box>\n </Grid>\n <Grid data-testid={`example_code${index}`} item lg={9}>\n <Box padding={1}>\n <CodeSnippet\n text={example.example?.trim()}\n showLineNumbers\n showCopyCodeButton\n language=\"yaml\"\n />\n </Box>\n </Grid>\n </Fragment>\n );\n })}\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;;AAqBO,MAAM,4BAAA,GAA+B,CAAC,KAAA,KAEvC;AACJ,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAY,UAAA,EAAW,SAAA,EAAS,IAAA,EACnC,QAAA,EAAA,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,KAAU;AACtC,IAAA,4BACG,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAK,aAAA,EAAa,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,EAAI,MAAI,IAAA,EAAC,EAAA,EAAI,CAAA,EAClD,QAAA,kBAAA,IAAA,CAAC,OAAI,OAAA,EAAS,CAAA,EAAG,OAAO,EAAE,SAAA,EAAW,QAAO,EACzC,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,WAAA,oBACP,GAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAS,QAAQ,WAAA,EAAa,CAAA;AAAA,QAEhD,QAAQ,KAAA,EAAO,MAAA,wBACb,eAAA,EAAA,EAAgB,OAAA,EAAS,QAAQ,KAAA,EAAO;AAAA,OAAA,EAE7C,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAa,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,EAAI,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,CAAA,EAClD,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAS,CAAA,EACZ,QAAA,kBAAA,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,OAAA,CAAQ,OAAA,EAAS,IAAA,EAAK;AAAA,UAC5B,eAAA,EAAe,IAAA;AAAA,UACf,kBAAA,EAAkB,IAAA;AAAA,UAClB,QAAA,EAAS;AAAA;AAAA,SAEb,CAAA,EACF;AAAA,KAAA,EAAA,EApBa,CAAA,QAAA,EAAW,KAAK,CAAA,CAqB/B,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ScaffolderUsageExamplesTable.esm.js","sources":["../../../src/components/ScaffolderUsageExamplesTable/ScaffolderUsageExamplesTable.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { CodeSnippet, MarkdownContent } from '@backstage/core-components';\nimport { ScaffolderUsageExample } from '@backstage/plugin-scaffolder-react';\nimport Box from '@material-ui/core/Box';\nimport Grid from '@material-ui/core/Grid';\nimport { Fragment } from 'react';\n\nexport const ScaffolderUsageExamplesTable = (props: {\n examples: ScaffolderUsageExample[];\n}) => {\n return (\n <Grid data-testid=\"examples\" container>\n {props.examples.map((example, index) => {\n return (\n <Fragment key={`example-${index}`}>\n <Grid data-testid={`example_desc${index}`} item lg={3}>\n <Box padding={1} style={{ overflowX: 'auto' }}>\n {example.description && (\n <MarkdownContent content={example.description} />\n )}\n {example.notes?.length && (\n <MarkdownContent content={example.notes} />\n )}\n </Box>\n </Grid>\n <Grid data-testid={`example_code${index}`} item lg={9}>\n <Box padding={1}>\n <CodeSnippet\n text={example.example?.trim()}\n showLineNumbers\n showCopyCodeButton\n language=\"yaml\"\n />\n </Box>\n </Grid>\n </Fragment>\n );\n })}\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;;AAqBO,MAAM,4BAAA,GAA+B,CAAC,KAAA,KAEvC;AACJ,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAY,UAAA,EAAW,SAAA,EAAS,IAAA,EACnC,QAAA,EAAA,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,KAAU;AACtC,IAAA,4BACG,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAK,aAAA,EAAa,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,EAAI,MAAI,IAAA,EAAC,EAAA,EAAI,CAAA,EAClD,QAAA,kBAAA,IAAA,CAAC,OAAI,OAAA,EAAS,CAAA,EAAG,OAAO,EAAE,SAAA,EAAW,QAAO,EACzC,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,WAAA,oBACP,GAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAS,QAAQ,WAAA,EAAa,CAAA;AAAA,QAEhD,QAAQ,KAAA,EAAO,MAAA,wBACb,eAAA,EAAA,EAAgB,OAAA,EAAS,QAAQ,KAAA,EAAO;AAAA,OAAA,EAE7C,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAa,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,EAAI,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,CAAA,EAClD,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAS,CAAA,EACZ,QAAA,kBAAA,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,OAAA,CAAQ,OAAA,EAAS,IAAA,EAAK;AAAA,UAC5B,eAAA,EAAe,IAAA;AAAA,UACf,kBAAA,EAAkB,IAAA;AAAA,UAClB,QAAA,EAAS;AAAA;AAAA,SAEb,CAAA,EACF;AAAA,KAAA,EAAA,EApBa,CAAA,QAAA,EAAW,KAAK,CAAA,CAqB/B,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateTypePicker.esm.js","sources":["../../../src/components/TemplateTypePicker/TemplateTypePicker.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport capitalize from 'lodash/capitalize';\nimport { Progress } from '@backstage/core-components';\nimport Box from '@material-ui/core/Box';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { useEntityTypeFilter } from '@backstage/plugin-catalog-react';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\n/**\n * The component to select the `type` of `Template` that you will see in the table.\n *\n * @public\n */\nexport const TemplateTypePicker = () => {\n const alertApi = useApi(alertApiRef);\n const { error, loading, availableTypes, selectedTypes, setSelectedTypes } =\n useEntityTypeFilter();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n if (loading) return <Progress />;\n\n if (!availableTypes) return null;\n\n if (error) {\n alertApi.post({\n message: `Failed to load entity types`,\n severity: 'error',\n });\n return null;\n }\n\n return (\n <Box pb={1} pt={1}>\n <Typography\n variant=\"button\"\n component=\"label\"\n htmlFor=\"categories-picker\"\n >\n {t('templateTypePicker.title')}\n </Typography>\n <Autocomplete<string, true>\n id=\"categories-picker\"\n multiple\n options={availableTypes}\n value={selectedTypes}\n onChange={(_: object, value: string[]) => setSelectedTypes(value)}\n renderOption={(option, { selected }) => (\n <FormControlLabel\n control={\n <Checkbox\n icon={icon}\n checkedIcon={checkedIcon}\n checked={selected}\n />\n }\n label={capitalize(option)}\n />\n )}\n size=\"small\"\n popupIcon={<ExpandMoreIcon data-testid=\"categories-picker-expand\" />}\n renderInput={params => <TextField {...params} variant=\"outlined\" />}\n />\n </Box>\n );\n};\n"],"names":["Autocomplete","TextField"],"mappings":";;;;;;;;;;;;;;;;;AAgCA,MAAM,IAAA,mBAAO,GAAA,CAAC,wBAAA,EAAA,EAAyB,QAAA,EAAS,OAAA,EAAQ,CAAA;AACxD,MAAM,WAAA,mBAAc,GAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAS,OAAA,EAAQ,CAAA;AAO5C,MAAM,qBAAqB,MAAM;AACtC,EAAA,MAAM,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,gBAAgB,aAAA,EAAe,gBAAA,KACrD,mBAAA,EAAoB;AACtB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,IAAI,OAAA,EAAS,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA;AAE9B,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAE5B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,CAAA,2BAAA,CAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EACd,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,QAAA;AAAA,QACR,SAAA,EAAU,OAAA;AAAA,QACV,OAAA,EAAQ,mBAAA;AAAA,QAEP,YAAE,0BAA0B;AAAA;AAAA,KAC/B;AAAA,oBACA,GAAA;AAAA,MAACA,eAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAG,mBAAA;AAAA,QACH,QAAA,EAAQ,IAAA;AAAA,QACR,OAAA,EAAS,cAAA;AAAA,QACT,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAU,CAAC,CAAA,EAAW,KAAA,KAAoB,iBAAiB,KAAK,CAAA;AAAA,QAChE,YAAA,EAAc,CAAC,MAAA,EAAQ,EAAE,UAAS,qBAChC,GAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,OAAA,kBACE,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA;AAAA,gBACA,WAAA;AAAA,gBACA,OAAA,EAAS;AAAA;AAAA,aACX;AAAA,YAEF,KAAA,EAAO,WAAW,MAAM;AAAA;AAAA,SAC1B;AAAA,QAEF,IAAA,EAAK,OAAA;AAAA,QACL,SAAA,kBAAW,GAAA,CAAC,cAAA,EAAA,EAAe,aAAA,EAAY,0BAAA,EAA2B,CAAA;AAAA,QAClE,aAAa,CAAA,MAAA,qBAAU,GAAA,CAACC,gBAAW,GAAG,MAAA,EAAQ,SAAQ,UAAA,EAAW;AAAA;AAAA;AACnE,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TemplateTypePicker.esm.js","sources":["../../../src/components/TemplateTypePicker/TemplateTypePicker.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport capitalize from 'lodash/capitalize';\nimport { Progress } from '@backstage/core-components';\nimport Box from '@material-ui/core/Box';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { useEntityTypeFilter } from '@backstage/plugin-catalog-react';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\n/**\n * The component to select the `type` of `Template` that you will see in the table.\n *\n * @public\n */\nexport const TemplateTypePicker = () => {\n const alertApi = useApi(alertApiRef);\n const { error, loading, availableTypes, selectedTypes, setSelectedTypes } =\n useEntityTypeFilter();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n if (loading) return <Progress />;\n\n if (!availableTypes) return null;\n\n if (error) {\n alertApi.post({\n message: `Failed to load entity types`,\n severity: 'error',\n });\n return null;\n }\n\n return (\n <Box pb={1} pt={1}>\n <Typography\n variant=\"button\"\n component=\"label\"\n htmlFor=\"categories-picker\"\n >\n {t('templateTypePicker.title')}\n </Typography>\n <Autocomplete<string, true>\n id=\"categories-picker\"\n multiple\n options={availableTypes}\n value={selectedTypes}\n onChange={(_: object, value: string[]) => setSelectedTypes(value)}\n renderOption={(option, { selected }) => (\n <FormControlLabel\n control={\n <Checkbox\n icon={icon}\n checkedIcon={checkedIcon}\n checked={selected}\n />\n }\n label={capitalize(option)}\n />\n )}\n size=\"small\"\n popupIcon={<ExpandMoreIcon data-testid=\"categories-picker-expand\" />}\n renderInput={params => <TextField {...params} variant=\"outlined\" />}\n />\n </Box>\n );\n};\n"],"names":["Autocomplete","TextField"],"mappings":";;;;;;;;;;;;;;;;;AAgCA,MAAM,IAAA,mBAAO,GAAA,CAAC,wBAAA,EAAA,EAAyB,QAAA,EAAS,OAAA,EAAQ,CAAA;AACxD,MAAM,WAAA,mBAAc,GAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAS,OAAA,EAAQ,CAAA;AAO5C,MAAM,qBAAqB,MAAM;AACtC,EAAA,MAAM,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,gBAAgB,aAAA,EAAe,gBAAA,KACrD,mBAAA,EAAoB;AACtB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,IAAI,OAAA,EAAS,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA;AAE9B,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAE5B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,CAAA,2BAAA,CAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EACd,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,QAAA;AAAA,QACR,SAAA,EAAU,OAAA;AAAA,QACV,OAAA,EAAQ,mBAAA;AAAA,QAEP,YAAE,0BAA0B;AAAA;AAAA,KAC/B;AAAA,oBACA,GAAA;AAAA,MAACA,eAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAG,mBAAA;AAAA,QACH,QAAA,EAAQ,IAAA;AAAA,QACR,OAAA,EAAS,cAAA;AAAA,QACT,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAU,CAAC,CAAA,EAAW,KAAA,KAAoB,iBAAiB,KAAK,CAAA;AAAA,QAChE,YAAA,EAAc,CAAC,MAAA,EAAQ,EAAE,UAAS,qBAChC,GAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,OAAA,kBACE,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA;AAAA,gBACA,WAAA;AAAA,gBACA,OAAA,EAAS;AAAA;AAAA,aACX;AAAA,YAEF,KAAA,EAAO,WAAW,MAAM;AAAA;AAAA,SAC1B;AAAA,QAEF,IAAA,EAAK,OAAA;AAAA,QACL,SAAA,kBAAW,GAAA,CAAC,cAAA,EAAA,EAAe,aAAA,EAAY,0BAAA,EAA2B,CAAA;AAAA,QAClE,aAAa,CAAA,MAAA,qBAAU,GAAA,CAACC,gBAAW,GAAG,MAAA,EAAQ,SAAQ,UAAA,EAAW;AAAA;AAAA;AACnE,GAAA,EACF,CAAA;AAEJ;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateFilters.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/TemplateFilters.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Link, MarkdownContent } from '@backstage/core-components';\nimport {\n ListTemplatingExtensionsResponse,\n TemplateFilter,\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 { ClassNameMap } from '@material-ui/core/styles/withStyles';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport classNames from 'classnames';\nimport { cloneElement, Fragment, ReactElement, useState } from 'react';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\nimport { inspectFunctionArgSchema } from './functionArgs';\nimport { Extension, renderFragment } from './navigation';\nimport { StyleClasses, TranslationMessages } from './types';\n\nconst FilterDetailContent = ({\n t,\n classes,\n name,\n filter,\n}: {\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n classes: ClassNameMap;\n name: string;\n filter: TemplateFilter;\n}) => {\n const expanded = useState<Expanded>({});\n if (!Object.keys(filter).length) {\n return (\n <Typography style={{ fontStyle: 'italic' }}>\n {t('templatingExtensions.content.filters.metadataAbsent')}\n </Typography>\n );\n }\n const schema = filter.schema;\n const partialSchemaRenderContext: Omit<SchemaRenderContext, 'parentId'> = {\n expanded,\n };\n return (\n <Fragment key={`${name}.detail`}>\n {filter.description && <MarkdownContent content={filter.description} />}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.schema.input')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.input`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.input ?? {}}\n />\n </Box>\n {schema?.arguments?.length && (\n <Box key={`${name}.args`} pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.schema.arguments')}\n </Typography>\n {schema.arguments.map((arg, i) => {\n const [argSchema, required] = inspectFunctionArgSchema(arg);\n\n return (\n <Fragment key={i}>\n <div\n className={classNames({ [classes.argRequired]: required })}\n >\n <Typography variant=\"h6\" component=\"h4\">\n {`[${i}]`}\n </Typography>\n </div>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.arg${i}`,\n ...partialSchemaRenderContext,\n }}\n schema={argSchema}\n />\n </Fragment>\n );\n })}\n </Box>\n )}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.schema.output')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.output ?? {}}\n />\n </Box>\n {filter.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={filter.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Fragment>\n );\n};\n\nexport const TemplateFilters = ({\n t,\n classes,\n filters,\n baseLink,\n selectedItem,\n}: {\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n classes: StyleClasses;\n filters: ListTemplatingExtensionsResponse['filters'];\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'filter') {\n return <></>;\n }\n if (!Object.keys(filters).length) {\n return (\n <div data-testid=\"no-filters\">\n {t('templatingExtensions.content.filters.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"filters\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: filters[selectedItem.name] }\n : filters,\n ).map(([name, filter]) => {\n const fragment = renderFragment({ kind: 'filter', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n <FilterDetailContent {...{ t, classes, name, filter }} />\n </Box>\n );\n })}\n </div>\n );\n};\n"],"names":["Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"TemplateFilters.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/TemplateFilters.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Link, MarkdownContent } from '@backstage/core-components';\nimport {\n ListTemplatingExtensionsResponse,\n TemplateFilter,\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 { ClassNameMap } from '@material-ui/core/styles/withStyles';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport classNames from 'classnames';\nimport { cloneElement, Fragment, ReactElement, useState } from 'react';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\nimport { inspectFunctionArgSchema } from './functionArgs';\nimport { Extension, renderFragment } from './navigation';\nimport { StyleClasses, TranslationMessages } from './types';\n\nconst FilterDetailContent = ({\n t,\n classes,\n name,\n filter,\n}: {\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n classes: ClassNameMap;\n name: string;\n filter: TemplateFilter;\n}) => {\n const expanded = useState<Expanded>({});\n if (!Object.keys(filter).length) {\n return (\n <Typography style={{ fontStyle: 'italic' }}>\n {t('templatingExtensions.content.filters.metadataAbsent')}\n </Typography>\n );\n }\n const schema = filter.schema;\n const partialSchemaRenderContext: Omit<SchemaRenderContext, 'parentId'> = {\n expanded,\n };\n return (\n <Fragment key={`${name}.detail`}>\n {filter.description && <MarkdownContent content={filter.description} />}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.schema.input')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.input`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.input ?? {}}\n />\n </Box>\n {schema?.arguments?.length && (\n <Box key={`${name}.args`} pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.schema.arguments')}\n </Typography>\n {schema.arguments.map((arg, i) => {\n const [argSchema, required] = inspectFunctionArgSchema(arg);\n\n return (\n <Fragment key={i}>\n <div\n className={classNames({ [classes.argRequired]: required })}\n >\n <Typography variant=\"h6\" component=\"h4\">\n {`[${i}]`}\n </Typography>\n </div>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.arg${i}`,\n ...partialSchemaRenderContext,\n }}\n schema={argSchema}\n />\n </Fragment>\n );\n })}\n </Box>\n )}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.schema.output')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.output ?? {}}\n />\n </Box>\n {filter.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={filter.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Fragment>\n );\n};\n\nexport const TemplateFilters = ({\n t,\n classes,\n filters,\n baseLink,\n selectedItem,\n}: {\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n classes: StyleClasses;\n filters: ListTemplatingExtensionsResponse['filters'];\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'filter') {\n return <></>;\n }\n if (!Object.keys(filters).length) {\n return (\n <div data-testid=\"no-filters\">\n {t('templatingExtensions.content.filters.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"filters\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: filters[selectedItem.name] }\n : filters,\n ).map(([name, filter]) => {\n const fragment = renderFragment({ kind: 'filter', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n <FilterDetailContent {...{ t, classes, name, filter }} />\n </Box>\n );\n })}\n </div>\n );\n};\n"],"names":["Fragment"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateGlobals.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/TemplateGlobals.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { CodeSnippet, Link, MarkdownContent } from '@backstage/core-components';\nimport {\n ListTemplatingExtensionsResponse,\n TemplateGlobalFunction,\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 { ClassNameMap } from '@material-ui/core/styles/withStyles';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport classNames from 'classnames';\nimport { cloneElement, Fragment, ReactElement, useState } from 'react';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\nimport { inspectFunctionArgSchema } from './functionArgs';\nimport { Extension, renderFragment } from './navigation';\nimport { TranslationMessages } from './types';\n\nconst FunctionDetailContent = ({\n classes,\n name,\n fn,\n t,\n}: {\n classes: ClassNameMap;\n name: string;\n fn: TemplateGlobalFunction;\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n}) => {\n const expanded = useState<Expanded>({});\n if (!Object.keys(fn).length) {\n return (\n <Typography\n style={{ fontStyle: 'italic' }}\n data-testid={`${name}.metadataAbsent`}\n >\n {t('templatingExtensions.content.functions.metadataAbsent')}\n </Typography>\n );\n }\n const schema = fn.schema;\n const partialSchemaRenderContext: Omit<SchemaRenderContext, 'parentId'> = {\n expanded,\n };\n return (\n <Fragment key={`${name}.detail`}>\n {fn.description && <MarkdownContent content={fn.description} />}\n {schema?.arguments?.length && (\n <Box key={`${name}.args`} pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.schema.arguments')}\n </Typography>\n {schema.arguments.map((arg, i) => {\n const [argSchema, required] = inspectFunctionArgSchema(arg);\n\n return (\n <Fragment key={i}>\n <div\n className={classNames({ [classes.argRequired]: required })}\n >\n <Typography\n variant=\"h6\"\n component=\"h4\"\n >{`[${i}]`}</Typography>\n </div>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.arg${i}`,\n ...partialSchemaRenderContext,\n }}\n schema={argSchema}\n />\n </Fragment>\n );\n })}\n </Box>\n )}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.schema.output')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.output ?? {}}\n />\n </Box>\n {fn.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={fn.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Fragment>\n );\n};\n\nexport const TemplateGlobalFunctions = ({\n classes,\n functions,\n t,\n baseLink,\n selectedItem,\n}: {\n classes: ClassNameMap;\n functions: ListTemplatingExtensionsResponse['globals']['functions'];\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'function') {\n return <></>;\n }\n if (!Object.keys(functions).length) {\n return (\n <div data-testid=\"no-functions\">\n {t('templatingExtensions.content.functions.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"functions\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: functions[selectedItem.name] }\n : functions,\n ).map(([name, fn]) => {\n const fragment = renderFragment({ kind: 'function', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n <FunctionDetailContent {...{ classes, name, fn, t }} />\n </Box>\n );\n })}\n </div>\n );\n};\n\nexport const TemplateGlobalValues = ({\n classes,\n t,\n values,\n baseLink,\n selectedItem,\n}: {\n classes: ClassNameMap;\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n values: ListTemplatingExtensionsResponse['globals']['values'];\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'value') {\n return <></>;\n }\n if (!Object.keys(values).length) {\n return (\n <div data-testid=\"no-values\">\n {t('templatingExtensions.content.values.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"values\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: values[selectedItem.name] }\n : values,\n ).map(([name, gv]) => {\n const fragment = renderFragment({ kind: 'value', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n {gv.description && <MarkdownContent content={gv.description} />}\n <Box padding={1} data-testid={`${name}.value`}>\n <CodeSnippet\n text={JSON.stringify(gv.value, null, 2)}\n showCopyCodeButton\n language=\"json\"\n />\n </Box>\n </Box>\n );\n })}\n </div>\n );\n};\n"],"names":["Fragment"],"mappings":";;;;;;;;;;;;;;;AAoCA,MAAM,wBAAwB,CAAC;AAAA,EAC7B,OAAA;AAAA,EACA,IAAA;AAAA,EACA,EAAA;AAAA,EACA;AACF,CAAA,KAKM;AACJ,EAAA,MAAM,QAAA,GAAW,QAAA,CAAmB,EAAE,CAAA;AACtC,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,EAAE,EAAE,MAAA,EAAQ;AAC3B,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,SAAA,EAAW,QAAA,EAAS;AAAA,QAC7B,aAAA,EAAa,GAAG,IAAI,CAAA,eAAA,CAAA;AAAA,QAEnB,YAAE,uDAAuD;AAAA;AAAA,KAC5D;AAAA,EAEJ;AACA,EAAA,MAAM,SAAS,EAAA,CAAG,MAAA;AAClB,EAAA,MAAM,0BAAA,GAAoE;AAAA,IACxE;AAAA,GACF;AACA,EAAA,uBACE,IAAA,CAACA,YAAA,EACE,QAAA,EAAA;AAAA,IAAA,EAAA,CAAG,WAAA,oBAAe,GAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAS,GAAG,WAAA,EAAa,CAAA;AAAA,IAC5D,QAAQ,SAAA,EAAW,MAAA,oBAClB,IAAA,CAAC,GAAA,EAAA,EAAyB,IAAI,CAAA,EAC5B,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,IAAA,EAAK,WAAU,IAAA,EAChC,QAAA,EAAA,CAAA,CAAE,yDAAyD,CAAA,EAC9D,CAAA;AAAA,MACC,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAC,KAAK,CAAA,KAAM;AAChC,QAAA,MAAM,CAAC,SAAA,EAAW,QAAQ,CAAA,GAAI,yBAAyB,GAAG,CAAA;AAE1D,QAAA,uBACE,IAAA,CAACA,YAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,WAAW,EAAE,CAAC,QAAQ,WAAW,GAAG,UAAU,CAAA;AAAA,cAEzD,QAAA,kBAAA,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,IAAA;AAAA,kBACR,SAAA,EAAU,IAAA;AAAA,kBACV,cAAI,CAAC,CAAA,CAAA;AAAA;AAAA;AAAI;AAAA,WACb;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,QAAA,EAAS,MAAA;AAAA,cACT,OAAA,EAAS;AAAA,gBACP,QAAA,EAAU,CAAA,EAAG,IAAI,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA;AAAA,gBACzB,GAAG;AAAA,eACL;AAAA,cACA,MAAA,EAAQ;AAAA;AAAA;AACV,SAAA,EAAA,EAhBa,CAiBf,CAAA;AAAA,MAEJ,CAAC;AAAA,KAAA,EAAA,EA3BO,CAAA,EAAG,IAAI,CAAA,KAAA,CA4BjB,CAAA;AAAA,oBAEF,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EACP,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,IAAA,EAAK,WAAU,IAAA,EAChC,QAAA,EAAA,CAAA,CAAE,sDAAsD,CAAA,EAC3D,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAS,MAAA;AAAA,UACT,OAAA,EAAS;AAAA,YACP,QAAA,EAAU,GAAG,IAAI,CAAA,OAAA,CAAA;AAAA,YACjB,GAAG;AAAA,WACL;AAAA,UACA,MAAA,EAAQ,MAAA,EAAQ,MAAA,IAAU;AAAC;AAAA;AAC7B,KAAA,EACF,CAAA;AAAA,IACC,EAAA,CAAG,QAAA,oBACF,IAAA,CAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,UAAA,kBAAY,GAAA,CAAC,cAAA,EAAA,EAAe,GAC5C,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAU,IAAA,EAChC,QAAA,EAAA,CAAA,CAAE,iDAAiD,GACtD,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,gBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EACP,QAAA,kBAAA,GAAA,CAAC,4BAAA,EAAA,EAA6B,QAAA,EAAU,EAAA,CAAG,QAAA,EAAU,CAAA,EACvD,CAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EAAA,EA1DW,CAAA,EAAG,IAAI,CAAA,OAAA,CA4DtB,CAAA;AAEJ,CAAA;AAEO,MAAM,0BAA0B,CAAC;AAAA,EACtC,OAAA;AAAA,EACA,SAAA;AAAA,EACA,CAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAMM;AACJ,EAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,IAAA,KAAS,UAAA,EAAY;AACpD,IAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAE,CAAA;AAAA,EACX;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,SAAS,EAAE,MAAA,EAAQ;AAClC,IAAA,2BACG,KAAA,EAAA,EAAI,aAAA,EAAY,cAAA,EACd,QAAA,EAAA,CAAA,CAAE,qDAAqD,CAAA,EAC1D,CAAA;AAAA,EAEJ;AACA,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAY,WAAA,EACd,QAAA,EAAA,MAAA,CAAO,OAAA;AAAA,IACN,YAAA,GACI,EAAE,CAAC,YAAA,CAAa,IAAI,GAAG,SAAA,CAAU,YAAA,CAAa,IAAI,CAAA,EAAE,GACpD;AAAA,IACJ,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,EAAE,CAAA,KAAM;AACpB,IAAA,MAAM,WAAW,cAAA,CAAe,EAAE,IAAA,EAAM,UAAA,EAAY,MAAM,CAAA;AAC1D,IAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EAAc,eAAa,IAAA,EAClC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,QAAA;AAAA,UACJ,OAAA,EAAQ,IAAA;AAAA,UACR,SAAA,EAAU,IAAA;AAAA,UACV,WAAW,OAAA,CAAQ,IAAA;AAAA,UAElB,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,MACC,aAAa,QAAA,EAAU;AAAA,QACtB,IAAI,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,EAAE,IAAI,QAAQ,CAAA;AAAA,OACrC,CAAA;AAAA,sBACD,GAAA,CAAC,yBAAuB,GAAG,EAAE,SAAS,IAAA,EAAM,EAAA,EAAI,GAAE,EAAG;AAAA,KAAA,EAAA,EAZtC,IAajB,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAEO,MAAM,uBAAuB,CAAC;AAAA,EACnC,OAAA;AAAA,EACA,CAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAMM;AACJ,EAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,IAAA,KAAS,OAAA,EAAS;AACjD,IAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAE,CAAA;AAAA,EACX;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,MAAM,EAAE,MAAA,EAAQ;AAC/B,IAAA,2BACG,KAAA,EAAA,EAAI,aAAA,EAAY,WAAA,EACd,QAAA,EAAA,CAAA,CAAE,kDAAkD,CAAA,EACvD,CAAA;AAAA,EAEJ;AACA,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAY,QAAA,EACd,QAAA,EAAA,MAAA,CAAO,OAAA;AAAA,IACN,YAAA,GACI,EAAE,CAAC,YAAA,CAAa,IAAI,GAAG,MAAA,CAAO,YAAA,CAAa,IAAI,CAAA,EAAE,GACjD;AAAA,IACJ,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,EAAE,CAAA,KAAM;AACpB,IAAA,MAAM,WAAW,cAAA,CAAe,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AACvD,IAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EAAc,eAAa,IAAA,EAClC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,QAAA;AAAA,UACJ,OAAA,EAAQ,IAAA;AAAA,UACR,SAAA,EAAU,IAAA;AAAA,UACV,WAAW,OAAA,CAAQ,IAAA;AAAA,UAElB,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,MACC,aAAa,QAAA,EAAU;AAAA,QACtB,IAAI,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,EAAE,IAAI,QAAQ,CAAA;AAAA,OACrC,CAAA;AAAA,MACA,GAAG,WAAA,oBAAe,GAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAS,GAAG,WAAA,EAAa,CAAA;AAAA,0BAC5D,GAAA,EAAA,EAAI,OAAA,EAAS,GAAG,aAAA,EAAa,CAAA,EAAG,IAAI,CAAA,MAAA,CAAA,EACnC,QAAA,kBAAA,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,MAAM,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,UACtC,kBAAA,EAAkB,IAAA;AAAA,UAClB,QAAA,EAAS;AAAA;AAAA,OACX,EACF;AAAA,KAAA,EAAA,EAnBe,IAoBjB,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TemplateGlobals.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/TemplateGlobals.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { CodeSnippet, Link, MarkdownContent } from '@backstage/core-components';\nimport {\n ListTemplatingExtensionsResponse,\n TemplateGlobalFunction,\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 { ClassNameMap } from '@material-ui/core/styles/withStyles';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport classNames from 'classnames';\nimport { cloneElement, Fragment, ReactElement, useState } from 'react';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\nimport { inspectFunctionArgSchema } from './functionArgs';\nimport { Extension, renderFragment } from './navigation';\nimport { TranslationMessages } from './types';\n\nconst FunctionDetailContent = ({\n classes,\n name,\n fn,\n t,\n}: {\n classes: ClassNameMap;\n name: string;\n fn: TemplateGlobalFunction;\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n}) => {\n const expanded = useState<Expanded>({});\n if (!Object.keys(fn).length) {\n return (\n <Typography\n style={{ fontStyle: 'italic' }}\n data-testid={`${name}.metadataAbsent`}\n >\n {t('templatingExtensions.content.functions.metadataAbsent')}\n </Typography>\n );\n }\n const schema = fn.schema;\n const partialSchemaRenderContext: Omit<SchemaRenderContext, 'parentId'> = {\n expanded,\n };\n return (\n <Fragment key={`${name}.detail`}>\n {fn.description && <MarkdownContent content={fn.description} />}\n {schema?.arguments?.length && (\n <Box key={`${name}.args`} pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.schema.arguments')}\n </Typography>\n {schema.arguments.map((arg, i) => {\n const [argSchema, required] = inspectFunctionArgSchema(arg);\n\n return (\n <Fragment key={i}>\n <div\n className={classNames({ [classes.argRequired]: required })}\n >\n <Typography\n variant=\"h6\"\n component=\"h4\"\n >{`[${i}]`}</Typography>\n </div>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.arg${i}`,\n ...partialSchemaRenderContext,\n }}\n schema={argSchema}\n />\n </Fragment>\n );\n })}\n </Box>\n )}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.schema.output')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.output ?? {}}\n />\n </Box>\n {fn.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={fn.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Fragment>\n );\n};\n\nexport const TemplateGlobalFunctions = ({\n classes,\n functions,\n t,\n baseLink,\n selectedItem,\n}: {\n classes: ClassNameMap;\n functions: ListTemplatingExtensionsResponse['globals']['functions'];\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'function') {\n return <></>;\n }\n if (!Object.keys(functions).length) {\n return (\n <div data-testid=\"no-functions\">\n {t('templatingExtensions.content.functions.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"functions\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: functions[selectedItem.name] }\n : functions,\n ).map(([name, fn]) => {\n const fragment = renderFragment({ kind: 'function', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n <FunctionDetailContent {...{ classes, name, fn, t }} />\n </Box>\n );\n })}\n </div>\n );\n};\n\nexport const TemplateGlobalValues = ({\n classes,\n t,\n values,\n baseLink,\n selectedItem,\n}: {\n classes: ClassNameMap;\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n values: ListTemplatingExtensionsResponse['globals']['values'];\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'value') {\n return <></>;\n }\n if (!Object.keys(values).length) {\n return (\n <div data-testid=\"no-values\">\n {t('templatingExtensions.content.values.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"values\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: values[selectedItem.name] }\n : values,\n ).map(([name, gv]) => {\n const fragment = renderFragment({ kind: 'value', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n {gv.description && <MarkdownContent content={gv.description} />}\n <Box padding={1} data-testid={`${name}.value`}>\n <CodeSnippet\n text={JSON.stringify(gv.value, null, 2)}\n showCopyCodeButton\n language=\"json\"\n />\n </Box>\n </Box>\n );\n })}\n </div>\n );\n};\n"],"names":["Fragment"],"mappings":"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"}