@backstage/plugin-scaffolder 1.34.0-next.3 → 1.34.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 (122) hide show
  1. package/CHANGELOG.md +22 -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/TemplateEditorPage/CustomFieldExplorer.esm.js.map +1 -1
  5. package/dist/alpha/components/TemplateEditorPage/CustomFieldPlayground.esm.js.map +1 -1
  6. package/dist/alpha/components/TemplateEditorPage/CustomFieldsPage.esm.js.map +1 -1
  7. package/dist/alpha/components/TemplateEditorPage/DirectoryEditorContext.esm.js +1 -1
  8. package/dist/alpha/components/TemplateEditorPage/DirectoryEditorContext.esm.js.map +1 -1
  9. package/dist/alpha/components/TemplateEditorPage/DryRunContext.esm.js +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 +1 -1
  19. package/dist/alpha/components/TemplateEditorPage/TemplateEditor.esm.js.map +1 -1
  20. package/dist/alpha/components/TemplateEditorPage/TemplateEditorBrowser.esm.js.map +1 -1
  21. package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js.map +1 -1
  22. package/dist/alpha/components/TemplateEditorPage/TemplateEditorIntro.esm.js.map +1 -1
  23. package/dist/alpha/components/TemplateEditorPage/TemplateEditorLayout.esm.js +1 -1
  24. package/dist/alpha/components/TemplateEditorPage/TemplateEditorLayout.esm.js.map +1 -1
  25. package/dist/alpha/components/TemplateEditorPage/TemplateEditorPage.esm.js.map +1 -1
  26. package/dist/alpha/components/TemplateEditorPage/TemplateEditorTextArea.esm.js.map +1 -1
  27. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js.map +1 -1
  28. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarFileMenu.esm.js.map +1 -1
  29. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarTemplatesMenu.esm.js.map +1 -1
  30. package/dist/alpha/components/TemplateEditorPage/TemplateFormPage.esm.js.map +1 -1
  31. package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js +1 -1
  32. package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js.map +1 -1
  33. package/dist/alpha/components/TemplateEditorPage/TemplateIntroPage.esm.js.map +1 -1
  34. package/dist/alpha/components/TemplateEditorPage/useTemplateDirectory.esm.js.map +1 -1
  35. package/dist/alpha/components/TemplateListPage/RegisterExistingButton.esm.js.map +1 -1
  36. package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js.map +1 -1
  37. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPage.esm.js.map +1 -1
  38. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js.map +1 -1
  39. package/dist/alpha/extensions.esm.js +1 -1
  40. package/dist/alpha/extensions.esm.js.map +1 -1
  41. package/dist/alpha/fields/RepoUrlPicker.esm.js.map +1 -1
  42. package/dist/alpha/hooks/useFormDecorators.esm.js.map +1 -1
  43. package/dist/alpha/hooks/useScaffolderTemplateIconLinkProps.esm.js.map +1 -1
  44. package/dist/alpha/plugin.esm.js +1 -1
  45. package/dist/alpha/plugin.esm.js.map +1 -1
  46. package/dist/alpha.d.ts +1 -1
  47. package/dist/api.esm.js.map +1 -1
  48. package/dist/components/ActionsPage/ActionsPage.esm.js.map +1 -1
  49. package/dist/components/FileBrowser/FileBrowser.esm.js +0 -3
  50. package/dist/components/FileBrowser/FileBrowser.esm.js.map +1 -1
  51. package/dist/components/ListTasksPage/ListTasksPage.esm.js.map +1 -1
  52. package/dist/components/ListTasksPage/OwnerListPicker.esm.js.map +1 -1
  53. package/dist/components/ListTasksPage/columns/CreatedAtColumn.esm.js.map +1 -1
  54. package/dist/components/ListTasksPage/columns/OwnerEntityColumn.esm.js.map +1 -1
  55. package/dist/components/ListTasksPage/columns/TaskStatusColumn.esm.js.map +1 -1
  56. package/dist/components/ListTasksPage/columns/TemplateTitleColumn.esm.js.map +1 -1
  57. package/dist/components/OngoingTask/ContextMenu.esm.js +1 -1
  58. package/dist/components/OngoingTask/ContextMenu.esm.js.map +1 -1
  59. package/dist/components/OngoingTask/OngoingTask.esm.js.map +1 -1
  60. package/dist/components/RenderSchema/RenderSchema.esm.js +1 -1
  61. package/dist/components/RenderSchema/RenderSchema.esm.js.map +1 -1
  62. package/dist/components/Router/Router.esm.js +1 -1
  63. package/dist/components/Router/Router.esm.js.map +1 -1
  64. package/dist/components/ScaffolderUsageExamplesTable/ScaffolderUsageExamplesTable.esm.js.map +1 -1
  65. package/dist/components/TemplateTypePicker/TemplateTypePicker.esm.js.map +1 -1
  66. package/dist/components/TemplatingExtensionsPage/TemplateFilters.esm.js.map +1 -1
  67. package/dist/components/TemplatingExtensionsPage/TemplateGlobals.esm.js.map +1 -1
  68. package/dist/components/TemplatingExtensionsPage/TemplatingExtensionsPage.esm.js.map +1 -1
  69. package/dist/components/TemplatingExtensionsPage/functionArgs.esm.js.map +1 -1
  70. package/dist/components/TemplatingExtensionsPage/navigation.esm.js.map +1 -1
  71. package/dist/components/fields/EntityNamePicker/EntityNamePicker.esm.js.map +1 -1
  72. package/dist/components/fields/EntityNamePicker/schema.esm.js.map +1 -1
  73. package/dist/components/fields/EntityNamePicker/validation.esm.js.map +1 -1
  74. package/dist/components/fields/EntityPicker/EntityPicker.esm.js.map +1 -1
  75. package/dist/components/fields/EntityPicker/schema.esm.js.map +1 -1
  76. package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js.map +1 -1
  77. package/dist/components/fields/EntityTagsPicker/schema.esm.js.map +1 -1
  78. package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js +1 -1
  79. package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js.map +1 -1
  80. package/dist/components/fields/MultiEntityPicker/schema.esm.js.map +1 -1
  81. package/dist/components/fields/MyGroupsPicker/MyGroupsPicker.esm.js.map +1 -1
  82. package/dist/components/fields/MyGroupsPicker/schema.esm.js.map +1 -1
  83. package/dist/components/fields/OwnedEntityPicker/OwnedEntityPicker.esm.js.map +1 -1
  84. package/dist/components/fields/OwnedEntityPicker/schema.esm.js.map +1 -1
  85. package/dist/components/fields/OwnerPicker/OwnerPicker.esm.js.map +1 -1
  86. package/dist/components/fields/OwnerPicker/schema.esm.js.map +1 -1
  87. package/dist/components/fields/RepoBranchPicker/BitbucketRepoBranchPicker.esm.js.map +1 -1
  88. package/dist/components/fields/RepoBranchPicker/DefaultRepoBranchPicker.esm.js.map +1 -1
  89. package/dist/components/fields/RepoBranchPicker/GitHubRepoBranchPicker.esm.js.map +1 -1
  90. package/dist/components/fields/RepoBranchPicker/RepoBranchPicker.esm.js.map +1 -1
  91. package/dist/components/fields/RepoBranchPicker/schema.esm.js.map +1 -1
  92. package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js.map +1 -1
  93. package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js.map +1 -1
  94. package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js.map +1 -1
  95. package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js.map +1 -1
  96. package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js.map +1 -1
  97. package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js.map +1 -1
  98. package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js.map +1 -1
  99. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerHost.esm.js.map +1 -1
  100. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js.map +1 -1
  101. package/dist/components/fields/RepoUrlPicker/schema.esm.js.map +1 -1
  102. package/dist/components/fields/RepoUrlPicker/utils.esm.js.map +1 -1
  103. package/dist/components/fields/RepoUrlPicker/validation.esm.js.map +1 -1
  104. package/dist/components/fields/SecretInput/SecretInput.esm.js.map +1 -1
  105. package/dist/components/fields/VirtualizedListbox.esm.js.map +1 -1
  106. package/dist/components/fields/utils.esm.js.map +1 -1
  107. package/dist/deprecated.esm.js.map +1 -1
  108. package/dist/extensions/default.esm.js +1 -1
  109. package/dist/extensions/default.esm.js.map +1 -1
  110. package/dist/lib/download/helpers.esm.js.map +1 -1
  111. package/dist/lib/filesystem/WebFileSystemAccess.esm.js.map +1 -1
  112. package/dist/lib/filesystem/WebFileSystemStore.esm.js.map +1 -1
  113. package/dist/lib/filesystem/createExampleTemplate.esm.js.map +1 -1
  114. package/dist/packages/opaque-internal/src/OpaqueType.esm.js.map +1 -1
  115. package/dist/packages/scaffolder-internal/src/wiring/InternalFormDecorator.esm.js.map +1 -1
  116. package/dist/packages/scaffolder-internal/src/wiring/InternalFormField.esm.js.map +1 -1
  117. package/dist/plugin.esm.js +3 -3
  118. package/dist/plugin.esm.js.map +1 -1
  119. package/dist/plugins/scaffolder/package.json.esm.js +1 -1
  120. package/dist/routes.esm.js.map +1 -1
  121. package/dist/translation.esm.js.map +1 -1
  122. package/package.json +22 -22
@@ -1 +1 @@
1
- {"version":3,"file":"TaskStatusStepper.esm.js","sources":["../../../../../src/alpha/components/TemplateEditorPage/DryRunResults/TaskStatusStepper.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState } from 'react';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport { memo } from 'react';\nimport Step from '@material-ui/core/Step';\nimport StepLabel from '@material-ui/core/StepLabel';\nimport Stepper from '@material-ui/core/Stepper';\nimport { ScaffolderTaskStatus } from '@backstage/plugin-scaffolder-react';\nimport StepButton from '@material-ui/core/StepButton';\nimport { StepIconProps } from '@material-ui/core/StepIcon';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport Cancel from '@material-ui/icons/Cancel';\nimport Check from '@material-ui/icons/Check';\nimport FiberManualRecordIcon from '@material-ui/icons/FiberManualRecord';\nimport Typography from '@material-ui/core/Typography';\nimport { DateTime, Interval } from 'luxon';\nimport useInterval from 'react-use/esm/useInterval';\nimport humanizeDuration from 'humanize-duration';\nimport classNames from 'classnames';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../../translation';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n },\n button: {\n marginBottom: theme.spacing(2),\n marginLeft: theme.spacing(2),\n },\n actionsContainer: {\n marginBottom: theme.spacing(2),\n },\n resetContainer: {\n padding: theme.spacing(3),\n },\n labelWrapper: {\n display: 'flex',\n flex: 1,\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n stepWrapper: {\n width: '100%',\n },\n }),\n);\n\ntype TaskStep = {\n id: string;\n name: string;\n status: ScaffolderTaskStatus;\n startedAt?: string;\n endedAt?: string;\n};\n\nconst useStepIconStyles = makeStyles(theme =>\n createStyles({\n root: {\n color: theme.palette.text.disabled,\n display: 'flex',\n height: 22,\n alignItems: 'center',\n },\n completed: {\n color: theme.palette.status.ok,\n },\n error: {\n color: theme.palette.status.error,\n },\n }),\n);\n\nconst StepTimeTicker = ({ step }: { step: TaskStep }) => {\n const [time, setTime] = useState('');\n\n useInterval(() => {\n if (!step.startedAt) {\n setTime('');\n return;\n }\n\n const end = step.endedAt\n ? DateTime.fromISO(step.endedAt)\n : DateTime.local();\n\n const startedAt = DateTime.fromISO(step.startedAt);\n const formatted = Interval.fromDateTimes(startedAt, end)\n .toDuration()\n .valueOf();\n\n setTime(humanizeDuration(formatted, { round: true }));\n }, 1000);\n\n return <Typography variant=\"caption\">{time}</Typography>;\n};\n\nfunction TaskStepIconComponent(props: StepIconProps) {\n const classes = useStepIconStyles();\n const { active, completed, error } = props;\n\n const getMiddle = () => {\n if (active) {\n return <CircularProgress size=\"24px\" />;\n }\n if (completed) {\n return <Check />;\n }\n if (error) {\n return <Cancel />;\n }\n return <FiberManualRecordIcon />;\n };\n\n return (\n <div\n className={classNames(classes.root, {\n [classes.completed]: completed,\n [classes.error]: error,\n })}\n >\n {getMiddle()}\n </div>\n );\n}\n\nexport const TaskStatusStepper = memo(\n (props: {\n steps: TaskStep[];\n currentStepId: string | undefined;\n onUserStepChange: (id: string) => void;\n classes?: {\n root?: string;\n };\n }) => {\n const { steps, currentStepId, onUserStepChange } = props;\n const classes = useStyles(props);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n return (\n <div className={classes.root}>\n <Stepper\n activeStep={steps.findIndex(s => s.id === currentStepId)}\n orientation=\"vertical\"\n nonLinear\n >\n {steps.map((step, index) => {\n const isCancelled = step.status === 'cancelled';\n const isActive = step.status === 'processing';\n const isCompleted = step.status === 'completed';\n const isFailed = step.status === 'failed';\n const isSkipped = step.status === 'skipped';\n\n return (\n <Step key={String(index)} expanded>\n <StepButton onClick={() => onUserStepChange(step.id)}>\n <StepLabel\n StepIconProps={{\n completed: isCompleted,\n error: isFailed || isCancelled,\n active: isActive,\n }}\n StepIconComponent={TaskStepIconComponent}\n className={classes.stepWrapper}\n >\n <div className={classes.labelWrapper}>\n <Typography variant=\"subtitle2\">{step.name}</Typography>\n {isSkipped ? (\n <Typography variant=\"caption\">\n {t(\n 'templateEditorPage.taskStatusStepper.skippedStepTitle',\n )}\n </Typography>\n ) : (\n <StepTimeTicker step={step} />\n )}\n </div>\n </StepLabel>\n </StepButton>\n </Step>\n );\n })}\n </Stepper>\n </div>\n );\n },\n);\n"],"names":["Check"],"mappings":"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"}
1
+ {"version":3,"file":"TaskStatusStepper.esm.js","sources":["../../../../../src/alpha/components/TemplateEditorPage/DryRunResults/TaskStatusStepper.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState } from 'react';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport { memo } from 'react';\nimport Step from '@material-ui/core/Step';\nimport StepLabel from '@material-ui/core/StepLabel';\nimport Stepper from '@material-ui/core/Stepper';\nimport { ScaffolderTaskStatus } from '@backstage/plugin-scaffolder-react';\nimport StepButton from '@material-ui/core/StepButton';\nimport { StepIconProps } from '@material-ui/core/StepIcon';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport Cancel from '@material-ui/icons/Cancel';\nimport Check from '@material-ui/icons/Check';\nimport FiberManualRecordIcon from '@material-ui/icons/FiberManualRecord';\nimport Typography from '@material-ui/core/Typography';\nimport { DateTime, Interval } from 'luxon';\nimport useInterval from 'react-use/esm/useInterval';\nimport humanizeDuration from 'humanize-duration';\nimport classNames from 'classnames';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../../translation';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n },\n button: {\n marginBottom: theme.spacing(2),\n marginLeft: theme.spacing(2),\n },\n actionsContainer: {\n marginBottom: theme.spacing(2),\n },\n resetContainer: {\n padding: theme.spacing(3),\n },\n labelWrapper: {\n display: 'flex',\n flex: 1,\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n stepWrapper: {\n width: '100%',\n },\n }),\n);\n\ntype TaskStep = {\n id: string;\n name: string;\n status: ScaffolderTaskStatus;\n startedAt?: string;\n endedAt?: string;\n};\n\nconst useStepIconStyles = makeStyles(theme =>\n createStyles({\n root: {\n color: theme.palette.text.disabled,\n display: 'flex',\n height: 22,\n alignItems: 'center',\n },\n completed: {\n color: theme.palette.status.ok,\n },\n error: {\n color: theme.palette.status.error,\n },\n }),\n);\n\nconst StepTimeTicker = ({ step }: { step: TaskStep }) => {\n const [time, setTime] = useState('');\n\n useInterval(() => {\n if (!step.startedAt) {\n setTime('');\n return;\n }\n\n const end = step.endedAt\n ? DateTime.fromISO(step.endedAt)\n : DateTime.local();\n\n const startedAt = DateTime.fromISO(step.startedAt);\n const formatted = Interval.fromDateTimes(startedAt, end)\n .toDuration()\n .valueOf();\n\n setTime(humanizeDuration(formatted, { round: true }));\n }, 1000);\n\n return <Typography variant=\"caption\">{time}</Typography>;\n};\n\nfunction TaskStepIconComponent(props: StepIconProps) {\n const classes = useStepIconStyles();\n const { active, completed, error } = props;\n\n const getMiddle = () => {\n if (active) {\n return <CircularProgress size=\"24px\" />;\n }\n if (completed) {\n return <Check />;\n }\n if (error) {\n return <Cancel />;\n }\n return <FiberManualRecordIcon />;\n };\n\n return (\n <div\n className={classNames(classes.root, {\n [classes.completed]: completed,\n [classes.error]: error,\n })}\n >\n {getMiddle()}\n </div>\n );\n}\n\nexport const TaskStatusStepper = memo(\n (props: {\n steps: TaskStep[];\n currentStepId: string | undefined;\n onUserStepChange: (id: string) => void;\n classes?: {\n root?: string;\n };\n }) => {\n const { steps, currentStepId, onUserStepChange } = props;\n const classes = useStyles(props);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n return (\n <div className={classes.root}>\n <Stepper\n activeStep={steps.findIndex(s => s.id === currentStepId)}\n orientation=\"vertical\"\n nonLinear\n >\n {steps.map((step, index) => {\n const isCancelled = step.status === 'cancelled';\n const isActive = step.status === 'processing';\n const isCompleted = step.status === 'completed';\n const isFailed = step.status === 'failed';\n const isSkipped = step.status === 'skipped';\n\n return (\n <Step key={String(index)} expanded>\n <StepButton onClick={() => onUserStepChange(step.id)}>\n <StepLabel\n StepIconProps={{\n completed: isCompleted,\n error: isFailed || isCancelled,\n active: isActive,\n }}\n StepIconComponent={TaskStepIconComponent}\n className={classes.stepWrapper}\n >\n <div className={classes.labelWrapper}>\n <Typography variant=\"subtitle2\">{step.name}</Typography>\n {isSkipped ? (\n <Typography variant=\"caption\">\n {t(\n 'templateEditorPage.taskStatusStepper.skippedStepTitle',\n )}\n </Typography>\n ) : (\n <StepTimeTicker step={step} />\n )}\n </div>\n </StepLabel>\n </StepButton>\n </Step>\n );\n })}\n </Stepper>\n </div>\n );\n },\n);\n"],"names":["Check"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { useRouteRef } from '@backstage/core-plugin-api';
5
5
  import { editRouteRef } from '../../../routes.esm.js';
6
6
  import { useTemplateDirectory } from './useTemplateDirectory.esm.js';
7
7
  import { DirectoryEditorProvider } from './DirectoryEditorContext.esm.js';
8
- import { TemplateEditorLayout, TemplateEditorLayoutToolbar, TemplateEditorLayoutBrowser, TemplateEditorPanels, TemplateEditorLayoutFiles, TemplateEditorLayoutPreview, TemplateEditorLayoutConsole } from './TemplateEditorLayout.esm.js';
8
+ import { TemplateEditorLayout, TemplateEditorLayoutToolbar, TemplateEditorLayoutBrowser, TemplateEditorPanels, TemplateEditorLayoutPreview, TemplateEditorLayoutFiles, TemplateEditorLayoutConsole } from './TemplateEditorLayout.esm.js';
9
9
  import { TemplateEditorToolbar } from './TemplateEditorToolbar.esm.js';
10
10
  import { TemplateEditorToolbarFileMenu } from './TemplateEditorToolbarFileMenu.esm.js';
11
11
  import { TemplateEditorBrowser } from './TemplateEditorBrowser.esm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateEditor.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditor.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 { useCallback, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport type {\n FormProps,\n LayoutOptions,\n FieldExtensionOptions,\n} from '@backstage/plugin-scaffolder-react';\n\nimport { editRouteRef } from '../../../routes';\n\nimport { useTemplateDirectory } from './useTemplateDirectory';\nimport { DirectoryEditorProvider } from './DirectoryEditorContext';\nimport {\n TemplateEditorLayout,\n TemplateEditorLayoutToolbar,\n TemplateEditorLayoutBrowser,\n TemplateEditorLayoutFiles,\n TemplateEditorLayoutPreview,\n TemplateEditorLayoutConsole,\n TemplateEditorPanels,\n} from './TemplateEditorLayout';\nimport { TemplateEditorToolbar } from './TemplateEditorToolbar';\nimport { TemplateEditorToolbarFileMenu } from './TemplateEditorToolbarFileMenu';\nimport { TemplateEditorBrowser } from './TemplateEditorBrowser';\nimport { TemplateEditorTextArea } from './TemplateEditorTextArea';\nimport { TemplateEditorForm } from './TemplateEditorForm';\nimport { DryRunProvider } from './DryRunContext';\nimport { DryRunResults } from './DryRunResults';\n\n/** @public */\nexport type ScaffolderTemplateEditorClassKey =\n | 'root'\n | 'toolbar'\n | 'browser'\n | 'editor'\n | 'preview'\n | 'results';\n\nexport const TemplateEditor = (props: {\n layouts?: LayoutOptions[];\n formProps?: FormProps;\n fieldExtensions?: FieldExtensionOptions<any, any>[];\n}) => {\n const { layouts, formProps, fieldExtensions } = props;\n const [errorText, setErrorText] = useState<string>();\n const navigate = useNavigate();\n const editLink = useRouteRef(editRouteRef);\n const {\n directory,\n openDirectory: handleOpenDirectory,\n createDirectory: handleCreateDirectory,\n closeDirectory,\n } = useTemplateDirectory();\n\n const handleCloseDirectory = useCallback(() => {\n closeDirectory().then(() => navigate(editLink()));\n }, [closeDirectory, navigate, editLink]);\n\n return (\n <DirectoryEditorProvider directory={directory}>\n <DryRunProvider>\n <TemplateEditorLayout>\n <TemplateEditorLayoutToolbar>\n <TemplateEditorToolbar fieldExtensions={fieldExtensions}>\n <TemplateEditorToolbarFileMenu\n onOpenDirectory={handleOpenDirectory}\n onCreateDirectory={handleCreateDirectory}\n onCloseDirectory={handleCloseDirectory}\n />\n </TemplateEditorToolbar>\n </TemplateEditorLayoutToolbar>\n <TemplateEditorLayoutBrowser>\n <TemplateEditorBrowser onClose={closeDirectory} />\n </TemplateEditorLayoutBrowser>\n <TemplateEditorPanels\n autoSaveId=\"template-editor\"\n files={\n <TemplateEditorLayoutFiles>\n <TemplateEditorTextArea.DirectoryEditor errorText={errorText} />\n </TemplateEditorLayoutFiles>\n }\n preview={\n <TemplateEditorLayoutPreview>\n <TemplateEditorForm.DirectoryEditorDryRun\n setErrorText={setErrorText}\n fieldExtensions={fieldExtensions}\n layouts={layouts}\n formProps={formProps}\n />\n </TemplateEditorLayoutPreview>\n }\n />\n <TemplateEditorLayoutConsole>\n <DryRunResults />\n </TemplateEditorLayoutConsole>\n </TemplateEditorLayout>\n </DryRunProvider>\n </DirectoryEditorProvider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAuDa,MAAA,cAAA,GAAiB,CAAC,KAIzB,KAAA;AACJ,EAAA,MAAM,EAAE,OAAA,EAAS,SAAW,EAAA,eAAA,EAAoB,GAAA,KAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAiB,EAAA;AACnD,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAM,MAAA,QAAA,GAAW,YAAY,YAAY,CAAA;AACzC,EAAM,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,aAAe,EAAA,mBAAA;AAAA,IACf,eAAiB,EAAA,qBAAA;AAAA,IACjB;AAAA,MACE,oBAAqB,EAAA;AAEzB,EAAM,MAAA,oBAAA,GAAuB,YAAY,MAAM;AAC7C,IAAA,cAAA,GAAiB,IAAK,CAAA,MAAM,QAAS,CAAA,QAAA,EAAU,CAAC,CAAA;AAAA,GAC/C,EAAA,CAAC,cAAgB,EAAA,QAAA,EAAU,QAAQ,CAAC,CAAA;AAEvC,EAAA,2BACG,uBAAwB,EAAA,EAAA,SAAA,EACvB,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA,EACC,+BAAC,oBACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,2BAAA,EAAA,EACC,QAAC,kBAAA,GAAA,CAAA,qBAAA,EAAA,EAAsB,eACrB,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,6BAAA;AAAA,MAAA;AAAA,QACC,eAAiB,EAAA,mBAAA;AAAA,QACjB,iBAAmB,EAAA,qBAAA;AAAA,QACnB,gBAAkB,EAAA;AAAA;AAAA,OAEtB,CACF,EAAA,CAAA;AAAA,wBACC,2BACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,qBAAsB,EAAA,EAAA,OAAA,EAAS,gBAAgB,CAClD,EAAA,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,UAAW,EAAA,iBAAA;AAAA,QACX,KAAA,sBACG,yBACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,uBAAuB,eAAvB,EAAA,EAAuC,WAAsB,CAChE,EAAA,CAAA;AAAA,QAEF,OAAA,sBACG,2BACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,kBAAmB,CAAA,qBAAA;AAAA,UAAnB;AAAA,YACC,YAAA;AAAA,YACA,eAAA;AAAA,YACA,OAAA;AAAA,YACA;AAAA;AAAA,SAEJ,EAAA;AAAA;AAAA,KAEJ;AAAA,oBACC,GAAA,CAAA,2BAAA,EAAA,EACC,QAAC,kBAAA,GAAA,CAAA,aAAA,EAAA,EAAc,CACjB,EAAA;AAAA,GAAA,EACF,GACF,CACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TemplateEditor.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditor.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 { useCallback, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport type {\n FormProps,\n LayoutOptions,\n FieldExtensionOptions,\n} from '@backstage/plugin-scaffolder-react';\n\nimport { editRouteRef } from '../../../routes';\n\nimport { useTemplateDirectory } from './useTemplateDirectory';\nimport { DirectoryEditorProvider } from './DirectoryEditorContext';\nimport {\n TemplateEditorLayout,\n TemplateEditorLayoutToolbar,\n TemplateEditorLayoutBrowser,\n TemplateEditorLayoutFiles,\n TemplateEditorLayoutPreview,\n TemplateEditorLayoutConsole,\n TemplateEditorPanels,\n} from './TemplateEditorLayout';\nimport { TemplateEditorToolbar } from './TemplateEditorToolbar';\nimport { TemplateEditorToolbarFileMenu } from './TemplateEditorToolbarFileMenu';\nimport { TemplateEditorBrowser } from './TemplateEditorBrowser';\nimport { TemplateEditorTextArea } from './TemplateEditorTextArea';\nimport { TemplateEditorForm } from './TemplateEditorForm';\nimport { DryRunProvider } from './DryRunContext';\nimport { DryRunResults } from './DryRunResults';\n\n/** @public */\nexport type ScaffolderTemplateEditorClassKey =\n | 'root'\n | 'toolbar'\n | 'browser'\n | 'editor'\n | 'preview'\n | 'results';\n\nexport const TemplateEditor = (props: {\n layouts?: LayoutOptions[];\n formProps?: FormProps;\n fieldExtensions?: FieldExtensionOptions<any, any>[];\n}) => {\n const { layouts, formProps, fieldExtensions } = props;\n const [errorText, setErrorText] = useState<string>();\n const navigate = useNavigate();\n const editLink = useRouteRef(editRouteRef);\n const {\n directory,\n openDirectory: handleOpenDirectory,\n createDirectory: handleCreateDirectory,\n closeDirectory,\n } = useTemplateDirectory();\n\n const handleCloseDirectory = useCallback(() => {\n closeDirectory().then(() => navigate(editLink()));\n }, [closeDirectory, navigate, editLink]);\n\n return (\n <DirectoryEditorProvider directory={directory}>\n <DryRunProvider>\n <TemplateEditorLayout>\n <TemplateEditorLayoutToolbar>\n <TemplateEditorToolbar fieldExtensions={fieldExtensions}>\n <TemplateEditorToolbarFileMenu\n onOpenDirectory={handleOpenDirectory}\n onCreateDirectory={handleCreateDirectory}\n onCloseDirectory={handleCloseDirectory}\n />\n </TemplateEditorToolbar>\n </TemplateEditorLayoutToolbar>\n <TemplateEditorLayoutBrowser>\n <TemplateEditorBrowser onClose={closeDirectory} />\n </TemplateEditorLayoutBrowser>\n <TemplateEditorPanels\n autoSaveId=\"template-editor\"\n files={\n <TemplateEditorLayoutFiles>\n <TemplateEditorTextArea.DirectoryEditor errorText={errorText} />\n </TemplateEditorLayoutFiles>\n }\n preview={\n <TemplateEditorLayoutPreview>\n <TemplateEditorForm.DirectoryEditorDryRun\n setErrorText={setErrorText}\n fieldExtensions={fieldExtensions}\n layouts={layouts}\n formProps={formProps}\n />\n </TemplateEditorLayoutPreview>\n }\n />\n <TemplateEditorLayoutConsole>\n <DryRunResults />\n </TemplateEditorLayoutConsole>\n </TemplateEditorLayout>\n </DryRunProvider>\n </DirectoryEditorProvider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAuDO,MAAM,cAAA,GAAiB,CAAC,KAAA,KAIzB;AACJ,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,eAAA,EAAgB,GAAI,KAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAA,EAAiB;AACnD,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,QAAA,GAAW,YAAY,YAAY,CAAA;AACzC,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,aAAA,EAAe,mBAAA;AAAA,IACf,eAAA,EAAiB,qBAAA;AAAA,IACjB;AAAA,MACE,oBAAA,EAAqB;AAEzB,EAAA,MAAM,oBAAA,GAAuB,YAAY,MAAM;AAC7C,IAAA,cAAA,GAAiB,IAAA,CAAK,MAAM,QAAA,CAAS,QAAA,EAAU,CAAC,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,cAAA,EAAgB,QAAA,EAAU,QAAQ,CAAC,CAAA;AAEvC,EAAA,2BACG,uBAAA,EAAA,EAAwB,SAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EACC,+BAAC,oBAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,2BAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,qBAAA,EAAA,EAAsB,eAAA,EACrB,QAAA,kBAAA,GAAA;AAAA,MAAC,6BAAA;AAAA,MAAA;AAAA,QACC,eAAA,EAAiB,mBAAA;AAAA,QACjB,iBAAA,EAAmB,qBAAA;AAAA,QACnB,gBAAA,EAAkB;AAAA;AAAA,OAEtB,CAAA,EACF,CAAA;AAAA,wBACC,2BAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,qBAAA,EAAA,EAAsB,OAAA,EAAS,gBAAgB,CAAA,EAClD,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAW,iBAAA;AAAA,QACX,KAAA,sBACG,yBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,uBAAuB,eAAA,EAAvB,EAAuC,WAAsB,CAAA,EAChE,CAAA;AAAA,QAEF,OAAA,sBACG,2BAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,UAAC,kBAAA,CAAmB,qBAAA;AAAA,UAAnB;AAAA,YACC,YAAA;AAAA,YACA,eAAA;AAAA,YACA,OAAA;AAAA,YACA;AAAA;AAAA,SACF,EACF;AAAA;AAAA,KAEJ;AAAA,oBACA,GAAA,CAAC,2BAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,CAAA,EACjB;AAAA,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateEditorBrowser.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorBrowser.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 Grid from '@material-ui/core/Grid';\nimport Divider from '@material-ui/core/Divider';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { makeStyles } from '@material-ui/core/styles';\nimport CloseIcon from '@material-ui/icons/Close';\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport SaveIcon from '@material-ui/icons/Save';\nimport { useDirectoryEditor } from './DirectoryEditorContext';\nimport { FileBrowser } from '../../../components/FileBrowser';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nconst useStyles = makeStyles(\n theme => ({\n grid: {\n '& svg': {\n margin: theme.spacing(1),\n },\n },\n closeButton: {\n marginLeft: 'auto',\n },\n }),\n { name: 'ScaffolderTemplateEditorBrowser' },\n);\n\n/** The local file browser for the template editor */\nexport function TemplateEditorBrowser(props: { onClose?: () => void }) {\n const classes = useStyles();\n const directoryEditor = useDirectoryEditor();\n const changedFiles = directoryEditor?.files.filter(file => file.dirty);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const handleClose = () => {\n if (!props.onClose) {\n return;\n }\n if (changedFiles?.length) {\n // eslint-disable-next-line no-alert\n const accepted = window.confirm(\n t('templateEditorPage.templateEditorBrowser.closeConfirmMessage'),\n );\n if (!accepted) {\n return;\n }\n }\n props.onClose();\n };\n\n if (!directoryEditor) {\n return null;\n }\n\n return (\n <>\n <Grid className={classes.grid} container spacing={0} alignItems=\"center\">\n <Tooltip\n title={t('templateEditorPage.templateEditorBrowser.saveIconTooltip')}\n >\n <IconButton\n size=\"small\"\n disabled={directoryEditor.files.every(file => !file.dirty)}\n onClick={() => directoryEditor.save()}\n >\n <SaveIcon />\n </IconButton>\n </Tooltip>\n <Tooltip\n title={t(\n 'templateEditorPage.templateEditorBrowser.reloadIconTooltip',\n )}\n >\n <IconButton size=\"small\" onClick={() => directoryEditor.reload()}>\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n <Tooltip\n title={t('templateEditorPage.templateEditorBrowser.closeIconTooltip')}\n >\n <IconButton\n size=\"small\"\n className={classes.closeButton}\n onClick={handleClose}\n >\n <CloseIcon />\n </IconButton>\n </Tooltip>\n </Grid>\n <Divider />\n <FileBrowser\n selected={directoryEditor.selectedFile?.path ?? ''}\n onSelect={directoryEditor.setSelectedFile}\n filePaths={directoryEditor.files.map(file => file.path) ?? []}\n />\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateEditorBrowser.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorBrowser.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 Grid from '@material-ui/core/Grid';\nimport Divider from '@material-ui/core/Divider';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { makeStyles } from '@material-ui/core/styles';\nimport CloseIcon from '@material-ui/icons/Close';\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport SaveIcon from '@material-ui/icons/Save';\nimport { useDirectoryEditor } from './DirectoryEditorContext';\nimport { FileBrowser } from '../../../components/FileBrowser';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nconst useStyles = makeStyles(\n theme => ({\n grid: {\n '& svg': {\n margin: theme.spacing(1),\n },\n },\n closeButton: {\n marginLeft: 'auto',\n },\n }),\n { name: 'ScaffolderTemplateEditorBrowser' },\n);\n\n/** The local file browser for the template editor */\nexport function TemplateEditorBrowser(props: { onClose?: () => void }) {\n const classes = useStyles();\n const directoryEditor = useDirectoryEditor();\n const changedFiles = directoryEditor?.files.filter(file => file.dirty);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const handleClose = () => {\n if (!props.onClose) {\n return;\n }\n if (changedFiles?.length) {\n // eslint-disable-next-line no-alert\n const accepted = window.confirm(\n t('templateEditorPage.templateEditorBrowser.closeConfirmMessage'),\n );\n if (!accepted) {\n return;\n }\n }\n props.onClose();\n };\n\n if (!directoryEditor) {\n return null;\n }\n\n return (\n <>\n <Grid className={classes.grid} container spacing={0} alignItems=\"center\">\n <Tooltip\n title={t('templateEditorPage.templateEditorBrowser.saveIconTooltip')}\n >\n <IconButton\n size=\"small\"\n disabled={directoryEditor.files.every(file => !file.dirty)}\n onClick={() => directoryEditor.save()}\n >\n <SaveIcon />\n </IconButton>\n </Tooltip>\n <Tooltip\n title={t(\n 'templateEditorPage.templateEditorBrowser.reloadIconTooltip',\n )}\n >\n <IconButton size=\"small\" onClick={() => directoryEditor.reload()}>\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n <Tooltip\n title={t('templateEditorPage.templateEditorBrowser.closeIconTooltip')}\n >\n <IconButton\n size=\"small\"\n className={classes.closeButton}\n onClick={handleClose}\n >\n <CloseIcon />\n </IconButton>\n </Tooltip>\n </Grid>\n <Divider />\n <FileBrowser\n selected={directoryEditor.selectedFile?.path ?? ''}\n onSelect={directoryEditor.setSelectedFile}\n filePaths={directoryEditor.files.map(file => file.path) ?? []}\n />\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateEditorForm.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorForm.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 { useApiHolder } from '@backstage/core-plugin-api';\nimport { JsonObject, JsonValue } from '@backstage/types';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from '@material-ui/core/Typography';\nimport { Component, ReactNode, useMemo, useState } from 'react';\nimport useDebounce from 'react-use/esm/useDebounce';\nimport yaml from 'yaml';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport {\n LayoutOptions,\n TemplateParameterSchema,\n FieldExtensionOptions,\n FormProps,\n} from '@backstage/plugin-scaffolder-react';\nimport {\n Stepper,\n createAsyncValidators,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { useDryRun } from './DryRunContext';\nimport { useDirectoryEditor } from './DirectoryEditorContext';\n\nimport { scaffolderTranslationRef } from '../../../translation';\n\nconst useStyles = makeStyles({\n containerWrapper: {\n width: '100%',\n },\n});\n\ninterface ErrorBoundaryProps {\n invalidator: unknown;\n setErrorText(errorText: string | undefined): void;\n children: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n shouldRender: boolean;\n}\n\nclass ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state = {\n shouldRender: true,\n };\n\n componentDidUpdate(prevProps: { invalidator: unknown }) {\n if (prevProps.invalidator !== this.props.invalidator) {\n this.setState({ shouldRender: true });\n }\n }\n\n componentDidCatch(error: Error) {\n this.props.setErrorText(error.message);\n this.setState({ shouldRender: false });\n }\n\n render() {\n return this.state.shouldRender ? this.props.children : null;\n }\n}\n\ninterface TemplateEditorFormProps {\n content?: string;\n /** Setting this to true will cause the content to be parsed as if it is the template entity spec */\n contentIsSpec?: boolean;\n setErrorText: (errorText?: string) => void;\n\n onDryRun?: (data: JsonObject) => Promise<void>;\n fieldExtensions?: FieldExtensionOptions<any, any>[];\n layouts?: LayoutOptions[];\n formProps?: FormProps;\n}\n\nfunction isJsonObject(value: JsonValue | undefined): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Shows the a template form that is parsed from the provided content */\nexport function TemplateEditorForm(props: TemplateEditorFormProps) {\n const {\n content,\n contentIsSpec,\n onDryRun,\n setErrorText,\n fieldExtensions = [],\n layouts = [],\n } = props;\n const classes = useStyles();\n const apiHolder = useApiHolder();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const [steps, setSteps] = useState<TemplateParameterSchema['steps']>();\n\n const fields = useMemo(() => {\n return Object.fromEntries(\n fieldExtensions.map(({ name, component }) => [name, component]),\n );\n }, [fieldExtensions]);\n\n useDebounce(\n () => {\n try {\n if (!content) {\n setSteps(undefined);\n return;\n }\n const parsed: JsonValue = yaml\n .parseAllDocuments(content)\n .filter(c => c)\n .map(c => c.toJSON())[0];\n\n if (!isJsonObject(parsed)) {\n setSteps(undefined);\n return;\n }\n\n let rootObj = parsed;\n if (!contentIsSpec) {\n const isTemplate =\n String(parsed.kind).toLocaleLowerCase('en-US') === 'template';\n if (!isTemplate) {\n setSteps(undefined);\n return;\n }\n\n rootObj = isJsonObject(parsed.spec) ? parsed.spec : {};\n }\n\n const { parameters } = rootObj;\n\n if (!Array.isArray(parameters)) {\n setErrorText('Template parameters must be an array');\n setSteps(undefined);\n return;\n }\n\n const fieldValidators = Object.fromEntries(\n fieldExtensions.map(({ name, validation }) => [name, validation]),\n );\n\n setErrorText();\n setSteps(\n parameters.flatMap(param =>\n isJsonObject(param)\n ? [\n {\n title: String(param.title),\n schema: param,\n validate: createAsyncValidators(param, fieldValidators, {\n apiHolder,\n }),\n },\n ]\n : [],\n ),\n );\n } catch (e) {\n setErrorText(e.message);\n }\n },\n 250,\n [contentIsSpec, content, apiHolder],\n );\n\n return (\n <div className={classes.containerWrapper}>\n {steps ? (\n <Paper variant=\"outlined\">\n <ErrorBoundary invalidator={steps} setErrorText={setErrorText}>\n <Stepper\n manifest={{ steps, title: 'Template Editor' }}\n extensions={fieldExtensions}\n components={fields}\n onCreate={async options => {\n await onDryRun?.(options);\n }}\n layouts={layouts}\n formProps={props.formProps}\n />\n </ErrorBoundary>\n </Paper>\n ) : (\n <Typography variant=\"body1\" color=\"textSecondary\">\n {t('templateEditorForm.stepper.emptyText')}\n </Typography>\n )}\n </div>\n );\n}\n\n/** A version of the TemplateEditorForm that is connected to the DirectoryEditor and DryRun contexts */\nexport function TemplateEditorFormDirectoryEditorDryRun(\n props: Pick<\n TemplateEditorFormProps,\n 'setErrorText' | 'fieldExtensions' | 'layouts' | 'formProps'\n >,\n) {\n const { setErrorText, fieldExtensions = [], layouts } = props;\n const dryRun = useDryRun();\n\n const directoryEditor = useDirectoryEditor();\n const { selectedFile } = directoryEditor ?? {};\n\n const handleDryRun = async (data: JsonObject) => {\n if (!selectedFile) {\n return;\n }\n\n try {\n await dryRun.execute({\n templateContent: selectedFile.content,\n values: data,\n files: directoryEditor?.files ?? [],\n });\n setErrorText();\n } catch (e) {\n setErrorText(String(e.cause || e));\n throw e;\n }\n };\n\n const content =\n selectedFile && selectedFile.path.match(/\\.ya?ml$/)\n ? selectedFile.content\n : undefined;\n\n if (!directoryEditor) {\n return null;\n }\n\n return (\n <TemplateEditorForm\n onDryRun={handleDryRun}\n fieldExtensions={fieldExtensions}\n setErrorText={setErrorText}\n content={content}\n layouts={layouts}\n formProps={props.formProps}\n />\n );\n}\n\nTemplateEditorForm.DirectoryEditorDryRun =\n TemplateEditorFormDirectoryEditorDryRun;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateEditorForm.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorForm.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 { useApiHolder } from '@backstage/core-plugin-api';\nimport { JsonObject, JsonValue } from '@backstage/types';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from '@material-ui/core/Typography';\nimport { Component, ReactNode, useMemo, useState } from 'react';\nimport useDebounce from 'react-use/esm/useDebounce';\nimport yaml from 'yaml';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport {\n LayoutOptions,\n TemplateParameterSchema,\n FieldExtensionOptions,\n FormProps,\n} from '@backstage/plugin-scaffolder-react';\nimport {\n Stepper,\n createAsyncValidators,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { useDryRun } from './DryRunContext';\nimport { useDirectoryEditor } from './DirectoryEditorContext';\n\nimport { scaffolderTranslationRef } from '../../../translation';\n\nconst useStyles = makeStyles({\n containerWrapper: {\n width: '100%',\n },\n});\n\ninterface ErrorBoundaryProps {\n invalidator: unknown;\n setErrorText(errorText: string | undefined): void;\n children: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n shouldRender: boolean;\n}\n\nclass ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state = {\n shouldRender: true,\n };\n\n componentDidUpdate(prevProps: { invalidator: unknown }) {\n if (prevProps.invalidator !== this.props.invalidator) {\n this.setState({ shouldRender: true });\n }\n }\n\n componentDidCatch(error: Error) {\n this.props.setErrorText(error.message);\n this.setState({ shouldRender: false });\n }\n\n render() {\n return this.state.shouldRender ? this.props.children : null;\n }\n}\n\ninterface TemplateEditorFormProps {\n content?: string;\n /** Setting this to true will cause the content to be parsed as if it is the template entity spec */\n contentIsSpec?: boolean;\n setErrorText: (errorText?: string) => void;\n\n onDryRun?: (data: JsonObject) => Promise<void>;\n fieldExtensions?: FieldExtensionOptions<any, any>[];\n layouts?: LayoutOptions[];\n formProps?: FormProps;\n}\n\nfunction isJsonObject(value: JsonValue | undefined): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Shows the a template form that is parsed from the provided content */\nexport function TemplateEditorForm(props: TemplateEditorFormProps) {\n const {\n content,\n contentIsSpec,\n onDryRun,\n setErrorText,\n fieldExtensions = [],\n layouts = [],\n } = props;\n const classes = useStyles();\n const apiHolder = useApiHolder();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const [steps, setSteps] = useState<TemplateParameterSchema['steps']>();\n\n const fields = useMemo(() => {\n return Object.fromEntries(\n fieldExtensions.map(({ name, component }) => [name, component]),\n );\n }, [fieldExtensions]);\n\n useDebounce(\n () => {\n try {\n if (!content) {\n setSteps(undefined);\n return;\n }\n const parsed: JsonValue = yaml\n .parseAllDocuments(content)\n .filter(c => c)\n .map(c => c.toJSON())[0];\n\n if (!isJsonObject(parsed)) {\n setSteps(undefined);\n return;\n }\n\n let rootObj = parsed;\n if (!contentIsSpec) {\n const isTemplate =\n String(parsed.kind).toLocaleLowerCase('en-US') === 'template';\n if (!isTemplate) {\n setSteps(undefined);\n return;\n }\n\n rootObj = isJsonObject(parsed.spec) ? parsed.spec : {};\n }\n\n const { parameters } = rootObj;\n\n if (!Array.isArray(parameters)) {\n setErrorText('Template parameters must be an array');\n setSteps(undefined);\n return;\n }\n\n const fieldValidators = Object.fromEntries(\n fieldExtensions.map(({ name, validation }) => [name, validation]),\n );\n\n setErrorText();\n setSteps(\n parameters.flatMap(param =>\n isJsonObject(param)\n ? [\n {\n title: String(param.title),\n schema: param,\n validate: createAsyncValidators(param, fieldValidators, {\n apiHolder,\n }),\n },\n ]\n : [],\n ),\n );\n } catch (e) {\n setErrorText(e.message);\n }\n },\n 250,\n [contentIsSpec, content, apiHolder],\n );\n\n return (\n <div className={classes.containerWrapper}>\n {steps ? (\n <Paper variant=\"outlined\">\n <ErrorBoundary invalidator={steps} setErrorText={setErrorText}>\n <Stepper\n manifest={{ steps, title: 'Template Editor' }}\n extensions={fieldExtensions}\n components={fields}\n onCreate={async options => {\n await onDryRun?.(options);\n }}\n layouts={layouts}\n formProps={props.formProps}\n />\n </ErrorBoundary>\n </Paper>\n ) : (\n <Typography variant=\"body1\" color=\"textSecondary\">\n {t('templateEditorForm.stepper.emptyText')}\n </Typography>\n )}\n </div>\n );\n}\n\n/** A version of the TemplateEditorForm that is connected to the DirectoryEditor and DryRun contexts */\nexport function TemplateEditorFormDirectoryEditorDryRun(\n props: Pick<\n TemplateEditorFormProps,\n 'setErrorText' | 'fieldExtensions' | 'layouts' | 'formProps'\n >,\n) {\n const { setErrorText, fieldExtensions = [], layouts } = props;\n const dryRun = useDryRun();\n\n const directoryEditor = useDirectoryEditor();\n const { selectedFile } = directoryEditor ?? {};\n\n const handleDryRun = async (data: JsonObject) => {\n if (!selectedFile) {\n return;\n }\n\n try {\n await dryRun.execute({\n templateContent: selectedFile.content,\n values: data,\n files: directoryEditor?.files ?? [],\n });\n setErrorText();\n } catch (e) {\n setErrorText(String(e.cause || e));\n throw e;\n }\n };\n\n const content =\n selectedFile && selectedFile.path.match(/\\.ya?ml$/)\n ? selectedFile.content\n : undefined;\n\n if (!directoryEditor) {\n return null;\n }\n\n return (\n <TemplateEditorForm\n onDryRun={handleDryRun}\n fieldExtensions={fieldExtensions}\n setErrorText={setErrorText}\n content={content}\n layouts={layouts}\n formProps={props.formProps}\n />\n );\n}\n\nTemplateEditorForm.DirectoryEditorDryRun =\n TemplateEditorFormDirectoryEditorDryRun;\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateEditorIntro.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorIntro.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 */\n\nimport { MouseEventHandler } from 'react';\nimport Card from '@material-ui/core/Card';\nimport CardActionArea from '@material-ui/core/CardActionArea';\nimport CardContent from '@material-ui/core/CardContent';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { WebFileSystemAccess } from '../../../lib/filesystem';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport CreateNewFolderIcon from '@material-ui/icons/CreateNewFolder';\nimport ListAltIcon from '@material-ui/icons/ListAlt';\nimport FormatListBulletedIcon from '@material-ui/icons/FormatListBulleted';\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined';\nimport CardMedia from '@material-ui/core/CardMedia';\nimport PublishIcon from '@material-ui/icons/Publish';\nimport SvgIcon from '@material-ui/core/SvgIcon';\nimport Tooltip from '@material-ui/core/Tooltip';\n\nconst useStyles = makeStyles(theme => ({\n gridRoot: {\n display: 'flex',\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n cardGrid: {\n maxWidth: 1000,\n display: 'grid',\n gridGap: theme.spacing(2),\n gridAutoFlow: 'row',\n [theme.breakpoints.up('md')]: {\n gridTemplateRows: '1fr 1fr',\n gridTemplateColumns: '1fr 1fr',\n },\n },\n card: {\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n gridTemplateRows: '1fr',\n alignItems: 'center',\n margin: theme.spacing(0, 1),\n marginTop: theme.spacing(2),\n padding: theme.spacing(2),\n },\n icon: {\n justifySelf: 'center',\n paddingTop: theme.spacing(1),\n fontSize: 48,\n },\n introText: {\n textAlign: 'center',\n marginTop: theme.spacing(2),\n },\n infoIcon: {\n position: 'absolute',\n top: theme.spacing(1),\n right: theme.spacing(1),\n },\n cardContent: {\n padding: theme.spacing(1),\n },\n}));\n\ninterface EditorIntroProps {\n style?: JSX.IntrinsicElements['div']['style'];\n onSelect?: (\n option: 'create-template' | 'local' | 'form' | 'field-explorer',\n ) => void;\n}\n\nfunction ActionCard(props: {\n title: string;\n description: string;\n Icon: typeof SvgIcon;\n action?: MouseEventHandler;\n requireLoad?: boolean;\n}) {\n const supportsLoad = props.requireLoad\n ? WebFileSystemAccess.isSupported()\n : true;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const classes = useStyles();\n const { Icon, title, description, action } = props;\n return (\n <Card className={classes.card}>\n {!supportsLoad && (\n <Tooltip\n placement=\"top\"\n title={t(\n 'templateEditorPage.templateEditorIntro.loadLocal.unsupportedTooltip',\n )}\n >\n <InfoOutlinedIcon />\n </Tooltip>\n )}\n\n <CardActionArea onClick={action}>\n <CardMedia>\n <Icon\n className={classes.icon}\n color={supportsLoad ? undefined : 'disabled'}\n />\n </CardMedia>\n <CardContent className={classes.cardContent}>\n <Typography\n gutterBottom\n variant=\"h5\"\n component=\"h2\"\n color={supportsLoad ? undefined : 'textSecondary'}\n >\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\" component=\"p\">\n {description}\n </Typography>\n </CardContent>\n </CardActionArea>\n </Card>\n );\n}\nexport function TemplateEditorIntro(props: EditorIntroProps) {\n const classes = useStyles();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n return (\n <div style={props.style}>\n <Typography variant=\"h4\" component=\"h2\" className={classes.introText}>\n {t('templateEditorPage.templateEditorIntro.title')}\n </Typography>\n <div className={classes.gridRoot}>\n <div className={classes.cardGrid}>\n <ActionCard\n title={t('templateEditorPage.templateEditorIntro.loadLocal.title')}\n description={t(\n 'templateEditorPage.templateEditorIntro.loadLocal.description',\n )}\n requireLoad\n Icon={PublishIcon}\n action={() => props.onSelect?.('local')}\n />\n <ActionCard\n title={t(\n 'templateEditorPage.templateEditorIntro.createLocal.title',\n )}\n description={t(\n 'templateEditorPage.templateEditorIntro.createLocal.description',\n )}\n requireLoad\n action={() => props.onSelect?.('create-template')}\n Icon={CreateNewFolderIcon}\n />\n\n <ActionCard\n title={t('templateEditorPage.templateEditorIntro.formEditor.title')}\n description={t(\n 'templateEditorPage.templateEditorIntro.formEditor.description',\n )}\n Icon={ListAltIcon}\n action={() => props.onSelect?.('form')}\n />\n\n <ActionCard\n title={t(\n 'templateEditorPage.templateEditorIntro.fieldExplorer.title',\n )}\n description={t(\n 'templateEditorPage.templateEditorIntro.fieldExplorer.description',\n )}\n Icon={FormatListBulletedIcon}\n action={() => props.onSelect?.('field-explorer')}\n />\n </div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateEditorIntro.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorIntro.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 */\n\nimport { MouseEventHandler } from 'react';\nimport Card from '@material-ui/core/Card';\nimport CardActionArea from '@material-ui/core/CardActionArea';\nimport CardContent from '@material-ui/core/CardContent';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { WebFileSystemAccess } from '../../../lib/filesystem';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport CreateNewFolderIcon from '@material-ui/icons/CreateNewFolder';\nimport ListAltIcon from '@material-ui/icons/ListAlt';\nimport FormatListBulletedIcon from '@material-ui/icons/FormatListBulleted';\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined';\nimport CardMedia from '@material-ui/core/CardMedia';\nimport PublishIcon from '@material-ui/icons/Publish';\nimport SvgIcon from '@material-ui/core/SvgIcon';\nimport Tooltip from '@material-ui/core/Tooltip';\n\nconst useStyles = makeStyles(theme => ({\n gridRoot: {\n display: 'flex',\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n cardGrid: {\n maxWidth: 1000,\n display: 'grid',\n gridGap: theme.spacing(2),\n gridAutoFlow: 'row',\n [theme.breakpoints.up('md')]: {\n gridTemplateRows: '1fr 1fr',\n gridTemplateColumns: '1fr 1fr',\n },\n },\n card: {\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n gridTemplateRows: '1fr',\n alignItems: 'center',\n margin: theme.spacing(0, 1),\n marginTop: theme.spacing(2),\n padding: theme.spacing(2),\n },\n icon: {\n justifySelf: 'center',\n paddingTop: theme.spacing(1),\n fontSize: 48,\n },\n introText: {\n textAlign: 'center',\n marginTop: theme.spacing(2),\n },\n infoIcon: {\n position: 'absolute',\n top: theme.spacing(1),\n right: theme.spacing(1),\n },\n cardContent: {\n padding: theme.spacing(1),\n },\n}));\n\ninterface EditorIntroProps {\n style?: JSX.IntrinsicElements['div']['style'];\n onSelect?: (\n option: 'create-template' | 'local' | 'form' | 'field-explorer',\n ) => void;\n}\n\nfunction ActionCard(props: {\n title: string;\n description: string;\n Icon: typeof SvgIcon;\n action?: MouseEventHandler;\n requireLoad?: boolean;\n}) {\n const supportsLoad = props.requireLoad\n ? WebFileSystemAccess.isSupported()\n : true;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const classes = useStyles();\n const { Icon, title, description, action } = props;\n return (\n <Card className={classes.card}>\n {!supportsLoad && (\n <Tooltip\n placement=\"top\"\n title={t(\n 'templateEditorPage.templateEditorIntro.loadLocal.unsupportedTooltip',\n )}\n >\n <InfoOutlinedIcon />\n </Tooltip>\n )}\n\n <CardActionArea onClick={action}>\n <CardMedia>\n <Icon\n className={classes.icon}\n color={supportsLoad ? undefined : 'disabled'}\n />\n </CardMedia>\n <CardContent className={classes.cardContent}>\n <Typography\n gutterBottom\n variant=\"h5\"\n component=\"h2\"\n color={supportsLoad ? undefined : 'textSecondary'}\n >\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\" component=\"p\">\n {description}\n </Typography>\n </CardContent>\n </CardActionArea>\n </Card>\n );\n}\nexport function TemplateEditorIntro(props: EditorIntroProps) {\n const classes = useStyles();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n return (\n <div style={props.style}>\n <Typography variant=\"h4\" component=\"h2\" className={classes.introText}>\n {t('templateEditorPage.templateEditorIntro.title')}\n </Typography>\n <div className={classes.gridRoot}>\n <div className={classes.cardGrid}>\n <ActionCard\n title={t('templateEditorPage.templateEditorIntro.loadLocal.title')}\n description={t(\n 'templateEditorPage.templateEditorIntro.loadLocal.description',\n )}\n requireLoad\n Icon={PublishIcon}\n action={() => props.onSelect?.('local')}\n />\n <ActionCard\n title={t(\n 'templateEditorPage.templateEditorIntro.createLocal.title',\n )}\n description={t(\n 'templateEditorPage.templateEditorIntro.createLocal.description',\n )}\n requireLoad\n action={() => props.onSelect?.('create-template')}\n Icon={CreateNewFolderIcon}\n />\n\n <ActionCard\n title={t('templateEditorPage.templateEditorIntro.formEditor.title')}\n description={t(\n 'templateEditorPage.templateEditorIntro.formEditor.description',\n )}\n Icon={ListAltIcon}\n action={() => props.onSelect?.('form')}\n />\n\n <ActionCard\n title={t(\n 'templateEditorPage.templateEditorIntro.fieldExplorer.title',\n )}\n description={t(\n 'templateEditorPage.templateEditorIntro.fieldExplorer.description',\n )}\n Icon={FormatListBulletedIcon}\n action={() => props.onSelect?.('field-explorer')}\n />\n </div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { withStyles, useTheme } from '@material-ui/core/styles';
3
- import { PanelResizeHandle, PanelGroup, Panel } from 'react-resizable-panels';
3
+ import { PanelGroup, Panel, PanelResizeHandle } from 'react-resizable-panels';
4
4
  import useMediaQuery from '@material-ui/core/useMediaQuery';
5
5
 
6
6
  const TemplateEditorLayout = withStyles(
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateEditorLayout.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorLayout.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PropsWithChildren, ReactNode } from 'react';\nimport { WithStyles, withStyles } from '@material-ui/core/styles';\nimport { PanelGroup, Panel, PanelResizeHandle } from 'react-resizable-panels';\nimport { useTheme } from '@material-ui/core/styles';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\n\nexport const TemplateEditorLayout = withStyles(\n theme => ({\n root: {\n height: '100%',\n gridArea: 'pageContent',\n display: 'grid',\n gridTemplateAreas: `\n \"toolbar\"\n \"browser\"\n \"editor\"\n \"preview\"\n \"results\"\n `,\n [theme.breakpoints.up('md')]: {\n gridTemplateAreas: `\n \"toolbar toolbar toolbar\"\n \"browser editor preview\"\n \"results results results\"\n `,\n gridTemplateColumns: '1fr 5fr',\n gridTemplateRows: 'auto 1fr auto',\n },\n },\n }),\n { name: 'ScaffolderTemplateEditorLayout' },\n)(({ children, classes }: PropsWithChildren<WithStyles>) => (\n <main className={classes.root}>{children}</main>\n));\n\nexport const TemplateEditorLayoutToolbar = withStyles(\n {\n root: {\n gridArea: 'toolbar',\n },\n },\n { name: 'ScaffolderTemplateEditorLayoutToolbar' },\n)(({ children, classes }: PropsWithChildren<WithStyles>) => (\n <section className={classes.root}>{children}</section>\n));\n\nexport const TemplateEditorLayoutBrowser = withStyles(\n theme => ({\n root: {\n gridArea: 'browser',\n overflow: 'auto',\n [theme.breakpoints.up('md')]: {\n borderRight: `1px solid ${theme.palette.divider}`,\n },\n },\n }),\n { name: 'ScaffolderTemplateEditorLayoutBrowser' },\n)(({ children, classes }: PropsWithChildren<WithStyles>) => (\n <section className={classes.root}>{children}</section>\n));\n\nexport const TemplateEditorLayoutFiles = withStyles(\n theme => ({\n root: {\n gridArea: 'editor',\n overflow: 'auto',\n [theme.breakpoints.up('md')]: {\n height: '100%',\n },\n },\n }),\n { name: 'ScaffolderTemplateEditorLayoutFiles' },\n)(({ children, classes }: PropsWithChildren<WithStyles>) => (\n <section className={classes.root}>{children}</section>\n));\n\nexport const TemplateEditorLayoutPreview = withStyles(\n theme => ({\n root: {\n gridArea: 'preview',\n position: 'relative',\n backgroundColor: theme.palette.background.default,\n [theme.breakpoints.up('md')]: {\n height: '100%',\n },\n },\n scroll: {\n height: '100%',\n padding: theme.spacing(1),\n [theme.breakpoints.up('md')]: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n overflow: 'auto',\n },\n },\n }),\n { name: 'ScaffolderTemplateEditorLayoutPreview' },\n)(({ children, classes }: PropsWithChildren<WithStyles>) => (\n <section className={classes.root}>\n <div className={classes.scroll}>{children}</div>\n </section>\n));\n\nexport const TemplateEditorLayoutConsole = withStyles(\n {\n root: {\n gridArea: 'results',\n },\n },\n { name: 'ScaffolderTemplateEditorLayoutConsole' },\n)(({ children, classes }: PropsWithChildren<WithStyles>) => (\n <section className={classes.root}>{children}</section>\n));\n\nexport const TemplateEditorPanelResizeHandle = withStyles(\n {\n root: {\n width: 8,\n cursor: 'col-resize',\n background: 'rgba(0,0,0,0.04)',\n },\n },\n { name: 'ScaffolderTemplateEditorPanelResizeHandle' },\n)(({ classes }: { classes: WithStyles['classes'] }) => (\n <PanelResizeHandle className={classes.root} />\n));\n\nexport function TemplateEditorPanels({\n files,\n preview,\n autoSaveId = 'template-editor-panels',\n}: {\n files: ReactNode;\n preview: ReactNode;\n autoSaveId?: string;\n}) {\n const theme = useTheme();\n const isMdUp = useMediaQuery(theme.breakpoints.up('md'));\n\n if (isMdUp) {\n return (\n <PanelGroup direction=\"horizontal\" autoSaveId={autoSaveId}>\n <Panel minSize={15} defaultSize={50}>\n {files}\n </Panel>\n <TemplateEditorPanelResizeHandle />\n <Panel minSize={15} defaultSize={50}>\n {preview}\n </Panel>\n </PanelGroup>\n );\n }\n // Stack as rows for small screens, just render children in a plain block\n return (\n <>\n {files}\n {preview}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateEditorLayout.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorLayout.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PropsWithChildren, ReactNode } from 'react';\nimport { WithStyles, withStyles } from '@material-ui/core/styles';\nimport { PanelGroup, Panel, PanelResizeHandle } from 'react-resizable-panels';\nimport { useTheme } from '@material-ui/core/styles';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\n\nexport const TemplateEditorLayout = withStyles(\n theme => ({\n root: {\n height: '100%',\n gridArea: 'pageContent',\n display: 'grid',\n gridTemplateAreas: `\n \"toolbar\"\n \"browser\"\n \"editor\"\n \"preview\"\n \"results\"\n `,\n [theme.breakpoints.up('md')]: {\n gridTemplateAreas: `\n \"toolbar toolbar toolbar\"\n \"browser editor preview\"\n \"results results results\"\n `,\n gridTemplateColumns: '1fr 5fr',\n gridTemplateRows: 'auto 1fr auto',\n },\n },\n }),\n { name: 'ScaffolderTemplateEditorLayout' },\n)(({ children, classes }: PropsWithChildren<WithStyles>) => (\n <main className={classes.root}>{children}</main>\n));\n\nexport const TemplateEditorLayoutToolbar = withStyles(\n {\n root: {\n gridArea: 'toolbar',\n },\n },\n { name: 'ScaffolderTemplateEditorLayoutToolbar' },\n)(({ children, classes }: PropsWithChildren<WithStyles>) => (\n <section className={classes.root}>{children}</section>\n));\n\nexport const TemplateEditorLayoutBrowser = withStyles(\n theme => ({\n root: {\n gridArea: 'browser',\n overflow: 'auto',\n [theme.breakpoints.up('md')]: {\n borderRight: `1px solid ${theme.palette.divider}`,\n },\n },\n }),\n { name: 'ScaffolderTemplateEditorLayoutBrowser' },\n)(({ children, classes }: PropsWithChildren<WithStyles>) => (\n <section className={classes.root}>{children}</section>\n));\n\nexport const TemplateEditorLayoutFiles = withStyles(\n theme => ({\n root: {\n gridArea: 'editor',\n overflow: 'auto',\n [theme.breakpoints.up('md')]: {\n height: '100%',\n },\n },\n }),\n { name: 'ScaffolderTemplateEditorLayoutFiles' },\n)(({ children, classes }: PropsWithChildren<WithStyles>) => (\n <section className={classes.root}>{children}</section>\n));\n\nexport const TemplateEditorLayoutPreview = withStyles(\n theme => ({\n root: {\n gridArea: 'preview',\n position: 'relative',\n backgroundColor: theme.palette.background.default,\n [theme.breakpoints.up('md')]: {\n height: '100%',\n },\n },\n scroll: {\n height: '100%',\n padding: theme.spacing(1),\n [theme.breakpoints.up('md')]: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n overflow: 'auto',\n },\n },\n }),\n { name: 'ScaffolderTemplateEditorLayoutPreview' },\n)(({ children, classes }: PropsWithChildren<WithStyles>) => (\n <section className={classes.root}>\n <div className={classes.scroll}>{children}</div>\n </section>\n));\n\nexport const TemplateEditorLayoutConsole = withStyles(\n {\n root: {\n gridArea: 'results',\n },\n },\n { name: 'ScaffolderTemplateEditorLayoutConsole' },\n)(({ children, classes }: PropsWithChildren<WithStyles>) => (\n <section className={classes.root}>{children}</section>\n));\n\nexport const TemplateEditorPanelResizeHandle = withStyles(\n {\n root: {\n width: 8,\n cursor: 'col-resize',\n background: 'rgba(0,0,0,0.04)',\n },\n },\n { name: 'ScaffolderTemplateEditorPanelResizeHandle' },\n)(({ classes }: { classes: WithStyles['classes'] }) => (\n <PanelResizeHandle className={classes.root} />\n));\n\nexport function TemplateEditorPanels({\n files,\n preview,\n autoSaveId = 'template-editor-panels',\n}: {\n files: ReactNode;\n preview: ReactNode;\n autoSaveId?: string;\n}) {\n const theme = useTheme();\n const isMdUp = useMediaQuery(theme.breakpoints.up('md'));\n\n if (isMdUp) {\n return (\n <PanelGroup direction=\"horizontal\" autoSaveId={autoSaveId}>\n <Panel minSize={15} defaultSize={50}>\n {files}\n </Panel>\n <TemplateEditorPanelResizeHandle />\n <Panel minSize={15} defaultSize={50}>\n {preview}\n </Panel>\n </PanelGroup>\n );\n }\n // Stack as rows for small screens, just render children in a plain block\n return (\n <>\n {files}\n {preview}\n </>\n );\n}\n"],"names":[],"mappings":";;;;;AAsBO,MAAM,oBAAA,GAAuB,UAAA;AAAA,EAClC,CAAA,KAAA,MAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU,aAAA;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,iBAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,MAOnB,CAAC,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,IAAI,CAAC,GAAG;AAAA,QAC5B,iBAAA,EAAmB;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,QAKnB,mBAAA,EAAqB,SAAA;AAAA,QACrB,gBAAA,EAAkB;AAAA;AACpB;AACF,GACF,CAAA;AAAA,EACA,EAAE,MAAM,gCAAA;AACV,CAAA,CAAE,CAAC,EAAE,QAAA,EAAU,OAAA,EAAQ,qBACrB,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAO,QAAA,EAAS,CAC1C;AAEM,MAAM,2BAAA,GAA8B,UAAA;AAAA,EACzC;AAAA,IACE,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,EAAE,MAAM,uCAAA;AACV,CAAA,CAAE,CAAC,EAAE,QAAA,EAAU,OAAA,EAAQ,qBACrB,GAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAO,QAAA,EAAS,CAC7C;AAEM,MAAM,2BAAA,GAA8B,UAAA;AAAA,EACzC,CAAA,KAAA,MAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,SAAA;AAAA,MACV,QAAA,EAAU,MAAA;AAAA,MACV,CAAC,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,IAAI,CAAC,GAAG;AAAA,QAC5B,WAAA,EAAa,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AAAA;AACjD;AACF,GACF,CAAA;AAAA,EACA,EAAE,MAAM,uCAAA;AACV,CAAA,CAAE,CAAC,EAAE,QAAA,EAAU,OAAA,EAAQ,qBACrB,GAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAO,QAAA,EAAS,CAC7C;AAEM,MAAM,yBAAA,GAA4B,UAAA;AAAA,EACvC,CAAA,KAAA,MAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,QAAA;AAAA,MACV,QAAA,EAAU,MAAA;AAAA,MACV,CAAC,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,IAAI,CAAC,GAAG;AAAA,QAC5B,MAAA,EAAQ;AAAA;AACV;AACF,GACF,CAAA;AAAA,EACA,EAAE,MAAM,qCAAA;AACV,CAAA,CAAE,CAAC,EAAE,QAAA,EAAU,OAAA,EAAQ,qBACrB,GAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAO,QAAA,EAAS,CAC7C;AAEM,MAAM,2BAAA,GAA8B,UAAA;AAAA,EACzC,CAAA,KAAA,MAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,SAAA;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,OAAA;AAAA,MAC1C,CAAC,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,IAAI,CAAC,GAAG;AAAA,QAC5B,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MACxB,CAAC,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,IAAI,CAAC,GAAG;AAAA,QAC5B,QAAA,EAAU,UAAA;AAAA,QACV,GAAA,EAAK,CAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,QAAA,EAAU;AAAA;AACZ;AACF,GACF,CAAA;AAAA,EACA,EAAE,MAAM,uCAAA;AACV,CAAA,CAAE,CAAC,EAAE,QAAA,EAAU,OAAA,EAAQ,yBACpB,SAAA,EAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,IAAA,EAC1B,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,MAAA,EAAS,QAAA,EAAS,GAC5C,CACD;AAEM,MAAM,2BAAA,GAA8B,UAAA;AAAA,EACzC;AAAA,IACE,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,EAAE,MAAM,uCAAA;AACV,CAAA,CAAE,CAAC,EAAE,QAAA,EAAU,OAAA,EAAQ,qBACrB,GAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAO,QAAA,EAAS,CAC7C;AAEM,MAAM,+BAAA,GAAkC,UAAA;AAAA,EAC7C;AAAA,IACE,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,YAAA;AAAA,MACR,UAAA,EAAY;AAAA;AACd,GACF;AAAA,EACA,EAAE,MAAM,2CAAA;AACV,CAAA,CAAE,CAAC,EAAE,OAAA,EAAQ,yBACV,iBAAA,EAAA,EAAkB,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAM,CAC7C;AAEM,SAAS,oBAAA,CAAqB;AAAA,EACnC,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA,GAAa;AACf,CAAA,EAIG;AACD,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,SAAS,aAAA,CAAc,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,IAAI,CAAC,CAAA;AAEvD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBACE,IAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,YAAA,EAAa,UAAA,EACjC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAS,EAAA,EAAI,WAAA,EAAa,IAC9B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,0BACC,+BAAA,EAAA,EAAgC,CAAA;AAAA,0BAChC,KAAA,EAAA,EAAM,OAAA,EAAS,EAAA,EAAI,WAAA,EAAa,IAC9B,QAAA,EAAA,OAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,KAAA;AAAA,IACA;AAAA,GAAA,EACH,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateEditorPage.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorPage.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Content, Header, Page } from '@backstage/core-components';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n FormProps,\n FieldExtensionOptions,\n type LayoutOptions,\n} from '@backstage/plugin-scaffolder-react';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { editRouteRef } from '../../../routes';\nimport { TemplateEditor } from './TemplateEditor';\n\nconst useStyles = makeStyles(\n {\n content: {\n padding: 0,\n },\n },\n { name: 'ScaffolderTemplateEditorToolbar' },\n);\n\ninterface TemplatePageProps {\n defaultPreviewTemplate?: string;\n fieldExtensions?: FieldExtensionOptions<any, any>[];\n layouts?: LayoutOptions[];\n formProps?: FormProps;\n}\n\nexport function TemplateEditorPage(props: TemplatePageProps) {\n const classes = useStyles();\n const editLink = useRouteRef(editRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n return (\n <Page themeId=\"home\">\n <Header\n title={t('templateEditorPage.title')}\n subtitle={t('templateEditorPage.subtitle')}\n type={t('templateIntroPage.title')}\n typeLink={editLink()}\n />\n <Content className={classes.content}>\n <TemplateEditor\n layouts={props.layouts}\n formProps={props.formProps}\n fieldExtensions={props.fieldExtensions}\n />\n </Content>\n </Page>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AA4BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAChB;AAAA,IACE,OAAS,EAAA;AAAA,MACP,OAAS,EAAA;AAAA;AACX,GACF;AAAA,EACA,EAAE,MAAM,iCAAkC;AAC5C,CAAA;AASO,SAAS,mBAAmB,KAA0B,EAAA;AAC3D,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAM,MAAA,QAAA,GAAW,YAAY,YAAY,CAAA;AACzC,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EACE,uBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,MACZ,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,QACnC,QAAA,EAAU,EAAE,6BAA6B,CAAA;AAAA,QACzC,IAAA,EAAM,EAAE,yBAAyB,CAAA;AAAA,QACjC,UAAU,QAAS;AAAA;AAAA,KACrB;AAAA,oBACC,GAAA,CAAA,OAAA,EAAA,EAAQ,SAAW,EAAA,OAAA,CAAQ,OAC1B,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAM,CAAA,OAAA;AAAA,QACf,WAAW,KAAM,CAAA,SAAA;AAAA,QACjB,iBAAiB,KAAM,CAAA;AAAA;AAAA,KAE3B,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TemplateEditorPage.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorPage.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Content, Header, Page } from '@backstage/core-components';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n FormProps,\n FieldExtensionOptions,\n type LayoutOptions,\n} from '@backstage/plugin-scaffolder-react';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { editRouteRef } from '../../../routes';\nimport { TemplateEditor } from './TemplateEditor';\n\nconst useStyles = makeStyles(\n {\n content: {\n padding: 0,\n },\n },\n { name: 'ScaffolderTemplateEditorToolbar' },\n);\n\ninterface TemplatePageProps {\n defaultPreviewTemplate?: string;\n fieldExtensions?: FieldExtensionOptions<any, any>[];\n layouts?: LayoutOptions[];\n formProps?: FormProps;\n}\n\nexport function TemplateEditorPage(props: TemplatePageProps) {\n const classes = useStyles();\n const editLink = useRouteRef(editRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n return (\n <Page themeId=\"home\">\n <Header\n title={t('templateEditorPage.title')}\n subtitle={t('templateEditorPage.subtitle')}\n type={t('templateIntroPage.title')}\n typeLink={editLink()}\n />\n <Content className={classes.content}>\n <TemplateEditor\n layouts={props.layouts}\n formProps={props.formProps}\n fieldExtensions={props.fieldExtensions}\n />\n </Content>\n </Page>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AA4BA,MAAM,SAAA,GAAY,UAAA;AAAA,EAChB;AAAA,IACE,OAAA,EAAS;AAAA,MACP,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,EAAE,MAAM,iCAAA;AACV,CAAA;AASO,SAAS,mBAAmB,KAAA,EAA0B;AAC3D,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,QAAA,GAAW,YAAY,YAAY,CAAA;AACzC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,MAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,QACnC,QAAA,EAAU,EAAE,6BAA6B,CAAA;AAAA,QACzC,IAAA,EAAM,EAAE,yBAAyB,CAAA;AAAA,QACjC,UAAU,QAAA;AAAS;AAAA,KACrB;AAAA,oBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,OAAA,EAC1B,QAAA,kBAAA,GAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,iBAAiB,KAAA,CAAM;AAAA;AAAA,KACzB,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateEditorTextArea.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorTextArea.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 */\n\nimport { StreamLanguage } from '@codemirror/language';\nimport { yaml as yamlSupport } from '@codemirror/legacy-modes/mode/yaml';\nimport { showPanel } from '@codemirror/view';\nimport IconButton from '@material-ui/core/IconButton';\nimport Paper from '@material-ui/core/Paper';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport SaveIcon from '@material-ui/icons/Save';\nimport { useKeyboardEvent } from '@react-hookz/web';\nimport CodeMirror from '@uiw/react-codemirror';\nimport { useMemo } from 'react';\nimport { useDirectoryEditor } from './DirectoryEditorContext';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nconst useStyles = makeStyles(theme => ({\n container: {\n position: 'relative',\n width: '100%',\n height: '100%',\n },\n typography: {\n padding: theme.spacing(1.5),\n },\n button: {\n verticalAlign: 'top',\n },\n codeMirror: {\n height: '100%',\n [theme.breakpoints.up('md')]: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n },\n },\n errorPanel: {\n color: theme.palette.error.main,\n lineHeight: 2,\n margin: theme.spacing(0, 1),\n },\n floatingButtons: {\n position: 'absolute',\n top: theme.spacing(1),\n right: theme.spacing(3),\n },\n floatingButton: {\n padding: theme.spacing(1),\n },\n}));\n\n/** A wrapper around CodeMirror with an error panel and extra actions available */\nexport function TemplateEditorTextArea(props: {\n content?: string;\n onUpdate?: (content: string) => void;\n errorText?: string;\n onSave?: () => void;\n onReload?: () => void;\n}) {\n const { errorText } = props;\n const classes = useStyles();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const panelExtension = useMemo(() => {\n if (!errorText) {\n return showPanel.of(null);\n }\n\n const dom = document.createElement('div');\n dom.classList.add(classes.errorPanel);\n dom.textContent = errorText;\n return showPanel.of(() => ({ dom, bottom: true }));\n }, [classes, errorText]);\n\n useKeyboardEvent(\n e => e.key === 's' && (e.ctrlKey || e.metaKey),\n e => {\n e.preventDefault();\n if (props.onSave) {\n props.onSave();\n }\n },\n );\n\n return (\n <div className={classes.container}>\n <CodeMirror\n className={classes.codeMirror}\n theme=\"dark\"\n height=\"100%\"\n extensions={[StreamLanguage.define(yamlSupport), panelExtension]}\n value={props.content}\n onChange={props.onUpdate}\n />\n {(props.onSave || props.onReload) && (\n <div className={classes.floatingButtons}>\n <Paper>\n {props.onSave && (\n <Tooltip\n title={t(\n 'templateEditorPage.templateEditorTextArea.saveIconTooltip',\n )}\n >\n <IconButton\n className={classes.floatingButton}\n onClick={() => props.onSave?.()}\n >\n <SaveIcon />\n </IconButton>\n </Tooltip>\n )}\n {props.onReload && (\n <Tooltip\n title={t(\n 'templateEditorPage.templateEditorTextArea.refreshIconTooltip',\n )}\n >\n <IconButton\n className={classes.floatingButton}\n onClick={() => props.onReload?.()}\n >\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n )}\n </Paper>\n </div>\n )}\n </div>\n );\n}\n\n/** A version of the TemplateEditorTextArea that is connected to the DirectoryEditor context */\nexport function TemplateEditorDirectoryEditorTextArea(props: {\n errorText?: string;\n}) {\n const classes = useStyles();\n const directoryEditor = useDirectoryEditor();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n if (!directoryEditor) {\n return (\n <Typography\n className={classes.typography}\n color=\"textSecondary\"\n align=\"center\"\n >\n {t('templateEditorPage.templateEditorTextArea.emptyStateParagraph')}\n </Typography>\n );\n }\n\n const actions = directoryEditor?.selectedFile?.dirty\n ? {\n onSave: () => directoryEditor.save(),\n onReload: () => directoryEditor.reload(),\n }\n : {\n onReload: () => directoryEditor.reload(),\n };\n\n return (\n <TemplateEditorTextArea\n errorText={props.errorText}\n content={directoryEditor.selectedFile?.content}\n onUpdate={content =>\n directoryEditor?.selectedFile?.updateContent(content)\n }\n {...actions}\n />\n );\n}\n\nTemplateEditorTextArea.DirectoryEditor = TemplateEditorDirectoryEditorTextArea;\n"],"names":["yamlSupport"],"mappings":"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"}
1
+ {"version":3,"file":"TemplateEditorTextArea.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorTextArea.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 */\n\nimport { StreamLanguage } from '@codemirror/language';\nimport { yaml as yamlSupport } from '@codemirror/legacy-modes/mode/yaml';\nimport { showPanel } from '@codemirror/view';\nimport IconButton from '@material-ui/core/IconButton';\nimport Paper from '@material-ui/core/Paper';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport SaveIcon from '@material-ui/icons/Save';\nimport { useKeyboardEvent } from '@react-hookz/web';\nimport CodeMirror from '@uiw/react-codemirror';\nimport { useMemo } from 'react';\nimport { useDirectoryEditor } from './DirectoryEditorContext';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nconst useStyles = makeStyles(theme => ({\n container: {\n position: 'relative',\n width: '100%',\n height: '100%',\n },\n typography: {\n padding: theme.spacing(1.5),\n },\n button: {\n verticalAlign: 'top',\n },\n codeMirror: {\n height: '100%',\n [theme.breakpoints.up('md')]: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n },\n },\n errorPanel: {\n color: theme.palette.error.main,\n lineHeight: 2,\n margin: theme.spacing(0, 1),\n },\n floatingButtons: {\n position: 'absolute',\n top: theme.spacing(1),\n right: theme.spacing(3),\n },\n floatingButton: {\n padding: theme.spacing(1),\n },\n}));\n\n/** A wrapper around CodeMirror with an error panel and extra actions available */\nexport function TemplateEditorTextArea(props: {\n content?: string;\n onUpdate?: (content: string) => void;\n errorText?: string;\n onSave?: () => void;\n onReload?: () => void;\n}) {\n const { errorText } = props;\n const classes = useStyles();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const panelExtension = useMemo(() => {\n if (!errorText) {\n return showPanel.of(null);\n }\n\n const dom = document.createElement('div');\n dom.classList.add(classes.errorPanel);\n dom.textContent = errorText;\n return showPanel.of(() => ({ dom, bottom: true }));\n }, [classes, errorText]);\n\n useKeyboardEvent(\n e => e.key === 's' && (e.ctrlKey || e.metaKey),\n e => {\n e.preventDefault();\n if (props.onSave) {\n props.onSave();\n }\n },\n );\n\n return (\n <div className={classes.container}>\n <CodeMirror\n className={classes.codeMirror}\n theme=\"dark\"\n height=\"100%\"\n extensions={[StreamLanguage.define(yamlSupport), panelExtension]}\n value={props.content}\n onChange={props.onUpdate}\n />\n {(props.onSave || props.onReload) && (\n <div className={classes.floatingButtons}>\n <Paper>\n {props.onSave && (\n <Tooltip\n title={t(\n 'templateEditorPage.templateEditorTextArea.saveIconTooltip',\n )}\n >\n <IconButton\n className={classes.floatingButton}\n onClick={() => props.onSave?.()}\n >\n <SaveIcon />\n </IconButton>\n </Tooltip>\n )}\n {props.onReload && (\n <Tooltip\n title={t(\n 'templateEditorPage.templateEditorTextArea.refreshIconTooltip',\n )}\n >\n <IconButton\n className={classes.floatingButton}\n onClick={() => props.onReload?.()}\n >\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n )}\n </Paper>\n </div>\n )}\n </div>\n );\n}\n\n/** A version of the TemplateEditorTextArea that is connected to the DirectoryEditor context */\nexport function TemplateEditorDirectoryEditorTextArea(props: {\n errorText?: string;\n}) {\n const classes = useStyles();\n const directoryEditor = useDirectoryEditor();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n if (!directoryEditor) {\n return (\n <Typography\n className={classes.typography}\n color=\"textSecondary\"\n align=\"center\"\n >\n {t('templateEditorPage.templateEditorTextArea.emptyStateParagraph')}\n </Typography>\n );\n }\n\n const actions = directoryEditor?.selectedFile?.dirty\n ? {\n onSave: () => directoryEditor.save(),\n onReload: () => directoryEditor.reload(),\n }\n : {\n onReload: () => directoryEditor.reload(),\n };\n\n return (\n <TemplateEditorTextArea\n errorText={props.errorText}\n content={directoryEditor.selectedFile?.content}\n onUpdate={content =>\n directoryEditor?.selectedFile?.updateContent(content)\n }\n {...actions}\n />\n );\n}\n\nTemplateEditorTextArea.DirectoryEditor = TemplateEditorDirectoryEditorTextArea;\n"],"names":["yamlSupport"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateEditorToolbar.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorToolbar.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ReactNode, useState } from 'react';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport AppBar from '@material-ui/core/AppBar';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport ButtonGroup from '@material-ui/core/ButtonGroup';\nimport Button from '@material-ui/core/Button';\nimport Drawer from '@material-ui/core/Drawer';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport ExtensionIcon from '@material-ui/icons/Extension';\nimport DescriptionIcon from '@material-ui/icons/Description';\nimport FunctionsIcon from '@material-ui/icons/Functions';\n\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react';\n\nimport { ActionPageContent } from '../../../components/ActionsPage/ActionsPage';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { CustomFieldPlayground } from './CustomFieldPlayground';\nimport { TemplatingExtensionsPageContent } from '../../../components/TemplatingExtensionsPage/TemplatingExtensionsPage';\n\nconst useStyles = makeStyles(\n theme => ({\n paper: {\n width: '90%',\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n [theme.breakpoints.up('sm')]: {\n width: '70%',\n },\n [theme.breakpoints.up('md')]: {\n width: '50%',\n },\n },\n appbar: {\n zIndex: 1,\n },\n toolbar: {\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n gridGap: theme.spacing(1),\n padding: theme.spacing(0, 1),\n backgroundColor: theme.palette.background.paper,\n },\n toolbarCustomActions: {\n display: 'grid',\n alignItems: 'center',\n gridAutoFlow: 'Column',\n gridGap: theme.spacing(1),\n },\n toolbarDefaultActions: {\n justifySelf: 'end',\n },\n }),\n { name: 'ScaffolderTemplateEditorToolbar' },\n);\n\nexport function TemplateEditorToolbar(props: {\n children?: ReactNode;\n fieldExtensions?: FieldExtensionOptions<any, any>[];\n}) {\n const { children, fieldExtensions } = props;\n const classes = useStyles();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const [showFieldsDrawer, setShowFieldsDrawer] = useState(false);\n const [showActionsDrawer, setShowActionsDrawer] = useState(false);\n const [showExtensionsDrawer, setShowExtensionsDrawer] = useState(false);\n const [showPublishModal, setShowPublishModal] = useState(false);\n\n return (\n <AppBar className={classes.appbar} position=\"relative\">\n <Toolbar className={classes.toolbar}>\n <div className={classes.toolbarCustomActions}>{children}</div>\n <ButtonGroup className={classes.toolbarDefaultActions} variant=\"text\">\n <Tooltip\n title={t('templateEditorToolbar.customFieldExplorerTooltip')}\n >\n <Button onClick={() => setShowFieldsDrawer(true)}>\n <ExtensionIcon />\n </Button>\n </Tooltip>\n <Tooltip\n title={t(\n 'templateEditorToolbar.installedActionsDocumentationTooltip',\n )}\n >\n <Button onClick={() => setShowActionsDrawer(true)}>\n <DescriptionIcon />\n </Button>\n </Tooltip>\n <Tooltip\n title={t(\n 'templateEditorToolbar.templatingExtensionsDocumentationTooltip',\n )}\n >\n <Button onClick={() => setShowExtensionsDrawer(true)}>\n <FunctionsIcon />\n </Button>\n </Tooltip>\n <Button onClick={() => setShowPublishModal(true)}>\n {t('templateEditorToolbar.addToCatalogButton')}\n </Button>\n </ButtonGroup>\n <Drawer\n classes={{ paper: classes.paper }}\n anchor=\"right\"\n open={showFieldsDrawer}\n onClose={() => setShowFieldsDrawer(false)}\n >\n <CustomFieldPlayground fieldExtensions={fieldExtensions} />\n </Drawer>\n <Drawer\n classes={{ paper: classes.paper }}\n anchor=\"right\"\n open={showActionsDrawer}\n onClose={() => setShowActionsDrawer(false)}\n >\n <ActionPageContent />\n </Drawer>\n <Drawer\n classes={{ paper: classes.paper }}\n anchor=\"right\"\n open={showExtensionsDrawer}\n onClose={() => setShowExtensionsDrawer(false)}\n >\n <TemplatingExtensionsPageContent />\n </Drawer>\n <Dialog\n onClose={() => setShowPublishModal(false)}\n open={showPublishModal}\n aria-labelledby=\"publish-dialog-title\"\n aria-describedby=\"publish-dialog-description\"\n >\n <DialogTitle id=\"publish-dialog-title\">\n {t('templateEditorToolbar.addToCatalogDialogTitle')}\n </DialogTitle>\n <DialogContent dividers>\n <DialogContentText id=\"publish-dialog-slide-description\">\n {t(\n 'templateEditorToolbar.addToCatalogDialogContent.stepsIntroduction',\n )}\n <ul>\n {t(\n 'templateEditorToolbar.addToCatalogDialogContent.stepsListItems',\n )\n .split('\\n')\n .map((step, index) => (\n <li key={index}>{step}</li>\n ))}\n </ul>\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n color=\"primary\"\n href={t(\n 'templateEditorToolbar.addToCatalogDialogActions.documentationUrl',\n )}\n target=\"_blank\"\n >\n {t(\n 'templateEditorToolbar.addToCatalogDialogActions.documentationButton',\n )}\n </Button>\n </DialogActions>\n </Dialog>\n </Toolbar>\n </AppBar>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateEditorToolbar.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorToolbar.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ReactNode, useState } from 'react';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport AppBar from '@material-ui/core/AppBar';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport ButtonGroup from '@material-ui/core/ButtonGroup';\nimport Button from '@material-ui/core/Button';\nimport Drawer from '@material-ui/core/Drawer';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport ExtensionIcon from '@material-ui/icons/Extension';\nimport DescriptionIcon from '@material-ui/icons/Description';\nimport FunctionsIcon from '@material-ui/icons/Functions';\n\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react';\n\nimport { ActionPageContent } from '../../../components/ActionsPage/ActionsPage';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { CustomFieldPlayground } from './CustomFieldPlayground';\nimport { TemplatingExtensionsPageContent } from '../../../components/TemplatingExtensionsPage/TemplatingExtensionsPage';\n\nconst useStyles = makeStyles(\n theme => ({\n paper: {\n width: '90%',\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n [theme.breakpoints.up('sm')]: {\n width: '70%',\n },\n [theme.breakpoints.up('md')]: {\n width: '50%',\n },\n },\n appbar: {\n zIndex: 1,\n },\n toolbar: {\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n gridGap: theme.spacing(1),\n padding: theme.spacing(0, 1),\n backgroundColor: theme.palette.background.paper,\n },\n toolbarCustomActions: {\n display: 'grid',\n alignItems: 'center',\n gridAutoFlow: 'Column',\n gridGap: theme.spacing(1),\n },\n toolbarDefaultActions: {\n justifySelf: 'end',\n },\n }),\n { name: 'ScaffolderTemplateEditorToolbar' },\n);\n\nexport function TemplateEditorToolbar(props: {\n children?: ReactNode;\n fieldExtensions?: FieldExtensionOptions<any, any>[];\n}) {\n const { children, fieldExtensions } = props;\n const classes = useStyles();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const [showFieldsDrawer, setShowFieldsDrawer] = useState(false);\n const [showActionsDrawer, setShowActionsDrawer] = useState(false);\n const [showExtensionsDrawer, setShowExtensionsDrawer] = useState(false);\n const [showPublishModal, setShowPublishModal] = useState(false);\n\n return (\n <AppBar className={classes.appbar} position=\"relative\">\n <Toolbar className={classes.toolbar}>\n <div className={classes.toolbarCustomActions}>{children}</div>\n <ButtonGroup className={classes.toolbarDefaultActions} variant=\"text\">\n <Tooltip\n title={t('templateEditorToolbar.customFieldExplorerTooltip')}\n >\n <Button onClick={() => setShowFieldsDrawer(true)}>\n <ExtensionIcon />\n </Button>\n </Tooltip>\n <Tooltip\n title={t(\n 'templateEditorToolbar.installedActionsDocumentationTooltip',\n )}\n >\n <Button onClick={() => setShowActionsDrawer(true)}>\n <DescriptionIcon />\n </Button>\n </Tooltip>\n <Tooltip\n title={t(\n 'templateEditorToolbar.templatingExtensionsDocumentationTooltip',\n )}\n >\n <Button onClick={() => setShowExtensionsDrawer(true)}>\n <FunctionsIcon />\n </Button>\n </Tooltip>\n <Button onClick={() => setShowPublishModal(true)}>\n {t('templateEditorToolbar.addToCatalogButton')}\n </Button>\n </ButtonGroup>\n <Drawer\n classes={{ paper: classes.paper }}\n anchor=\"right\"\n open={showFieldsDrawer}\n onClose={() => setShowFieldsDrawer(false)}\n >\n <CustomFieldPlayground fieldExtensions={fieldExtensions} />\n </Drawer>\n <Drawer\n classes={{ paper: classes.paper }}\n anchor=\"right\"\n open={showActionsDrawer}\n onClose={() => setShowActionsDrawer(false)}\n >\n <ActionPageContent />\n </Drawer>\n <Drawer\n classes={{ paper: classes.paper }}\n anchor=\"right\"\n open={showExtensionsDrawer}\n onClose={() => setShowExtensionsDrawer(false)}\n >\n <TemplatingExtensionsPageContent />\n </Drawer>\n <Dialog\n onClose={() => setShowPublishModal(false)}\n open={showPublishModal}\n aria-labelledby=\"publish-dialog-title\"\n aria-describedby=\"publish-dialog-description\"\n >\n <DialogTitle id=\"publish-dialog-title\">\n {t('templateEditorToolbar.addToCatalogDialogTitle')}\n </DialogTitle>\n <DialogContent dividers>\n <DialogContentText id=\"publish-dialog-slide-description\">\n {t(\n 'templateEditorToolbar.addToCatalogDialogContent.stepsIntroduction',\n )}\n <ul>\n {t(\n 'templateEditorToolbar.addToCatalogDialogContent.stepsListItems',\n )\n .split('\\n')\n .map((step, index) => (\n <li key={index}>{step}</li>\n ))}\n </ul>\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n color=\"primary\"\n href={t(\n 'templateEditorToolbar.addToCatalogDialogActions.documentationUrl',\n )}\n target=\"_blank\"\n >\n {t(\n 'templateEditorToolbar.addToCatalogDialogActions.documentationButton',\n )}\n </Button>\n </DialogActions>\n </Dialog>\n </Toolbar>\n </AppBar>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateEditorToolbarFileMenu.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorToolbarFileMenu.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MouseEvent, useCallback, useState } from 'react';\n\nimport Button from '@material-ui/core/Button';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\n\nimport { scaffolderTranslationRef } from '../../../translation';\n\nexport function TemplateEditorToolbarFileMenu(props: {\n onOpenDirectory?: () => void;\n onCreateDirectory?: () => void;\n onCloseDirectory?: () => void;\n}) {\n const { onOpenDirectory, onCreateDirectory, onCloseDirectory } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n\n const handleOpenMenu = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n },\n [setAnchorEl],\n );\n\n const handleCloseMenu = useCallback(() => {\n setAnchorEl(null);\n }, [setAnchorEl]);\n\n const handleOpenDirectory = useCallback(() => {\n handleCloseMenu();\n onOpenDirectory?.();\n }, [handleCloseMenu, onOpenDirectory]);\n\n const handleCreateDirectory = useCallback(() => {\n handleCloseMenu();\n onCreateDirectory?.();\n }, [handleCloseMenu, onCreateDirectory]);\n\n const handleCloseEditor = useCallback(() => {\n handleCloseMenu();\n onCloseDirectory?.();\n }, [handleCloseMenu, onCloseDirectory]);\n\n return (\n <>\n <Button\n aria-controls=\"file-menu\"\n aria-haspopup=\"true\"\n onClick={handleOpenMenu}\n >\n {t('templateEditorToolbarFileMenu.button')}\n </Button>\n <Menu\n id=\"file-menu\"\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={handleCloseMenu}\n getContentAnchorEl={null}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n >\n <MenuItem onClick={handleOpenDirectory} disabled={!onOpenDirectory}>\n {t('templateEditorToolbarFileMenu.options.openDirectory')}\n </MenuItem>\n <MenuItem\n onClick={handleCreateDirectory}\n disabled={!onCreateDirectory}\n divider\n >\n {t('templateEditorToolbarFileMenu.options.createDirectory')}\n </MenuItem>\n <MenuItem onClick={handleCloseEditor} disabled={!onCloseDirectory}>\n {t('templateEditorToolbarFileMenu.options.closeEditor')}\n </MenuItem>\n </Menu>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AA0BO,SAAS,8BAA8B,KAI3C,EAAA;AACD,EAAA,MAAM,EAAE,eAAA,EAAiB,iBAAmB,EAAA,gBAAA,EAAqB,GAAA,KAAA;AACjE,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAA6B,IAAI,CAAA;AAEjE,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,KAAyC,KAAA;AACxC,MAAA,WAAA,CAAY,MAAM,aAAa,CAAA;AAAA,KACjC;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAM,MAAA,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,GAClB,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAM,MAAA,mBAAA,GAAsB,YAAY,MAAM;AAC5C,IAAgB,eAAA,EAAA;AAChB,IAAkB,eAAA,IAAA;AAAA,GACjB,EAAA,CAAC,eAAiB,EAAA,eAAe,CAAC,CAAA;AAErC,EAAM,MAAA,qBAAA,GAAwB,YAAY,MAAM;AAC9C,IAAgB,eAAA,EAAA;AAChB,IAAoB,iBAAA,IAAA;AAAA,GACnB,EAAA,CAAC,eAAiB,EAAA,iBAAiB,CAAC,CAAA;AAEvC,EAAM,MAAA,iBAAA,GAAoB,YAAY,MAAM;AAC1C,IAAgB,eAAA,EAAA;AAChB,IAAmB,gBAAA,IAAA;AAAA,GAClB,EAAA,CAAC,eAAiB,EAAA,gBAAgB,CAAC,CAAA;AAEtC,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,eAAc,EAAA,WAAA;AAAA,QACd,eAAc,EAAA,MAAA;AAAA,QACd,OAAS,EAAA,cAAA;AAAA,QAER,YAAE,sCAAsC;AAAA;AAAA,KAC3C;AAAA,oBACA,IAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,EAAG,EAAA,WAAA;AAAA,QACH,QAAA;AAAA,QACA,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,QACtB,OAAS,EAAA,eAAA;AAAA,QACT,kBAAoB,EAAA,IAAA;AAAA,QACpB,YAAc,EAAA;AAAA,UACZ,QAAU,EAAA,QAAA;AAAA,UACV,UAAY,EAAA;AAAA,SACd;AAAA,QACA,eAAiB,EAAA;AAAA,UACf,QAAU,EAAA,KAAA;AAAA,UACV,UAAY,EAAA;AAAA,SACd;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAA,QAAA,EAAA,EAAS,SAAS,mBAAqB,EAAA,QAAA,EAAU,CAAC,eAChD,EAAA,QAAA,EAAA,CAAA,CAAE,qDAAqD,CAC1D,EAAA,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAS,EAAA,qBAAA;AAAA,cACT,UAAU,CAAC,iBAAA;AAAA,cACX,OAAO,EAAA,IAAA;AAAA,cAEN,YAAE,uDAAuD;AAAA;AAAA,WAC5D;AAAA,0BACA,GAAA,CAAC,YAAS,OAAS,EAAA,iBAAA,EAAmB,UAAU,CAAC,gBAAA,EAC9C,QAAE,EAAA,CAAA,CAAA,mDAAmD,CACxD,EAAA;AAAA;AAAA;AAAA;AACF,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TemplateEditorToolbarFileMenu.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorToolbarFileMenu.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MouseEvent, useCallback, useState } from 'react';\n\nimport Button from '@material-ui/core/Button';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\n\nimport { scaffolderTranslationRef } from '../../../translation';\n\nexport function TemplateEditorToolbarFileMenu(props: {\n onOpenDirectory?: () => void;\n onCreateDirectory?: () => void;\n onCloseDirectory?: () => void;\n}) {\n const { onOpenDirectory, onCreateDirectory, onCloseDirectory } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n\n const handleOpenMenu = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n },\n [setAnchorEl],\n );\n\n const handleCloseMenu = useCallback(() => {\n setAnchorEl(null);\n }, [setAnchorEl]);\n\n const handleOpenDirectory = useCallback(() => {\n handleCloseMenu();\n onOpenDirectory?.();\n }, [handleCloseMenu, onOpenDirectory]);\n\n const handleCreateDirectory = useCallback(() => {\n handleCloseMenu();\n onCreateDirectory?.();\n }, [handleCloseMenu, onCreateDirectory]);\n\n const handleCloseEditor = useCallback(() => {\n handleCloseMenu();\n onCloseDirectory?.();\n }, [handleCloseMenu, onCloseDirectory]);\n\n return (\n <>\n <Button\n aria-controls=\"file-menu\"\n aria-haspopup=\"true\"\n onClick={handleOpenMenu}\n >\n {t('templateEditorToolbarFileMenu.button')}\n </Button>\n <Menu\n id=\"file-menu\"\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={handleCloseMenu}\n getContentAnchorEl={null}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n >\n <MenuItem onClick={handleOpenDirectory} disabled={!onOpenDirectory}>\n {t('templateEditorToolbarFileMenu.options.openDirectory')}\n </MenuItem>\n <MenuItem\n onClick={handleCreateDirectory}\n disabled={!onCreateDirectory}\n divider\n >\n {t('templateEditorToolbarFileMenu.options.createDirectory')}\n </MenuItem>\n <MenuItem onClick={handleCloseEditor} disabled={!onCloseDirectory}>\n {t('templateEditorToolbarFileMenu.options.closeEditor')}\n </MenuItem>\n </Menu>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AA0BO,SAAS,8BAA8B,KAAA,EAI3C;AACD,EAAA,MAAM,EAAE,eAAA,EAAiB,iBAAA,EAAmB,gBAAA,EAAiB,GAAI,KAAA;AACjE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAA6B,IAAI,CAAA;AAEjE,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,CAAC,KAAA,KAAyC;AACxC,MAAA,WAAA,CAAY,MAAM,aAAa,CAAA;AAAA,IACjC,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,mBAAA,GAAsB,YAAY,MAAM;AAC5C,IAAA,eAAA,EAAgB;AAChB,IAAA,eAAA,IAAkB;AAAA,EACpB,CAAA,EAAG,CAAC,eAAA,EAAiB,eAAe,CAAC,CAAA;AAErC,EAAA,MAAM,qBAAA,GAAwB,YAAY,MAAM;AAC9C,IAAA,eAAA,EAAgB;AAChB,IAAA,iBAAA,IAAoB;AAAA,EACtB,CAAA,EAAG,CAAC,eAAA,EAAiB,iBAAiB,CAAC,CAAA;AAEvC,EAAA,MAAM,iBAAA,GAAoB,YAAY,MAAM;AAC1C,IAAA,eAAA,EAAgB;AAChB,IAAA,gBAAA,IAAmB;AAAA,EACrB,CAAA,EAAG,CAAC,eAAA,EAAiB,gBAAgB,CAAC,CAAA;AAEtC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,eAAA,EAAc,WAAA;AAAA,QACd,eAAA,EAAc,MAAA;AAAA,QACd,OAAA,EAAS,cAAA;AAAA,QAER,YAAE,sCAAsC;AAAA;AAAA,KAC3C;AAAA,oBACA,IAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAG,WAAA;AAAA,QACH,QAAA;AAAA,QACA,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,QACtB,OAAA,EAAS,eAAA;AAAA,QACT,kBAAA,EAAoB,IAAA;AAAA,QACpB,YAAA,EAAc;AAAA,UACZ,QAAA,EAAU,QAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,QAAA,EAAU,KAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAS,SAAS,mBAAA,EAAqB,QAAA,EAAU,CAAC,eAAA,EAChD,QAAA,EAAA,CAAA,CAAE,qDAAqD,CAAA,EAC1D,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,qBAAA;AAAA,cACT,UAAU,CAAC,iBAAA;AAAA,cACX,OAAA,EAAO,IAAA;AAAA,cAEN,YAAE,uDAAuD;AAAA;AAAA,WAC5D;AAAA,0BACA,GAAA,CAAC,YAAS,OAAA,EAAS,iBAAA,EAAmB,UAAU,CAAC,gBAAA,EAC9C,QAAA,EAAA,CAAA,CAAE,mDAAmD,CAAA,EACxD;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateEditorToolbarTemplatesMenu.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorToolbarTemplatesMenu.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MouseEvent, useCallback, useState } from 'react';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { Entity } from '@backstage/catalog-model';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nconst ITEM_HEIGHT = 48;\n\nconst useStyles = makeStyles({\n menu: {\n maxHeight: ITEM_HEIGHT * 5,\n },\n});\n\nexport type TemplateOption = {\n label: string;\n value: Entity;\n};\n\nexport function TemplateEditorToolbarTemplatesMenu(props: {\n options: TemplateOption[];\n selectedOption?: TemplateOption;\n onSelectOption: (option: TemplateOption) => void;\n}) {\n const { options, selectedOption, onSelectOption } = props;\n const classes = useStyles();\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const isSelectedOption = useCallback(\n (option: TemplateOption) => {\n return !!selectedOption && selectedOption.value === option.value;\n },\n [selectedOption],\n );\n\n const handleOpenMenu = useCallback(\n (event: MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n },\n [setAnchorEl],\n );\n\n const handleCloseMenu = useCallback(() => {\n setAnchorEl(null);\n }, [setAnchorEl]);\n\n const handleSelectOption = useCallback(\n (option: TemplateOption) => {\n handleCloseMenu();\n onSelectOption(option);\n },\n [handleCloseMenu, onSelectOption],\n );\n\n return (\n <>\n <Button\n aria-controls=\"templates-menu\"\n aria-haspopup=\"true\"\n onClick={handleOpenMenu}\n >\n {t('templateEditorToolbarTemplatesMenu.button')}\n </Button>\n <Menu\n id=\"templates-menu\"\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={handleCloseMenu}\n getContentAnchorEl={null}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n PaperProps={{\n className: classes.menu,\n }}\n >\n {options.map((option, index) => (\n <MenuItem\n key={index}\n selected={isSelectedOption(option)}\n aria-selected={isSelectedOption(option)}\n onClick={() => handleSelectOption(option)}\n >\n {option.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AA2BA,MAAM,WAAc,GAAA,EAAA;AAEpB,MAAM,YAAY,UAAW,CAAA;AAAA,EAC3B,IAAM,EAAA;AAAA,IACJ,WAAW,WAAc,GAAA;AAAA;AAE7B,CAAC,CAAA;AAOM,SAAS,mCAAmC,KAIhD,EAAA;AACD,EAAA,MAAM,EAAE,OAAA,EAAS,cAAgB,EAAA,cAAA,EAAmB,GAAA,KAAA;AACpD,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAA6B,IAAI,CAAA;AACjE,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,gBAAmB,GAAA,WAAA;AAAA,IACvB,CAAC,MAA2B,KAAA;AAC1B,MAAA,OAAO,CAAC,CAAC,cAAkB,IAAA,cAAA,CAAe,UAAU,MAAO,CAAA,KAAA;AAAA,KAC7D;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,KAAmC,KAAA;AAClC,MAAA,WAAA,CAAY,MAAM,aAAa,CAAA;AAAA,KACjC;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAM,MAAA,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,GAClB,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,kBAAqB,GAAA,WAAA;AAAA,IACzB,CAAC,MAA2B,KAAA;AAC1B,MAAgB,eAAA,EAAA;AAChB,MAAA,cAAA,CAAe,MAAM,CAAA;AAAA,KACvB;AAAA,IACA,CAAC,iBAAiB,cAAc;AAAA,GAClC;AAEA,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,eAAc,EAAA,gBAAA;AAAA,QACd,eAAc,EAAA,MAAA;AAAA,QACd,OAAS,EAAA,cAAA;AAAA,QAER,YAAE,2CAA2C;AAAA;AAAA,KAChD;AAAA,oBACA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,EAAG,EAAA,gBAAA;AAAA,QACH,QAAA;AAAA,QACA,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,QACtB,OAAS,EAAA,eAAA;AAAA,QACT,kBAAoB,EAAA,IAAA;AAAA,QACpB,YAAc,EAAA;AAAA,UACZ,QAAU,EAAA,QAAA;AAAA,UACV,UAAY,EAAA;AAAA,SACd;AAAA,QACA,eAAiB,EAAA;AAAA,UACf,QAAU,EAAA,KAAA;AAAA,UACV,UAAY,EAAA;AAAA,SACd;AAAA,QACA,UAAY,EAAA;AAAA,UACV,WAAW,OAAQ,CAAA;AAAA,SACrB;AAAA,QAEC,QAAQ,EAAA,OAAA,CAAA,GAAA,CAAI,CAAC,MAAA,EAAQ,KACpB,qBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,QAAA,EAAU,iBAAiB,MAAM,CAAA;AAAA,YACjC,eAAA,EAAe,iBAAiB,MAAM,CAAA;AAAA,YACtC,OAAA,EAAS,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAAA,YAEvC,QAAO,EAAA,MAAA,CAAA;AAAA,WAAA;AAAA,UALH;AAAA,SAOR;AAAA;AAAA;AACH,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TemplateEditorToolbarTemplatesMenu.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateEditorToolbarTemplatesMenu.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MouseEvent, useCallback, useState } from 'react';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { Entity } from '@backstage/catalog-model';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nconst ITEM_HEIGHT = 48;\n\nconst useStyles = makeStyles({\n menu: {\n maxHeight: ITEM_HEIGHT * 5,\n },\n});\n\nexport type TemplateOption = {\n label: string;\n value: Entity;\n};\n\nexport function TemplateEditorToolbarTemplatesMenu(props: {\n options: TemplateOption[];\n selectedOption?: TemplateOption;\n onSelectOption: (option: TemplateOption) => void;\n}) {\n const { options, selectedOption, onSelectOption } = props;\n const classes = useStyles();\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const isSelectedOption = useCallback(\n (option: TemplateOption) => {\n return !!selectedOption && selectedOption.value === option.value;\n },\n [selectedOption],\n );\n\n const handleOpenMenu = useCallback(\n (event: MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n },\n [setAnchorEl],\n );\n\n const handleCloseMenu = useCallback(() => {\n setAnchorEl(null);\n }, [setAnchorEl]);\n\n const handleSelectOption = useCallback(\n (option: TemplateOption) => {\n handleCloseMenu();\n onSelectOption(option);\n },\n [handleCloseMenu, onSelectOption],\n );\n\n return (\n <>\n <Button\n aria-controls=\"templates-menu\"\n aria-haspopup=\"true\"\n onClick={handleOpenMenu}\n >\n {t('templateEditorToolbarTemplatesMenu.button')}\n </Button>\n <Menu\n id=\"templates-menu\"\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={handleCloseMenu}\n getContentAnchorEl={null}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n PaperProps={{\n className: classes.menu,\n }}\n >\n {options.map((option, index) => (\n <MenuItem\n key={index}\n selected={isSelectedOption(option)}\n aria-selected={isSelectedOption(option)}\n onClick={() => handleSelectOption(option)}\n >\n {option.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AA2BA,MAAM,WAAA,GAAc,EAAA;AAEpB,MAAM,YAAY,UAAA,CAAW;AAAA,EAC3B,IAAA,EAAM;AAAA,IACJ,WAAW,WAAA,GAAc;AAAA;AAE7B,CAAC,CAAA;AAOM,SAAS,mCAAmC,KAAA,EAIhD;AACD,EAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAgB,cAAA,EAAe,GAAI,KAAA;AACpD,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAA6B,IAAI,CAAA;AACjE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACvB,CAAC,MAAA,KAA2B;AAC1B,MAAA,OAAO,CAAC,CAAC,cAAA,IAAkB,cAAA,CAAe,UAAU,MAAA,CAAO,KAAA;AAAA,IAC7D,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,CAAC,KAAA,KAAmC;AAClC,MAAA,WAAA,CAAY,MAAM,aAAa,CAAA;AAAA,IACjC,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,kBAAA,GAAqB,WAAA;AAAA,IACzB,CAAC,MAAA,KAA2B;AAC1B,MAAA,eAAA,EAAgB;AAChB,MAAA,cAAA,CAAe,MAAM,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,iBAAiB,cAAc;AAAA,GAClC;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,eAAA,EAAc,gBAAA;AAAA,QACd,eAAA,EAAc,MAAA;AAAA,QACd,OAAA,EAAS,cAAA;AAAA,QAER,YAAE,2CAA2C;AAAA;AAAA,KAChD;AAAA,oBACA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAG,gBAAA;AAAA,QACH,QAAA;AAAA,QACA,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,QACtB,OAAA,EAAS,eAAA;AAAA,QACT,kBAAA,EAAoB,IAAA;AAAA,QACpB,YAAA,EAAc;AAAA,UACZ,QAAA,EAAU,QAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,QAAA,EAAU,KAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd;AAAA,QACA,UAAA,EAAY;AAAA,UACV,WAAW,OAAA,CAAQ;AAAA,SACrB;AAAA,QAEC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBACpB,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,QAAA,EAAU,iBAAiB,MAAM,CAAA;AAAA,YACjC,eAAA,EAAe,iBAAiB,MAAM,CAAA;AAAA,YACtC,OAAA,EAAS,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAAA,YAEvC,QAAA,EAAA,MAAA,CAAO;AAAA,WAAA;AAAA,UALH;AAAA,SAOR;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateFormPage.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateFormPage.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { Page, Header, Content } from '@backstage/core-components';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n FormProps,\n LayoutOptions,\n FieldExtensionOptions,\n} from '@backstage/plugin-scaffolder-react';\n\nimport { editRouteRef } from '../../../routes';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nimport { TemplateFormPreviewer } from './TemplateFormPreviewer';\n\nconst useStyles = makeStyles({\n root: {\n padding: 0,\n },\n});\n\ninterface TemplateFormPageProps {\n layouts?: LayoutOptions[];\n formProps?: FormProps;\n fieldExtensions?: FieldExtensionOptions<any, any>[];\n defaultPreviewTemplate?: string;\n}\n\nexport function TemplateFormPage(props: TemplateFormPageProps) {\n const classes = useStyles();\n const navigate = useNavigate();\n const editLink = useRouteRef(editRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const handleClose = useCallback(() => {\n navigate(editLink());\n }, [navigate, editLink]);\n\n return (\n <Page themeId=\"home\">\n <Header\n title={t('templateFormPage.title')}\n subtitle={t('templateFormPage.subtitle')}\n type={t('templateIntroPage.title')}\n typeLink={editLink()}\n />\n <Content className={classes.root}>\n <TemplateFormPreviewer\n layouts={props.layouts}\n formProps={props.formProps}\n customFieldExtensions={props.fieldExtensions}\n defaultPreviewTemplate={props.defaultPreviewTemplate}\n onClose={handleClose}\n />\n </Content>\n </Page>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAmCA,MAAM,YAAY,UAAW,CAAA;AAAA,EAC3B,IAAM,EAAA;AAAA,IACJ,OAAS,EAAA;AAAA;AAEb,CAAC,CAAA;AASM,SAAS,iBAAiB,KAA8B,EAAA;AAC7D,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAM,MAAA,QAAA,GAAW,YAAY,YAAY,CAAA;AACzC,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAM,MAAA,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,QAAA,CAAS,UAAU,CAAA;AAAA,GAClB,EAAA,CAAC,QAAU,EAAA,QAAQ,CAAC,CAAA;AAEvB,EACE,uBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,MACZ,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,wBAAwB,CAAA;AAAA,QACjC,QAAA,EAAU,EAAE,2BAA2B,CAAA;AAAA,QACvC,IAAA,EAAM,EAAE,yBAAyB,CAAA;AAAA,QACjC,UAAU,QAAS;AAAA;AAAA,KACrB;AAAA,oBACC,GAAA,CAAA,OAAA,EAAA,EAAQ,SAAW,EAAA,OAAA,CAAQ,IAC1B,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAM,CAAA,OAAA;AAAA,QACf,WAAW,KAAM,CAAA,SAAA;AAAA,QACjB,uBAAuB,KAAM,CAAA,eAAA;AAAA,QAC7B,wBAAwB,KAAM,CAAA,sBAAA;AAAA,QAC9B,OAAS,EAAA;AAAA;AAAA,KAEb,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TemplateFormPage.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateFormPage.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { Page, Header, Content } from '@backstage/core-components';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n FormProps,\n LayoutOptions,\n FieldExtensionOptions,\n} from '@backstage/plugin-scaffolder-react';\n\nimport { editRouteRef } from '../../../routes';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nimport { TemplateFormPreviewer } from './TemplateFormPreviewer';\n\nconst useStyles = makeStyles({\n root: {\n padding: 0,\n },\n});\n\ninterface TemplateFormPageProps {\n layouts?: LayoutOptions[];\n formProps?: FormProps;\n fieldExtensions?: FieldExtensionOptions<any, any>[];\n defaultPreviewTemplate?: string;\n}\n\nexport function TemplateFormPage(props: TemplateFormPageProps) {\n const classes = useStyles();\n const navigate = useNavigate();\n const editLink = useRouteRef(editRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const handleClose = useCallback(() => {\n navigate(editLink());\n }, [navigate, editLink]);\n\n return (\n <Page themeId=\"home\">\n <Header\n title={t('templateFormPage.title')}\n subtitle={t('templateFormPage.subtitle')}\n type={t('templateIntroPage.title')}\n typeLink={editLink()}\n />\n <Content className={classes.root}>\n <TemplateFormPreviewer\n layouts={props.layouts}\n formProps={props.formProps}\n customFieldExtensions={props.fieldExtensions}\n defaultPreviewTemplate={props.defaultPreviewTemplate}\n onClose={handleClose}\n />\n </Content>\n </Page>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAmCA,MAAM,YAAY,UAAA,CAAW;AAAA,EAC3B,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AASM,SAAS,iBAAiB,KAAA,EAA8B;AAC7D,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,QAAA,GAAW,YAAY,YAAY,CAAA;AACzC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,QAAA,CAAS,UAAU,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AAEvB,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,MAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,wBAAwB,CAAA;AAAA,QACjC,QAAA,EAAU,EAAE,2BAA2B,CAAA;AAAA,QACvC,IAAA,EAAM,EAAE,yBAAyB,CAAA;AAAA,QACjC,UAAU,QAAA;AAAS;AAAA,KACrB;AAAA,oBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,IAAA,EAC1B,QAAA,kBAAA,GAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,uBAAuB,KAAA,CAAM,eAAA;AAAA,QAC7B,wBAAwB,KAAA,CAAM,sBAAA;AAAA,QAC9B,OAAA,EAAS;AAAA;AAAA,KACX,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -7,7 +7,7 @@ import { makeStyles } from '@material-ui/core/styles';
7
7
  import { useApi, alertApiRef, useRouteRef } from '@backstage/core-plugin-api';
8
8
  import { catalogApiRef, humanizeEntityRef } from '@backstage/plugin-catalog-react';
9
9
  import { editRouteRef } from '../../../routes.esm.js';
10
- import { TemplateEditorLayout, TemplateEditorLayoutToolbar, TemplateEditorPanels, TemplateEditorLayoutFiles, TemplateEditorLayoutPreview } from './TemplateEditorLayout.esm.js';
10
+ import { TemplateEditorLayout, TemplateEditorLayoutToolbar, TemplateEditorPanels, TemplateEditorLayoutPreview, TemplateEditorLayoutFiles } from './TemplateEditorLayout.esm.js';
11
11
  import { TemplateEditorToolbar } from './TemplateEditorToolbar.esm.js';
12
12
  import { TemplateEditorToolbarFileMenu } from './TemplateEditorToolbarFileMenu.esm.js';
13
13
  import { TemplateEditorToolbarTemplatesMenu } from './TemplateEditorToolbarTemplatesMenu.esm.js';