@backstage/plugin-scaffolder 1.30.0-next.1 → 1.30.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 (139) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/dist/alpha/components/TemplateEditorPage/CustomFieldExplorer.esm.js +98 -84
  3. package/dist/alpha/components/TemplateEditorPage/CustomFieldExplorer.esm.js.map +1 -1
  4. package/dist/alpha/components/TemplateEditorPage/CustomFieldPlaygroud.esm.js +119 -102
  5. package/dist/alpha/components/TemplateEditorPage/CustomFieldPlaygroud.esm.js.map +1 -1
  6. package/dist/alpha/components/TemplateEditorPage/CustomFieldsPage.esm.js +13 -10
  7. package/dist/alpha/components/TemplateEditorPage/CustomFieldsPage.esm.js.map +1 -1
  8. package/dist/alpha/components/TemplateEditorPage/DirectoryEditorContext.esm.js +4 -3
  9. package/dist/alpha/components/TemplateEditorPage/DirectoryEditorContext.esm.js.map +1 -1
  10. package/dist/alpha/components/TemplateEditorPage/DryRunContext.esm.js +3 -2
  11. package/dist/alpha/components/TemplateEditorPage/DryRunContext.esm.js.map +1 -1
  12. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResults.esm.js +22 -15
  13. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResults.esm.js.map +1 -1
  14. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsList.esm.js +49 -44
  15. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsList.esm.js.map +1 -1
  16. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsSplitView.esm.js +7 -2
  17. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsSplitView.esm.js.map +1 -1
  18. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsView.esm.js +79 -57
  19. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsView.esm.js.map +1 -1
  20. package/dist/alpha/components/TemplateEditorPage/DryRunResults/IconLink.esm.js +5 -2
  21. package/dist/alpha/components/TemplateEditorPage/DryRunResults/IconLink.esm.js.map +1 -1
  22. package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskPageLinks.esm.js +6 -6
  23. package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskPageLinks.esm.js.map +1 -1
  24. package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskStatusStepper.esm.js +40 -36
  25. package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskStatusStepper.esm.js.map +1 -1
  26. package/dist/alpha/components/TemplateEditorPage/TemplateEditor.esm.js +24 -17
  27. package/dist/alpha/components/TemplateEditorPage/TemplateEditor.esm.js.map +1 -1
  28. package/dist/alpha/components/TemplateEditorPage/TemplateEditorBrowser.esm.js +50 -42
  29. package/dist/alpha/components/TemplateEditorPage/TemplateEditorBrowser.esm.js.map +1 -1
  30. package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js +5 -4
  31. package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js.map +1 -1
  32. package/dist/alpha/components/TemplateEditorPage/TemplateEditorIntro.esm.js +87 -70
  33. package/dist/alpha/components/TemplateEditorPage/TemplateEditorIntro.esm.js.map +1 -1
  34. package/dist/alpha/components/TemplateEditorPage/TemplateEditorLayout.esm.js +7 -7
  35. package/dist/alpha/components/TemplateEditorPage/TemplateEditorLayout.esm.js.map +1 -1
  36. package/dist/alpha/components/TemplateEditorPage/TemplateEditorPage.esm.js +20 -17
  37. package/dist/alpha/components/TemplateEditorPage/TemplateEditorPage.esm.js.map +1 -1
  38. package/dist/alpha/components/TemplateEditorPage/TemplateEditorTextArea.esm.js +52 -45
  39. package/dist/alpha/components/TemplateEditorPage/TemplateEditorTextArea.esm.js.map +1 -1
  40. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js +76 -60
  41. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js.map +1 -1
  42. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarFileMenu.esm.js +42 -36
  43. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarFileMenu.esm.js.map +1 -1
  44. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarTemplatesMenu.esm.js +42 -38
  45. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarTemplatesMenu.esm.js.map +1 -1
  46. package/dist/alpha/components/TemplateEditorPage/TemplateFormPage.esm.js +23 -19
  47. package/dist/alpha/components/TemplateEditorPage/TemplateFormPage.esm.js.map +1 -1
  48. package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js +39 -31
  49. package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js.map +1 -1
  50. package/dist/alpha/components/TemplateEditorPage/TemplateIntroPage.esm.js +14 -10
  51. package/dist/alpha/components/TemplateEditorPage/TemplateIntroPage.esm.js.map +1 -1
  52. package/dist/alpha/components/TemplateListPage/RegisterExistingButton.esm.js +6 -6
  53. package/dist/alpha/components/TemplateListPage/RegisterExistingButton.esm.js.map +1 -1
  54. package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js +54 -34
  55. package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js.map +1 -1
  56. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPage.esm.js +29 -24
  57. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPage.esm.js.map +1 -1
  58. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js +40 -33
  59. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js.map +1 -1
  60. package/dist/alpha/extensions.esm.js +2 -2
  61. package/dist/alpha/extensions.esm.js.map +1 -1
  62. package/dist/alpha/fields/RepoUrlPicker.esm.js +1 -1
  63. package/dist/alpha.d.ts +13 -13
  64. package/dist/components/ActionsPage/ActionsPage.esm.js +120 -167
  65. package/dist/components/ActionsPage/ActionsPage.esm.js.map +1 -1
  66. package/dist/components/FileBrowser/FileBrowser.esm.js +10 -9
  67. package/dist/components/FileBrowser/FileBrowser.esm.js.map +1 -1
  68. package/dist/components/ListTasksPage/ListTasksPage.esm.js +80 -70
  69. package/dist/components/ListTasksPage/ListTasksPage.esm.js.map +1 -1
  70. package/dist/components/ListTasksPage/OwnerListPicker.esm.js +29 -23
  71. package/dist/components/ListTasksPage/OwnerListPicker.esm.js.map +1 -1
  72. package/dist/components/ListTasksPage/columns/CreatedAtColumn.esm.js +2 -2
  73. package/dist/components/ListTasksPage/columns/CreatedAtColumn.esm.js.map +1 -1
  74. package/dist/components/ListTasksPage/columns/OwnerEntityColumn.esm.js +3 -3
  75. package/dist/components/ListTasksPage/columns/OwnerEntityColumn.esm.js.map +1 -1
  76. package/dist/components/ListTasksPage/columns/TaskStatusColumn.esm.js +4 -4
  77. package/dist/components/ListTasksPage/columns/TaskStatusColumn.esm.js.map +1 -1
  78. package/dist/components/ListTasksPage/columns/TemplateTitleColumn.esm.js +2 -2
  79. package/dist/components/ListTasksPage/columns/TemplateTitleColumn.esm.js.map +1 -1
  80. package/dist/components/OngoingTask/ContextMenu.esm.js +80 -58
  81. package/dist/components/OngoingTask/ContextMenu.esm.js.map +1 -1
  82. package/dist/components/OngoingTask/OngoingTask.esm.js +95 -76
  83. package/dist/components/OngoingTask/OngoingTask.esm.js.map +1 -1
  84. package/dist/components/RenderSchema/RenderSchema.esm.js +379 -0
  85. package/dist/components/RenderSchema/RenderSchema.esm.js.map +1 -0
  86. package/dist/components/Router/Router.esm.js +105 -94
  87. package/dist/components/Router/Router.esm.js.map +1 -1
  88. package/dist/components/ScaffolderUsageExamplesTable/ScaffolderUsageExamplesTable.esm.js +28 -0
  89. package/dist/components/ScaffolderUsageExamplesTable/ScaffolderUsageExamplesTable.esm.js.map +1 -0
  90. package/dist/components/TemplateTypePicker/TemplateTypePicker.esm.js +42 -39
  91. package/dist/components/TemplateTypePicker/TemplateTypePicker.esm.js.map +1 -1
  92. package/dist/components/fields/EntityNamePicker/EntityNamePicker.esm.js +2 -2
  93. package/dist/components/fields/EntityNamePicker/EntityNamePicker.esm.js.map +1 -1
  94. package/dist/components/fields/EntityPicker/EntityPicker.esm.js +41 -40
  95. package/dist/components/fields/EntityPicker/EntityPicker.esm.js.map +1 -1
  96. package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js +5 -4
  97. package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js.map +1 -1
  98. package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js +45 -44
  99. package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js.map +1 -1
  100. package/dist/components/fields/MyGroupsPicker/MyGroupsPicker.esm.js +36 -35
  101. package/dist/components/fields/MyGroupsPicker/MyGroupsPicker.esm.js.map +1 -1
  102. package/dist/components/fields/OwnedEntityPicker/OwnedEntityPicker.esm.js +4 -4
  103. package/dist/components/fields/OwnedEntityPicker/OwnedEntityPicker.esm.js.map +1 -1
  104. package/dist/components/fields/OwnerPicker/OwnerPicker.esm.js +2 -2
  105. package/dist/components/fields/OwnerPicker/OwnerPicker.esm.js.map +1 -1
  106. package/dist/components/fields/RepoBranchPicker/BitbucketRepoBranchPicker.esm.js +26 -23
  107. package/dist/components/fields/RepoBranchPicker/BitbucketRepoBranchPicker.esm.js.map +1 -1
  108. package/dist/components/fields/RepoBranchPicker/DefaultRepoBranchPicker.esm.js +17 -15
  109. package/dist/components/fields/RepoBranchPicker/DefaultRepoBranchPicker.esm.js.map +1 -1
  110. package/dist/components/fields/RepoBranchPicker/GitHubRepoBranchPicker.esm.js +26 -23
  111. package/dist/components/fields/RepoBranchPicker/GitHubRepoBranchPicker.esm.js.map +1 -1
  112. package/dist/components/fields/RepoBranchPicker/RepoBranchPicker.esm.js +13 -5
  113. package/dist/components/fields/RepoBranchPicker/RepoBranchPicker.esm.js.map +1 -1
  114. package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js +62 -53
  115. package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js.map +1 -1
  116. package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js +85 -77
  117. package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js.map +1 -1
  118. package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js +28 -25
  119. package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js.map +1 -1
  120. package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js +33 -30
  121. package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js.map +1 -1
  122. package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js +37 -34
  123. package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js.map +1 -1
  124. package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js +41 -37
  125. package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js.map +1 -1
  126. package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js +98 -83
  127. package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js.map +1 -1
  128. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerHost.esm.js +22 -19
  129. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerHost.esm.js.map +1 -1
  130. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js +42 -39
  131. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js.map +1 -1
  132. package/dist/components/fields/SecretInput/SecretInput.esm.js +5 -5
  133. package/dist/components/fields/SecretInput/SecretInput.esm.js.map +1 -1
  134. package/dist/components/fields/VirtualizedListbox.esm.js +29 -26
  135. package/dist/components/fields/VirtualizedListbox.esm.js.map +1 -1
  136. package/dist/index.d.ts +17 -16
  137. package/dist/translation.esm.js +12 -10
  138. package/dist/translation.esm.js.map +1 -1
  139. package/package.json +25 -25
@@ -1,3 +1,4 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
1
2
  import Grid from '@material-ui/core/Grid';
2
3
  import Divider from '@material-ui/core/Divider';
3
4
  import IconButton from '@material-ui/core/IconButton';
@@ -6,7 +7,6 @@ import { makeStyles } from '@material-ui/core/styles';
6
7
  import CloseIcon from '@material-ui/icons/Close';
7
8
  import RefreshIcon from '@material-ui/icons/Refresh';
8
9
  import SaveIcon from '@material-ui/icons/Save';
9
- import React from 'react';
10
10
  import { useDirectoryEditor } from './DirectoryEditorContext.esm.js';
11
11
  import { FileBrowser } from '../../../components/FileBrowser/FileBrowser.esm.js';
12
12
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
@@ -47,50 +47,58 @@ function TemplateEditorBrowser(props) {
47
47
  if (!directoryEditor) {
48
48
  return null;
49
49
  }
50
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Grid, { className: classes.grid, container: true, spacing: 0, alignItems: "center" }, /* @__PURE__ */ React.createElement(
51
- Tooltip,
52
- {
53
- title: t("templateEditorPage.templateEditorBrowser.saveIconTooltip")
54
- },
55
- /* @__PURE__ */ React.createElement(
56
- IconButton,
57
- {
58
- size: "small",
59
- disabled: directoryEditor.files.every((file) => !file.dirty),
60
- onClick: () => directoryEditor.save()
61
- },
62
- /* @__PURE__ */ React.createElement(SaveIcon, null)
63
- )
64
- ), /* @__PURE__ */ React.createElement(
65
- Tooltip,
66
- {
67
- title: t(
68
- "templateEditorPage.templateEditorBrowser.reloadIconTooltip"
50
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
51
+ /* @__PURE__ */ jsxs(Grid, { className: classes.grid, container: true, spacing: 0, alignItems: "center", children: [
52
+ /* @__PURE__ */ jsx(
53
+ Tooltip,
54
+ {
55
+ title: t("templateEditorPage.templateEditorBrowser.saveIconTooltip"),
56
+ children: /* @__PURE__ */ jsx(
57
+ IconButton,
58
+ {
59
+ size: "small",
60
+ disabled: directoryEditor.files.every((file) => !file.dirty),
61
+ onClick: () => directoryEditor.save(),
62
+ children: /* @__PURE__ */ jsx(SaveIcon, {})
63
+ }
64
+ )
65
+ }
66
+ ),
67
+ /* @__PURE__ */ jsx(
68
+ Tooltip,
69
+ {
70
+ title: t(
71
+ "templateEditorPage.templateEditorBrowser.reloadIconTooltip"
72
+ ),
73
+ children: /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: () => directoryEditor.reload(), children: /* @__PURE__ */ jsx(RefreshIcon, {}) })
74
+ }
75
+ ),
76
+ /* @__PURE__ */ jsx(
77
+ Tooltip,
78
+ {
79
+ title: t("templateEditorPage.templateEditorBrowser.closeIconTooltip"),
80
+ children: /* @__PURE__ */ jsx(
81
+ IconButton,
82
+ {
83
+ size: "small",
84
+ className: classes.closeButton,
85
+ onClick: handleClose,
86
+ children: /* @__PURE__ */ jsx(CloseIcon, {})
87
+ }
88
+ )
89
+ }
69
90
  )
70
- },
71
- /* @__PURE__ */ React.createElement(IconButton, { size: "small", onClick: () => directoryEditor.reload() }, /* @__PURE__ */ React.createElement(RefreshIcon, null))
72
- ), /* @__PURE__ */ React.createElement(
73
- Tooltip,
74
- {
75
- title: t("templateEditorPage.templateEditorBrowser.closeIconTooltip")
76
- },
77
- /* @__PURE__ */ React.createElement(
78
- IconButton,
91
+ ] }),
92
+ /* @__PURE__ */ jsx(Divider, {}),
93
+ /* @__PURE__ */ jsx(
94
+ FileBrowser,
79
95
  {
80
- size: "small",
81
- className: classes.closeButton,
82
- onClick: handleClose
83
- },
84
- /* @__PURE__ */ React.createElement(CloseIcon, null)
96
+ selected: directoryEditor.selectedFile?.path ?? "",
97
+ onSelect: directoryEditor.setSelectedFile,
98
+ filePaths: directoryEditor.files.map((file) => file.path) ?? []
99
+ }
85
100
  )
86
- )), /* @__PURE__ */ React.createElement(Divider, null), /* @__PURE__ */ React.createElement(
87
- FileBrowser,
88
- {
89
- selected: directoryEditor.selectedFile?.path ?? "",
90
- onSelect: directoryEditor.setSelectedFile,
91
- filePaths: directoryEditor.files.map((file) => file.path) ?? []
92
- }
93
- ));
101
+ ] });
94
102
  }
95
103
 
96
104
  export { TemplateEditorBrowser };
@@ -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 React from 'react';\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,8 +1,9 @@
1
+ import { jsx } from 'react/jsx-runtime';
1
2
  import { useApiHolder } from '@backstage/core-plugin-api';
2
3
  import { makeStyles } from '@material-ui/core/styles';
3
4
  import Paper from '@material-ui/core/Paper';
4
5
  import Typography from '@material-ui/core/Typography';
5
- import React, { useState, useMemo, Component } from 'react';
6
+ import { useState, useMemo, Component } from 'react';
6
7
  import useDebounce from 'react-use/esm/useDebounce';
7
8
  import yaml from 'yaml';
8
9
  import { useTranslationRef } from '@backstage/frontend-plugin-api';
@@ -105,7 +106,7 @@ function TemplateEditorForm(props) {
105
106
  250,
106
107
  [contentIsSpec, content, apiHolder]
107
108
  );
108
- return /* @__PURE__ */ React.createElement("div", { className: classes.containerWrapper }, steps ? /* @__PURE__ */ React.createElement(Paper, { variant: "outlined" }, /* @__PURE__ */ React.createElement(ErrorBoundary, { invalidator: steps, setErrorText }, /* @__PURE__ */ React.createElement(
109
+ return /* @__PURE__ */ jsx("div", { className: classes.containerWrapper, children: steps ? /* @__PURE__ */ jsx(Paper, { variant: "outlined", children: /* @__PURE__ */ jsx(ErrorBoundary, { invalidator: steps, setErrorText, children: /* @__PURE__ */ jsx(
109
110
  Stepper,
110
111
  {
111
112
  manifest: { steps, title: "Template Editor" },
@@ -117,7 +118,7 @@ function TemplateEditorForm(props) {
117
118
  layouts,
118
119
  formProps: props.formProps
119
120
  }
120
- ))) : /* @__PURE__ */ React.createElement(Typography, { variant: "body1", color: "textSecondary" }, t("templateEditorForm.stepper.emptyText")));
121
+ ) }) }) : /* @__PURE__ */ jsx(Typography, { variant: "body1", color: "textSecondary", children: t("templateEditorForm.stepper.emptyText") }) });
121
122
  }
122
123
  function TemplateEditorFormDirectoryEditorDryRun(props) {
123
124
  const { setErrorText, fieldExtensions = [], layouts } = props;
@@ -144,7 +145,7 @@ function TemplateEditorFormDirectoryEditorDryRun(props) {
144
145
  if (!directoryEditor) {
145
146
  return null;
146
147
  }
147
- return /* @__PURE__ */ React.createElement(
148
+ return /* @__PURE__ */ jsx(
148
149
  TemplateEditorForm,
149
150
  {
150
151
  onDryRun: handleDryRun,
@@ -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 React, { 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,4 +1,4 @@
1
- import React from 'react';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import Card from '@material-ui/core/Card';
3
3
  import CardActionArea from '@material-ui/core/CardActionArea';
4
4
  import CardContent from '@material-ui/core/CardContent';
@@ -65,82 +65,99 @@ function ActionCard(props) {
65
65
  const { t } = useTranslationRef(scaffolderTranslationRef);
66
66
  const classes = useStyles();
67
67
  const { Icon, title, description, action } = props;
68
- return /* @__PURE__ */ React.createElement(Card, { className: classes.card }, !supportsLoad && /* @__PURE__ */ React.createElement(
69
- Tooltip,
70
- {
71
- placement: "top",
72
- title: t(
73
- "templateEditorPage.templateEditorIntro.loadLocal.unsupportedTooltip"
74
- )
75
- },
76
- /* @__PURE__ */ React.createElement(InfoOutlinedIcon, null)
77
- ), /* @__PURE__ */ React.createElement(CardActionArea, { onClick: action }, /* @__PURE__ */ React.createElement(CardMedia, null, /* @__PURE__ */ React.createElement(
78
- Icon,
79
- {
80
- className: classes.icon,
81
- color: supportsLoad ? void 0 : "disabled"
82
- }
83
- )), /* @__PURE__ */ React.createElement(CardContent, { className: classes.cardContent }, /* @__PURE__ */ React.createElement(
84
- Typography,
85
- {
86
- gutterBottom: true,
87
- variant: "h5",
88
- component: "h2",
89
- color: supportsLoad ? void 0 : "textSecondary"
90
- },
91
- title
92
- ), /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary", component: "p" }, description))));
68
+ return /* @__PURE__ */ jsxs(Card, { className: classes.card, children: [
69
+ !supportsLoad && /* @__PURE__ */ jsx(
70
+ Tooltip,
71
+ {
72
+ placement: "top",
73
+ title: t(
74
+ "templateEditorPage.templateEditorIntro.loadLocal.unsupportedTooltip"
75
+ ),
76
+ children: /* @__PURE__ */ jsx(InfoOutlinedIcon, {})
77
+ }
78
+ ),
79
+ /* @__PURE__ */ jsxs(CardActionArea, { onClick: action, children: [
80
+ /* @__PURE__ */ jsx(CardMedia, { children: /* @__PURE__ */ jsx(
81
+ Icon,
82
+ {
83
+ className: classes.icon,
84
+ color: supportsLoad ? void 0 : "disabled"
85
+ }
86
+ ) }),
87
+ /* @__PURE__ */ jsxs(CardContent, { className: classes.cardContent, children: [
88
+ /* @__PURE__ */ jsx(
89
+ Typography,
90
+ {
91
+ gutterBottom: true,
92
+ variant: "h5",
93
+ component: "h2",
94
+ color: supportsLoad ? void 0 : "textSecondary",
95
+ children: title
96
+ }
97
+ ),
98
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", component: "p", children: description })
99
+ ] })
100
+ ] })
101
+ ] });
93
102
  }
94
103
  function TemplateEditorIntro(props) {
95
104
  const classes = useStyles();
96
105
  const { t } = useTranslationRef(scaffolderTranslationRef);
97
- return /* @__PURE__ */ React.createElement("div", { style: props.style }, /* @__PURE__ */ React.createElement(Typography, { variant: "h4", component: "h2", className: classes.introText }, t("templateEditorPage.templateEditorIntro.title")), /* @__PURE__ */ React.createElement("div", { className: classes.gridRoot }, /* @__PURE__ */ React.createElement("div", { className: classes.cardGrid }, /* @__PURE__ */ React.createElement(
98
- ActionCard,
99
- {
100
- title: t("templateEditorPage.templateEditorIntro.loadLocal.title"),
101
- description: t(
102
- "templateEditorPage.templateEditorIntro.loadLocal.description"
103
- ),
104
- requireLoad: true,
105
- Icon: PublishIcon,
106
- action: () => props.onSelect?.("local")
107
- }
108
- ), /* @__PURE__ */ React.createElement(
109
- ActionCard,
110
- {
111
- title: t(
112
- "templateEditorPage.templateEditorIntro.createLocal.title"
113
- ),
114
- description: t(
115
- "templateEditorPage.templateEditorIntro.createLocal.description"
106
+ return /* @__PURE__ */ jsxs("div", { style: props.style, children: [
107
+ /* @__PURE__ */ jsx(Typography, { variant: "h4", component: "h2", className: classes.introText, children: t("templateEditorPage.templateEditorIntro.title") }),
108
+ /* @__PURE__ */ jsx("div", { className: classes.gridRoot, children: /* @__PURE__ */ jsxs("div", { className: classes.cardGrid, children: [
109
+ /* @__PURE__ */ jsx(
110
+ ActionCard,
111
+ {
112
+ title: t("templateEditorPage.templateEditorIntro.loadLocal.title"),
113
+ description: t(
114
+ "templateEditorPage.templateEditorIntro.loadLocal.description"
115
+ ),
116
+ requireLoad: true,
117
+ Icon: PublishIcon,
118
+ action: () => props.onSelect?.("local")
119
+ }
116
120
  ),
117
- requireLoad: true,
118
- action: () => props.onSelect?.("create-template"),
119
- Icon: CreateNewFolderIcon
120
- }
121
- ), /* @__PURE__ */ React.createElement(
122
- ActionCard,
123
- {
124
- title: t("templateEditorPage.templateEditorIntro.formEditor.title"),
125
- description: t(
126
- "templateEditorPage.templateEditorIntro.formEditor.description"
127
- ),
128
- Icon: ListAltIcon,
129
- action: () => props.onSelect?.("form")
130
- }
131
- ), /* @__PURE__ */ React.createElement(
132
- ActionCard,
133
- {
134
- title: t(
135
- "templateEditorPage.templateEditorIntro.fieldExplorer.title"
121
+ /* @__PURE__ */ jsx(
122
+ ActionCard,
123
+ {
124
+ title: t(
125
+ "templateEditorPage.templateEditorIntro.createLocal.title"
126
+ ),
127
+ description: t(
128
+ "templateEditorPage.templateEditorIntro.createLocal.description"
129
+ ),
130
+ requireLoad: true,
131
+ action: () => props.onSelect?.("create-template"),
132
+ Icon: CreateNewFolderIcon
133
+ }
136
134
  ),
137
- description: t(
138
- "templateEditorPage.templateEditorIntro.fieldExplorer.description"
135
+ /* @__PURE__ */ jsx(
136
+ ActionCard,
137
+ {
138
+ title: t("templateEditorPage.templateEditorIntro.formEditor.title"),
139
+ description: t(
140
+ "templateEditorPage.templateEditorIntro.formEditor.description"
141
+ ),
142
+ Icon: ListAltIcon,
143
+ action: () => props.onSelect?.("form")
144
+ }
139
145
  ),
140
- Icon: FormatListBulletedIcon,
141
- action: () => props.onSelect?.("field-explorer")
142
- }
143
- ))));
146
+ /* @__PURE__ */ jsx(
147
+ ActionCard,
148
+ {
149
+ title: t(
150
+ "templateEditorPage.templateEditorIntro.fieldExplorer.title"
151
+ ),
152
+ description: t(
153
+ "templateEditorPage.templateEditorIntro.fieldExplorer.description"
154
+ ),
155
+ Icon: FormatListBulletedIcon,
156
+ action: () => props.onSelect?.("field-explorer")
157
+ }
158
+ )
159
+ ] }) })
160
+ ] });
144
161
  }
145
162
 
146
163
  export { TemplateEditorIntro };
@@ -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 React 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?: React.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,4 +1,4 @@
1
- import React from 'react';
1
+ import { jsx } from 'react/jsx-runtime';
2
2
  import { withStyles } from '@material-ui/core/styles';
3
3
 
4
4
  const TemplateEditorLayout = withStyles(
@@ -26,7 +26,7 @@ const TemplateEditorLayout = withStyles(
26
26
  }
27
27
  }),
28
28
  { name: "ScaffolderTemplateEditorLayout" }
29
- )(({ children, classes }) => /* @__PURE__ */ React.createElement("main", { className: classes.root }, children));
29
+ )(({ children, classes }) => /* @__PURE__ */ jsx("main", { className: classes.root, children }));
30
30
  const TemplateEditorLayoutToolbar = withStyles(
31
31
  {
32
32
  root: {
@@ -34,7 +34,7 @@ const TemplateEditorLayoutToolbar = withStyles(
34
34
  }
35
35
  },
36
36
  { name: "ScaffolderTemplateEditorLayoutToolbar" }
37
- )(({ children, classes }) => /* @__PURE__ */ React.createElement("section", { className: classes.root }, children));
37
+ )(({ children, classes }) => /* @__PURE__ */ jsx("section", { className: classes.root, children }));
38
38
  const TemplateEditorLayoutBrowser = withStyles(
39
39
  (theme) => ({
40
40
  root: {
@@ -46,7 +46,7 @@ const TemplateEditorLayoutBrowser = withStyles(
46
46
  }
47
47
  }),
48
48
  { name: "ScaffolderTemplateEditorLayoutBrowser" }
49
- )(({ children, classes }) => /* @__PURE__ */ React.createElement("section", { className: classes.root }, children));
49
+ )(({ children, classes }) => /* @__PURE__ */ jsx("section", { className: classes.root, children }));
50
50
  const TemplateEditorLayoutFiles = withStyles(
51
51
  {
52
52
  root: {
@@ -55,7 +55,7 @@ const TemplateEditorLayoutFiles = withStyles(
55
55
  }
56
56
  },
57
57
  { name: "ScaffolderTemplateEditorLayoutFiles" }
58
- )(({ children, classes }) => /* @__PURE__ */ React.createElement("section", { className: classes.root }, children));
58
+ )(({ children, classes }) => /* @__PURE__ */ jsx("section", { className: classes.root, children }));
59
59
  const TemplateEditorLayoutPreview = withStyles(
60
60
  (theme) => ({
61
61
  root: {
@@ -80,7 +80,7 @@ const TemplateEditorLayoutPreview = withStyles(
80
80
  }
81
81
  }),
82
82
  { name: "ScaffolderTemplateEditorLayoutPreview" }
83
- )(({ children, classes }) => /* @__PURE__ */ React.createElement("section", { className: classes.root }, /* @__PURE__ */ React.createElement("div", { className: classes.scroll }, children)));
83
+ )(({ children, classes }) => /* @__PURE__ */ jsx("section", { className: classes.root, children: /* @__PURE__ */ jsx("div", { className: classes.scroll, children }) }));
84
84
  const TemplateEditorLayoutConsole = withStyles(
85
85
  {
86
86
  root: {
@@ -88,7 +88,7 @@ const TemplateEditorLayoutConsole = withStyles(
88
88
  }
89
89
  },
90
90
  { name: "ScaffolderTemplateEditorLayoutConsole" }
91
- )(({ children, classes }) => /* @__PURE__ */ React.createElement("section", { className: classes.root }, children));
91
+ )(({ children, classes }) => /* @__PURE__ */ jsx("section", { className: classes.root, children }));
92
92
 
93
93
  export { TemplateEditorLayout, TemplateEditorLayoutBrowser, TemplateEditorLayoutConsole, TemplateEditorLayoutFiles, TemplateEditorLayoutPreview, TemplateEditorLayoutToolbar };
94
94
  //# sourceMappingURL=TemplateEditorLayout.esm.js.map
@@ -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 React, { PropsWithChildren } from 'react';\nimport { WithStyles, withStyles } from '@material-ui/core/styles';\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 3fr 2fr',\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 {\n root: {\n gridArea: 'editor',\n overflow: 'auto',\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 borderLeft: `1px solid ${theme.palette.divider}`,\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"],"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 } from 'react';\nimport { WithStyles, withStyles } from '@material-ui/core/styles';\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 3fr 2fr',\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 {\n root: {\n gridArea: 'editor',\n overflow: 'auto',\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 borderLeft: `1px solid ${theme.palette.divider}`,\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"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { makeStyles } from '@material-ui/core/styles';
3
3
  import { Page, Header, Content } from '@backstage/core-components';
4
4
  import { useRouteRef } from '@backstage/core-plugin-api';
@@ -19,22 +19,25 @@ function TemplateEditorPage(props) {
19
19
  const classes = useStyles();
20
20
  const editLink = useRouteRef(editRouteRef);
21
21
  const { t } = useTranslationRef(scaffolderTranslationRef);
22
- return /* @__PURE__ */ React.createElement(Page, { themeId: "home" }, /* @__PURE__ */ React.createElement(
23
- Header,
24
- {
25
- title: t("templateEditorPage.title"),
26
- subtitle: t("templateEditorPage.subtitle"),
27
- type: t("templateIntroPage.title"),
28
- typeLink: editLink()
29
- }
30
- ), /* @__PURE__ */ React.createElement(Content, { className: classes.content }, /* @__PURE__ */ React.createElement(
31
- TemplateEditor,
32
- {
33
- layouts: props.layouts,
34
- formProps: props.formProps,
35
- fieldExtensions: props.fieldExtensions
36
- }
37
- )));
22
+ return /* @__PURE__ */ jsxs(Page, { themeId: "home", children: [
23
+ /* @__PURE__ */ jsx(
24
+ Header,
25
+ {
26
+ title: t("templateEditorPage.title"),
27
+ subtitle: t("templateEditorPage.subtitle"),
28
+ type: t("templateIntroPage.title"),
29
+ typeLink: editLink()
30
+ }
31
+ ),
32
+ /* @__PURE__ */ jsx(Content, { className: classes.content, children: /* @__PURE__ */ jsx(
33
+ TemplateEditor,
34
+ {
35
+ layouts: props.layouts,
36
+ formProps: props.formProps,
37
+ fieldExtensions: props.fieldExtensions
38
+ }
39
+ ) })
40
+ ] });
38
41
  }
39
42
 
40
43
  export { TemplateEditorPage };