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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/dist/alpha/api/FormDecoratorsApi.esm.js.map +1 -1
  3. package/dist/alpha/api/ref.esm.js.map +1 -1
  4. package/dist/alpha/components/EditorSubPage.esm.js.map +1 -1
  5. package/dist/alpha/components/TasksSubPage.esm.js.map +1 -1
  6. package/dist/alpha/components/TemplateEditorPage/CustomFieldExplorer.esm.js.map +1 -1
  7. package/dist/alpha/components/TemplateEditorPage/CustomFieldPlayground.esm.js.map +1 -1
  8. package/dist/alpha/components/TemplateEditorPage/CustomFieldsPage.esm.js.map +1 -1
  9. package/dist/alpha/components/TemplateEditorPage/DirectoryEditorContext.esm.js.map +1 -1
  10. package/dist/alpha/components/TemplateEditorPage/DryRunContext.esm.js.map +1 -1
  11. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResults.esm.js.map +1 -1
  12. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsList.esm.js.map +1 -1
  13. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsSplitView.esm.js.map +1 -1
  14. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsView.esm.js.map +1 -1
  15. package/dist/alpha/components/TemplateEditorPage/DryRunResults/IconLink.esm.js.map +1 -1
  16. package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskPageLinks.esm.js.map +1 -1
  17. package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskStatusStepper.esm.js.map +1 -1
  18. package/dist/alpha/components/TemplateEditorPage/TemplateEditor.esm.js.map +1 -1
  19. package/dist/alpha/components/TemplateEditorPage/TemplateEditorBrowser.esm.js.map +1 -1
  20. package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js +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.map +1 -1
  24. package/dist/alpha/components/TemplateEditorPage/TemplateEditorPage.esm.js.map +1 -1
  25. package/dist/alpha/components/TemplateEditorPage/TemplateEditorTextArea.esm.js.map +1 -1
  26. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js.map +1 -1
  27. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarFileMenu.esm.js.map +1 -1
  28. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarTemplatesMenu.esm.js.map +1 -1
  29. package/dist/alpha/components/TemplateEditorPage/TemplateFormPage.esm.js.map +1 -1
  30. package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js.map +1 -1
  31. package/dist/alpha/components/TemplateEditorPage/TemplateIntroPage.esm.js.map +1 -1
  32. package/dist/alpha/components/TemplateEditorPage/useTemplateDirectory.esm.js.map +1 -1
  33. package/dist/alpha/components/TemplateListPage/RegisterExistingButton.esm.js.map +1 -1
  34. package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js.map +1 -1
  35. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPage.esm.js +2 -2
  36. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPage.esm.js.map +1 -1
  37. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js.map +1 -1
  38. package/dist/alpha/components/TemplatesSubPage.esm.js +16 -2
  39. package/dist/alpha/components/TemplatesSubPage.esm.js.map +1 -1
  40. package/dist/alpha/extensions.esm.js +4 -1
  41. package/dist/alpha/extensions.esm.js.map +1 -1
  42. package/dist/alpha/fields/EntityNamePicker.esm.js.map +1 -1
  43. package/dist/alpha/fields/EntityPicker.esm.js.map +1 -1
  44. package/dist/alpha/fields/EntityTagsPicker.esm.js.map +1 -1
  45. package/dist/alpha/fields/MultiEntityPicker.esm.js.map +1 -1
  46. package/dist/alpha/fields/MyGroupsPicker.esm.js.map +1 -1
  47. package/dist/alpha/fields/OwnedEntityPicker.esm.js.map +1 -1
  48. package/dist/alpha/fields/OwnerPicker.esm.js.map +1 -1
  49. package/dist/alpha/fields/RepoBranchPicker.esm.js.map +1 -1
  50. package/dist/alpha/fields/RepoOwnerPicker.esm.js.map +1 -1
  51. package/dist/alpha/fields/RepoUrlPicker.esm.js.map +1 -1
  52. package/dist/alpha/formFieldsApi.esm.js.map +1 -1
  53. package/dist/alpha/hooks/useFormDecorators.esm.js.map +1 -1
  54. package/dist/alpha/hooks/useScaffolderTemplateIconLinkProps.esm.js.map +1 -1
  55. package/dist/alpha/lib/createGroupsWithOther.esm.js.map +1 -1
  56. package/dist/alpha/plugin.esm.js.map +1 -1
  57. package/dist/alpha.d.ts +2 -0
  58. package/dist/alpha.esm.js.map +1 -1
  59. package/dist/api.esm.js.map +1 -1
  60. package/dist/components/ActionsPage/ActionsPage.esm.js +3 -3
  61. package/dist/components/ActionsPage/ActionsPage.esm.js.map +1 -1
  62. package/dist/components/FileBrowser/FileBrowser.esm.js.map +1 -1
  63. package/dist/components/ListTasksPage/ListTasksPage.esm.js +4 -4
  64. package/dist/components/ListTasksPage/ListTasksPage.esm.js.map +1 -1
  65. package/dist/components/ListTasksPage/OwnerListPicker.esm.js.map +1 -1
  66. package/dist/components/ListTasksPage/columns/CreatedAtColumn.esm.js.map +1 -1
  67. package/dist/components/ListTasksPage/columns/OwnerEntityColumn.esm.js.map +1 -1
  68. package/dist/components/ListTasksPage/columns/TaskStatusColumn.esm.js.map +1 -1
  69. package/dist/components/ListTasksPage/columns/TemplateTitleColumn.esm.js.map +1 -1
  70. package/dist/components/OngoingTask/ContextMenu.esm.js.map +1 -1
  71. package/dist/components/OngoingTask/OngoingTask.esm.js +3 -3
  72. package/dist/components/OngoingTask/OngoingTask.esm.js.map +1 -1
  73. package/dist/components/OngoingTask/OngoingTaskContextMenu.esm.js.map +1 -1
  74. package/dist/components/RenderSchema/RenderSchema.esm.js.map +1 -1
  75. package/dist/components/Router/Router.esm.js.map +1 -1
  76. package/dist/components/ScaffolderUsageExamplesTable/ScaffolderUsageExamplesTable.esm.js.map +1 -1
  77. package/dist/components/TemplateTypePicker/TemplateTypePicker.esm.js.map +1 -1
  78. package/dist/components/TemplatingExtensionsPage/TemplateFilters.esm.js.map +1 -1
  79. package/dist/components/TemplatingExtensionsPage/TemplateGlobals.esm.js.map +1 -1
  80. package/dist/components/TemplatingExtensionsPage/TemplatingExtensionsPage.esm.js.map +1 -1
  81. package/dist/components/TemplatingExtensionsPage/functionArgs.esm.js.map +1 -1
  82. package/dist/components/TemplatingExtensionsPage/navigation.esm.js.map +1 -1
  83. package/dist/components/fields/Autocomplete/Autocomplete.esm.js.map +1 -1
  84. package/dist/components/fields/EntityNamePicker/EntityNamePicker.esm.js.map +1 -1
  85. package/dist/components/fields/EntityNamePicker/schema.esm.js.map +1 -1
  86. package/dist/components/fields/EntityNamePicker/validation.esm.js.map +1 -1
  87. package/dist/components/fields/EntityPicker/EntityPicker.esm.js.map +1 -1
  88. package/dist/components/fields/EntityPicker/schema.esm.js.map +1 -1
  89. package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js +2 -2
  90. package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js.map +1 -1
  91. package/dist/components/fields/EntityTagsPicker/schema.esm.js.map +1 -1
  92. package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js.map +1 -1
  93. package/dist/components/fields/MultiEntityPicker/schema.esm.js.map +1 -1
  94. package/dist/components/fields/MyGroupsPicker/MyGroupsPicker.esm.js.map +1 -1
  95. package/dist/components/fields/MyGroupsPicker/schema.esm.js.map +1 -1
  96. package/dist/components/fields/OwnedEntityPicker/OwnedEntityPicker.esm.js.map +1 -1
  97. package/dist/components/fields/OwnedEntityPicker/schema.esm.js.map +1 -1
  98. package/dist/components/fields/OwnerPicker/OwnerPicker.esm.js.map +1 -1
  99. package/dist/components/fields/OwnerPicker/schema.esm.js.map +1 -1
  100. package/dist/components/fields/RepoBranchPicker/BitbucketRepoBranchPicker.esm.js.map +1 -1
  101. package/dist/components/fields/RepoBranchPicker/DefaultRepoBranchPicker.esm.js.map +1 -1
  102. package/dist/components/fields/RepoBranchPicker/GitHubRepoBranchPicker.esm.js.map +1 -1
  103. package/dist/components/fields/RepoBranchPicker/RepoBranchPicker.esm.js.map +1 -1
  104. package/dist/components/fields/RepoBranchPicker/schema.esm.js.map +1 -1
  105. package/dist/components/fields/RepoOwnerPicker/DefaultRepoOwnerPicker.esm.js.map +1 -1
  106. package/dist/components/fields/RepoOwnerPicker/GitHubRepoOwnerPicker.esm.js.map +1 -1
  107. package/dist/components/fields/RepoOwnerPicker/GitLabRepoOwnerPicker.esm.js.map +1 -1
  108. package/dist/components/fields/RepoOwnerPicker/RepoOwnerPicker.esm.js.map +1 -1
  109. package/dist/components/fields/RepoOwnerPicker/schema.esm.js.map +1 -1
  110. package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js +11 -9
  111. package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js.map +1 -1
  112. package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js +10 -8
  113. package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js.map +1 -1
  114. package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js +12 -5
  115. package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js.map +1 -1
  116. package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js +17 -9
  117. package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js.map +1 -1
  118. package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js +21 -9
  119. package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js.map +1 -1
  120. package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js +21 -10
  121. package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js.map +1 -1
  122. package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js +29 -7
  123. package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js.map +1 -1
  124. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerHost.esm.js.map +1 -1
  125. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js +83 -46
  126. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js.map +1 -1
  127. package/dist/components/fields/RepoUrlPicker/schema.esm.js +7 -0
  128. package/dist/components/fields/RepoUrlPicker/schema.esm.js.map +1 -1
  129. package/dist/components/fields/RepoUrlPicker/utils.esm.js.map +1 -1
  130. package/dist/components/fields/RepoUrlPicker/validation.esm.js.map +1 -1
  131. package/dist/components/fields/SecretInput/SecretInput.esm.js.map +1 -1
  132. package/dist/components/fields/VirtualizedListbox.esm.js +1 -1
  133. package/dist/components/fields/VirtualizedListbox.esm.js.map +1 -1
  134. package/dist/components/fields/buiChipStyles.esm.js.map +1 -1
  135. package/dist/components/fields/scaffolderFieldOverrides.module.css.esm.js.map +1 -1
  136. package/dist/components/fields/utils.esm.js.map +1 -1
  137. package/dist/deprecated.esm.js.map +1 -1
  138. package/dist/extensions/default.esm.js.map +1 -1
  139. package/dist/index.d.ts +10 -0
  140. package/dist/lib/download/helpers.esm.js.map +1 -1
  141. package/dist/lib/filesystem/WebFileSystemAccess.esm.js.map +1 -1
  142. package/dist/lib/filesystem/WebFileSystemStore.esm.js.map +1 -1
  143. package/dist/lib/filesystem/createExampleTemplate.esm.js.map +1 -1
  144. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -1
  145. package/dist/packages/opaque-internal/src/OpaqueType.esm.js.map +1 -1
  146. package/dist/packages/scaffolder-internal/src/wiring/InternalFormDecorator.esm.js.map +1 -1
  147. package/dist/packages/scaffolder-internal/src/wiring/InternalFormField.esm.js.map +1 -1
  148. package/dist/plugin.esm.js.map +1 -1
  149. package/dist/plugins/scaffolder/package.json.esm.js +1 -1
  150. package/dist/plugins/scaffolder/package.json.esm.js.map +1 -1
  151. package/dist/routes.esm.js.map +1 -1
  152. package/dist/translation.esm.js.map +1 -1
  153. package/package.json +25 -25
@@ -23,7 +23,10 @@ const GitlabRepoPicker = (props) => {
23
23
  onChange,
24
24
  rawErrors,
25
25
  accessToken,
26
- isDisabled
26
+ isDisabled,
27
+ ownerLabel,
28
+ ownerDescription,
29
+ disableRepoAutocomplete
27
30
  } = props;
28
31
  const [availableGroups, setAvailableGroups] = useState([]);
29
32
  const { t } = useTranslationRef(scaffolderTranslationRef);
@@ -52,7 +55,7 @@ const GitlabRepoPicker = (props) => {
52
55
  }, [scaffolderApi, accessToken, host]);
53
56
  useDebounce(updateAvailableGroups, 500, [updateAvailableGroups]);
54
57
  const updateAvailableRepositories = useCallback(() => {
55
- if (!scaffolderApi.autocomplete || !accessToken || !host || !owner) {
58
+ if (disableRepoAutocomplete || !scaffolderApi.autocomplete || !accessToken || !host || !owner) {
56
59
  onChange({ availableRepos: [] });
57
60
  return;
58
61
  }
@@ -72,7 +75,15 @@ const GitlabRepoPicker = (props) => {
72
75
  }).catch(() => {
73
76
  onChange({ availableRepos: [] });
74
77
  });
75
- }, [scaffolderApi, accessToken, host, owner, onChange, availableGroups]);
78
+ }, [
79
+ disableRepoAutocomplete,
80
+ scaffolderApi,
81
+ accessToken,
82
+ host,
83
+ owner,
84
+ onChange,
85
+ availableGroups
86
+ ]);
76
87
  useDebounce(updateAvailableRepositories, 500, [updateAvailableRepositories]);
77
88
  if (theme === "bui") {
78
89
  if (allowedOwners?.length) {
@@ -81,8 +92,8 @@ const GitlabRepoPicker = (props) => {
81
92
  Select,
82
93
  {
83
94
  className: overrides.select,
84
- label: t("fields.gitlabRepoPicker.owner.title"),
85
- description: t("fields.gitlabRepoPicker.owner.description"),
95
+ label: ownerLabel ?? t("fields.gitlabRepoPicker.owner.title"),
96
+ description: ownerDescription ?? t("fields.gitlabRepoPicker.owner.description"),
86
97
  isDisabled: isDisabled || allowedOwners.length === 1,
87
98
  isInvalid: rawErrors?.length > 0 && !owner,
88
99
  selectedKey: owner ?? null,
@@ -101,8 +112,8 @@ const GitlabRepoPicker = (props) => {
101
112
  return /* @__PURE__ */ jsx(
102
113
  Autocomplete,
103
114
  {
104
- label: t("fields.gitlabRepoPicker.owner.inputTitle"),
105
- description: t("fields.gitlabRepoPicker.owner.description"),
115
+ label: ownerLabel ?? t("fields.gitlabRepoPicker.owner.inputTitle"),
116
+ description: ownerDescription ?? t("fields.gitlabRepoPicker.owner.description"),
106
117
  inputValue: owner ?? "",
107
118
  onInputChange: (value) => onChange({ owner: value }),
108
119
  onSelectionChange: (key) => {
@@ -129,7 +140,7 @@ const GitlabRepoPicker = (props) => {
129
140
  Select$1,
130
141
  {
131
142
  native: true,
132
- label: t("fields.gitlabRepoPicker.owner.title"),
143
+ label: ownerLabel ?? t("fields.gitlabRepoPicker.owner.title"),
133
144
  onChange: (selected) => onChange({
134
145
  owner: String(
135
146
  Array.isArray(selected) ? selected[0] : selected
@@ -151,7 +162,7 @@ const GitlabRepoPicker = (props) => {
151
162
  MuiTextField,
152
163
  {
153
164
  ...params,
154
- label: t("fields.gitlabRepoPicker.owner.inputTitle"),
165
+ label: ownerLabel ?? t("fields.gitlabRepoPicker.owner.inputTitle"),
155
166
  disabled: isDisabled,
156
167
  required: true
157
168
  }
@@ -161,7 +172,7 @@ const GitlabRepoPicker = (props) => {
161
172
  autoSelect: true
162
173
  }
163
174
  ),
164
- /* @__PURE__ */ jsx(FormHelperText, { children: t("fields.gitlabRepoPicker.owner.description") })
175
+ /* @__PURE__ */ jsx(FormHelperText, { children: ownerDescription ?? t("fields.gitlabRepoPicker.owner.description") })
165
176
  ]
166
177
  }
167
178
  ) });
@@ -1 +1 @@
1
- {"version":3,"file":"GitlabRepoPicker.esm.js","sources":["../../../../src/components/fields/RepoUrlPicker/GitlabRepoPicker.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Select as MuiSelect, SelectItem } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport MuiTextField from '@material-ui/core/TextField';\nimport MuiAutocomplete from '@material-ui/lab/Autocomplete';\nimport { useCallback, useState } from 'react';\nimport useDebounce from 'react-use/esm/useDebounce';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { BaseRepoUrlPickerProps } from './types';\nimport { useScaffolderTheme } from '@backstage/plugin-scaffolder-react/alpha';\nimport { Select as BuiSelect } from '@backstage/ui';\nimport { Autocomplete as BuiAutocomplete } from '../Autocomplete';\nimport overrides from '../scaffolderFieldOverrides.module.css';\nimport type { Key } from 'react-aria-components';\n\nexport const GitlabRepoPicker = (\n props: BaseRepoUrlPickerProps<{\n allowedOwners?: string[];\n allowedRepos?: string[];\n accessToken?: string;\n }>,\n) => {\n const theme = useScaffolderTheme();\n const {\n allowedOwners = [],\n state,\n onChange,\n rawErrors,\n accessToken,\n isDisabled,\n } = props;\n const [availableGroups, setAvailableGroups] = useState<\n { title: string; id: string }[]\n >([]);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const { owner, host } = state;\n\n const scaffolderApi = useApi(scaffolderApiRef);\n\n const updateAvailableGroups = useCallback(() => {\n if (!scaffolderApi.autocomplete || !accessToken || !host) {\n setAvailableGroups([]);\n return;\n }\n\n scaffolderApi\n .autocomplete({\n token: accessToken,\n resource: 'groups',\n provider: 'gitlab',\n context: { host },\n })\n .then(({ results }) => {\n setAvailableGroups(\n results.map(r => ({\n title: r.title!,\n id: r.id,\n })),\n );\n })\n .catch(() => {\n setAvailableGroups([]);\n });\n }, [scaffolderApi, accessToken, host]);\n\n useDebounce(updateAvailableGroups, 500, [updateAvailableGroups]);\n\n // Update available repositories when client is available and group changes\n const updateAvailableRepositories = useCallback(() => {\n if (!scaffolderApi.autocomplete || !accessToken || !host || !owner) {\n onChange({ availableRepos: [] });\n return;\n }\n\n const selectedGroup = availableGroups.find(group => group.title === owner);\n\n scaffolderApi\n .autocomplete({\n token: accessToken,\n resource: 'repositories',\n context: {\n id: selectedGroup?.id ?? '',\n host,\n },\n provider: 'gitlab',\n })\n .then(({ results }) => {\n onChange({\n availableRepos: results.map(r => ({ name: r.title!, id: r.id })),\n });\n })\n .catch(() => {\n onChange({ availableRepos: [] });\n });\n }, [scaffolderApi, accessToken, host, owner, onChange, availableGroups]);\n\n useDebounce(updateAvailableRepositories, 500, [updateAvailableRepositories]);\n\n if (theme === 'bui') {\n if (allowedOwners?.length) {\n const ownerItems = allowedOwners.map(i => ({ label: i, value: i }));\n\n return (\n <BuiSelect\n className={overrides.select}\n label={t('fields.gitlabRepoPicker.owner.title')}\n description={t('fields.gitlabRepoPicker.owner.description')}\n isDisabled={isDisabled || allowedOwners.length === 1}\n isInvalid={rawErrors?.length > 0 && !owner}\n selectedKey={owner ?? null}\n onSelectionChange={(key: Key | null) => {\n if (key !== null) onChange({ owner: String(key) });\n }}\n options={ownerItems}\n isRequired\n />\n );\n }\n\n const options = availableGroups.map(group => ({\n label: group.title,\n value: group.title,\n }));\n\n return (\n <BuiAutocomplete\n label={t('fields.gitlabRepoPicker.owner.inputTitle')}\n description={t('fields.gitlabRepoPicker.owner.description')}\n inputValue={owner ?? ''}\n onInputChange={value => onChange({ owner: value })}\n onSelectionChange={(key: Key | null) => {\n if (key !== null) {\n onChange({ owner: String(key) });\n }\n }}\n options={options}\n isDisabled={isDisabled}\n isRequired\n isInvalid={rawErrors?.length > 0 && !owner}\n />\n );\n }\n\n const ownerItems: SelectItem[] = allowedOwners\n ? allowedOwners.map(i => ({ label: i, value: i }))\n : [{ label: 'Loading...', value: 'loading' }];\n\n return (\n <>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !owner}\n >\n {allowedOwners?.length ? (\n <>\n <MuiSelect\n native\n label={t('fields.gitlabRepoPicker.owner.title')}\n onChange={selected =>\n onChange({\n owner: String(\n Array.isArray(selected) ? selected[0] : selected,\n ),\n })\n }\n disabled={isDisabled || allowedOwners.length === 1}\n selected={owner}\n items={ownerItems}\n />\n </>\n ) : (\n <MuiAutocomplete\n value={owner}\n onChange={(_, newValue) => {\n onChange({ owner: newValue || '' });\n }}\n options={availableGroups.map(group => group.title)}\n renderInput={params => (\n <MuiTextField\n {...params}\n label={t('fields.gitlabRepoPicker.owner.inputTitle')}\n disabled={isDisabled}\n required\n />\n )}\n freeSolo\n disabled={isDisabled}\n autoSelect\n />\n )}\n <FormHelperText>\n {t('fields.gitlabRepoPicker.owner.description')}\n </FormHelperText>\n </FormControl>\n </>\n );\n};\n"],"names":["ownerItems","BuiSelect","BuiAutocomplete","MuiSelect"],"mappings":"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"}
1
+ {"version":3,"file":"GitlabRepoPicker.esm.js","sources":["../../../../src/components/fields/RepoUrlPicker/GitlabRepoPicker.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Select as MuiSelect, SelectItem } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport MuiTextField from '@material-ui/core/TextField';\nimport MuiAutocomplete from '@material-ui/lab/Autocomplete';\nimport { useCallback, useState } from 'react';\nimport useDebounce from 'react-use/esm/useDebounce';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { BaseRepoUrlPickerProps } from './types';\nimport { useScaffolderTheme } from '@backstage/plugin-scaffolder-react/alpha';\nimport { Select as BuiSelect } from '@backstage/ui';\nimport { Autocomplete as BuiAutocomplete } from '../Autocomplete';\nimport overrides from '../scaffolderFieldOverrides.module.css';\nimport type { Key } from 'react-aria-components';\n\nexport const GitlabRepoPicker = (\n props: BaseRepoUrlPickerProps<{\n allowedOwners?: string[];\n allowedRepos?: string[];\n accessToken?: string;\n ownerLabel?: string;\n ownerDescription?: string;\n disableRepoAutocomplete?: boolean;\n }>,\n) => {\n const theme = useScaffolderTheme();\n const {\n allowedOwners = [],\n state,\n onChange,\n rawErrors,\n accessToken,\n isDisabled,\n ownerLabel,\n ownerDescription,\n disableRepoAutocomplete,\n } = props;\n const [availableGroups, setAvailableGroups] = useState<\n { title: string; id: string }[]\n >([]);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const { owner, host } = state;\n\n const scaffolderApi = useApi(scaffolderApiRef);\n\n const updateAvailableGroups = useCallback(() => {\n if (!scaffolderApi.autocomplete || !accessToken || !host) {\n setAvailableGroups([]);\n return;\n }\n\n scaffolderApi\n .autocomplete({\n token: accessToken,\n resource: 'groups',\n provider: 'gitlab',\n context: { host },\n })\n .then(({ results }) => {\n setAvailableGroups(\n results.map(r => ({\n title: r.title!,\n id: r.id,\n })),\n );\n })\n .catch(() => {\n setAvailableGroups([]);\n });\n }, [scaffolderApi, accessToken, host]);\n\n useDebounce(updateAvailableGroups, 500, [updateAvailableGroups]);\n\n const updateAvailableRepositories = useCallback(() => {\n if (\n disableRepoAutocomplete ||\n !scaffolderApi.autocomplete ||\n !accessToken ||\n !host ||\n !owner\n ) {\n onChange({ availableRepos: [] });\n return;\n }\n\n const selectedGroup = availableGroups.find(group => group.title === owner);\n\n scaffolderApi\n .autocomplete({\n token: accessToken,\n resource: 'repositories',\n context: {\n id: selectedGroup?.id ?? '',\n host,\n },\n provider: 'gitlab',\n })\n .then(({ results }) => {\n onChange({\n availableRepos: results.map(r => ({ name: r.title!, id: r.id })),\n });\n })\n .catch(() => {\n onChange({ availableRepos: [] });\n });\n }, [\n disableRepoAutocomplete,\n scaffolderApi,\n accessToken,\n host,\n owner,\n onChange,\n availableGroups,\n ]);\n\n useDebounce(updateAvailableRepositories, 500, [updateAvailableRepositories]);\n\n if (theme === 'bui') {\n if (allowedOwners?.length) {\n const ownerItems = allowedOwners.map(i => ({ label: i, value: i }));\n\n return (\n <BuiSelect\n className={overrides.select}\n label={ownerLabel ?? t('fields.gitlabRepoPicker.owner.title')}\n description={\n ownerDescription ?? t('fields.gitlabRepoPicker.owner.description')\n }\n isDisabled={isDisabled || allowedOwners.length === 1}\n isInvalid={rawErrors?.length > 0 && !owner}\n selectedKey={owner ?? null}\n onSelectionChange={(key: Key | null) => {\n if (key !== null) onChange({ owner: String(key) });\n }}\n options={ownerItems}\n isRequired\n />\n );\n }\n\n const options = availableGroups.map(group => ({\n label: group.title,\n value: group.title,\n }));\n\n return (\n <BuiAutocomplete\n label={ownerLabel ?? t('fields.gitlabRepoPicker.owner.inputTitle')}\n description={\n ownerDescription ?? t('fields.gitlabRepoPicker.owner.description')\n }\n inputValue={owner ?? ''}\n onInputChange={value => onChange({ owner: value })}\n onSelectionChange={(key: Key | null) => {\n if (key !== null) {\n onChange({ owner: String(key) });\n }\n }}\n options={options}\n isDisabled={isDisabled}\n isRequired\n isInvalid={rawErrors?.length > 0 && !owner}\n />\n );\n }\n\n const ownerItems: SelectItem[] = allowedOwners\n ? allowedOwners.map(i => ({ label: i, value: i }))\n : [{ label: 'Loading...', value: 'loading' }];\n\n return (\n <>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !owner}\n >\n {allowedOwners?.length ? (\n <>\n <MuiSelect\n native\n label={ownerLabel ?? t('fields.gitlabRepoPicker.owner.title')}\n onChange={selected =>\n onChange({\n owner: String(\n Array.isArray(selected) ? selected[0] : selected,\n ),\n })\n }\n disabled={isDisabled || allowedOwners.length === 1}\n selected={owner}\n items={ownerItems}\n />\n </>\n ) : (\n <MuiAutocomplete\n value={owner}\n onChange={(_, newValue) => {\n onChange({ owner: newValue || '' });\n }}\n options={availableGroups.map(group => group.title)}\n renderInput={params => (\n <MuiTextField\n {...params}\n label={\n ownerLabel ?? t('fields.gitlabRepoPicker.owner.inputTitle')\n }\n disabled={isDisabled}\n required\n />\n )}\n freeSolo\n disabled={isDisabled}\n autoSelect\n />\n )}\n <FormHelperText>\n {ownerDescription ?? t('fields.gitlabRepoPicker.owner.description')}\n </FormHelperText>\n </FormControl>\n </>\n );\n};\n"],"names":["ownerItems","BuiSelect","BuiAutocomplete","MuiSelect"],"mappings":"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"}
@@ -57,6 +57,11 @@ const RepoUrlPicker = (props) => {
57
57
  () => uiSchema?.["ui:disabled"] ?? false,
58
58
  [uiSchema]
59
59
  );
60
+ const ownerLabel = uiSchema?.["ui:options"]?.ownerLabel;
61
+ const ownerDescription = uiSchema?.["ui:options"]?.ownerDescription;
62
+ const repoLabel = uiSchema?.["ui:options"]?.repoLabel;
63
+ const repoDescription = uiSchema?.["ui:options"]?.repoDescription;
64
+ const disableRepoAutocomplete = uiSchema?.["ui:options"]?.disableRepoAutocomplete ?? false;
60
65
  const { owner, organization, project, repoName } = state;
61
66
  useEffect(() => {
62
67
  onChange(serializeRepoPickerUrl(state));
@@ -140,7 +145,10 @@ const RepoUrlPicker = (props) => {
140
145
  rawErrors,
141
146
  state,
142
147
  isDisabled,
143
- accessToken
148
+ accessToken,
149
+ ownerLabel,
150
+ ownerDescription,
151
+ disableRepoAutocomplete
144
152
  }
145
153
  ),
146
154
  hostType === "gitea" && /* @__PURE__ */ jsx(
@@ -151,7 +159,9 @@ const RepoUrlPicker = (props) => {
151
159
  rawErrors,
152
160
  state,
153
161
  isDisabled,
154
- onChange: updateLocalState
162
+ onChange: updateLocalState,
163
+ ownerLabel,
164
+ ownerDescription
155
165
  }
156
166
  ),
157
167
  hostType === "gitlab" && /* @__PURE__ */ jsx(
@@ -162,7 +172,10 @@ const RepoUrlPicker = (props) => {
162
172
  state,
163
173
  onChange: updateLocalState,
164
174
  isDisabled,
165
- accessToken
175
+ accessToken,
176
+ ownerLabel,
177
+ ownerDescription,
178
+ disableRepoAutocomplete
166
179
  }
167
180
  ),
168
181
  (hostType === "bitbucket" || hostType === "bitbucketCloud" || hostType === "bitbucketServer") && /* @__PURE__ */ jsx(
@@ -174,7 +187,9 @@ const RepoUrlPicker = (props) => {
174
187
  state,
175
188
  onChange: updateLocalState,
176
189
  isDisabled,
177
- accessToken
190
+ accessToken,
191
+ ownerLabel,
192
+ ownerDescription
178
193
  }
179
194
  ),
180
195
  hostType === "azure" && /* @__PURE__ */ jsx(
@@ -185,7 +200,9 @@ const RepoUrlPicker = (props) => {
185
200
  rawErrors,
186
201
  state,
187
202
  isDisabled,
188
- onChange: updateLocalState
203
+ onChange: updateLocalState,
204
+ ownerLabel,
205
+ ownerDescription
189
206
  }
190
207
  ),
191
208
  hostType === "gerrit" && /* @__PURE__ */ jsx(
@@ -194,7 +211,9 @@ const RepoUrlPicker = (props) => {
194
211
  rawErrors,
195
212
  state,
196
213
  onChange: updateLocalState,
197
- isDisabled
214
+ isDisabled,
215
+ ownerLabel,
216
+ ownerDescription
198
217
  }
199
218
  ),
200
219
  /* @__PURE__ */ jsx(
@@ -208,7 +227,10 @@ const RepoUrlPicker = (props) => {
208
227
  })),
209
228
  isDisabled,
210
229
  rawErrors,
211
- availableRepos: state.availableRepos
230
+ availableRepos: state.availableRepos,
231
+ repoLabel,
232
+ repoDescription,
233
+ disableRepoAutocomplete
212
234
  }
213
235
  )
214
236
  ] });
@@ -1 +1 @@
1
- {"version":3,"file":"RepoUrlPicker.esm.js","sources":["../../../../src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n scmAuthApiRef,\n scmIntegrationsApiRef,\n} from '@backstage/integration-react';\nimport { useTemplateSecrets } from '@backstage/plugin-scaffolder-react';\nimport Box from '@material-ui/core/Box';\nimport Divider from '@material-ui/core/Divider';\nimport Typography from '@material-ui/core/Typography';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport useDebounce from 'react-use/esm/useDebounce';\nimport { AzureRepoPicker } from './AzureRepoPicker';\nimport { BitbucketRepoPicker } from './BitbucketRepoPicker';\nimport { GerritRepoPicker } from './GerritRepoPicker';\nimport { GiteaRepoPicker } from './GiteaRepoPicker';\nimport { GithubRepoPicker } from './GithubRepoPicker';\nimport { GitlabRepoPicker } from './GitlabRepoPicker';\nimport { RepoUrlPickerHost } from './RepoUrlPickerHost';\nimport { RepoUrlPickerRepoName } from './RepoUrlPickerRepoName';\nimport { RepoUrlPickerFieldSchema } from './schema';\nimport { RepoUrlPickerState } from './types';\nimport { parseRepoPickerUrl, serializeRepoPickerUrl } from './utils';\nimport { MarkdownContent } from '@backstage/core-components';\nimport { useScaffolderTheme } from '@backstage/plugin-scaffolder-react/alpha';\nimport { Flex, Text } from '@backstage/ui';\n\nexport { RepoUrlPickerSchema } from './schema';\n\n/**\n * The underlying component that is rendered in the form for the `RepoUrlPicker`\n * field extension.\n *\n * @public\n */\nexport const RepoUrlPicker = (\n props: typeof RepoUrlPickerFieldSchema.TProps,\n) => {\n const scaffolderTheme = useScaffolderTheme();\n const { uiSchema, onChange, rawErrors, formData, schema } = props;\n const [state, setState] = useState<RepoUrlPickerState>(\n parseRepoPickerUrl(formData),\n );\n const [credentialsHost, setCredentialsHost] = useState<string | undefined>(\n undefined,\n );\n const integrationApi = useApi(scmIntegrationsApiRef);\n const scmAuthApi = useApi(scmAuthApiRef);\n const { secrets, setSecrets } = useTemplateSecrets();\n const allowedHosts = useMemo(\n () => uiSchema?.['ui:options']?.allowedHosts ?? [],\n [uiSchema],\n );\n const allowedOrganizations = useMemo(\n () => uiSchema?.['ui:options']?.allowedOrganizations ?? [],\n [uiSchema],\n );\n const allowedOwners = useMemo(\n () => uiSchema?.['ui:options']?.allowedOwners ?? [],\n [uiSchema],\n );\n const allowedProjects = useMemo(\n () => uiSchema?.['ui:options']?.allowedProjects ?? [],\n [uiSchema],\n );\n const allowedRepos = useMemo(\n () => uiSchema?.['ui:options']?.allowedRepos ?? [],\n [uiSchema],\n );\n const isDisabled = useMemo(\n () => uiSchema?.['ui:disabled'] ?? false,\n [uiSchema],\n );\n const { owner, organization, project, repoName } = state;\n\n useEffect(() => {\n onChange(serializeRepoPickerUrl(state));\n }, [state, onChange]);\n\n /* we deal with calling the repo setting here instead of in each components for ease */\n useEffect(() => {\n if (allowedOrganizations.length > 0 && !organization) {\n setState(prevState => ({\n ...prevState,\n organization: allowedOrganizations[0],\n }));\n }\n }, [setState, allowedOrganizations, organization]);\n\n useEffect(() => {\n if (allowedOwners.length > 0 && !owner) {\n setState(prevState => ({\n ...prevState,\n owner: allowedOwners[0],\n }));\n }\n }, [setState, allowedOwners, owner]);\n\n useEffect(() => {\n if (allowedProjects.length > 0 && !project) {\n setState(prevState => ({\n ...prevState,\n project: allowedProjects[0],\n }));\n }\n }, [setState, allowedProjects, project]);\n\n useEffect(() => {\n if (allowedRepos.length > 0 && !repoName) {\n setState(prevState => ({ ...prevState, repoName: allowedRepos[0] }));\n }\n }, [setState, allowedRepos, repoName]);\n\n const updateLocalState = useCallback(\n (newState: RepoUrlPickerState) => {\n setState(prevState => ({ ...prevState, ...newState }));\n },\n [setState],\n );\n\n useDebounce(\n async () => {\n const { requestUserCredentials } = uiSchema?.['ui:options'] ?? {};\n\n if (!requestUserCredentials || !state.host) {\n return;\n }\n\n // don't show login prompt if secret value is already in state for selected host\n if (\n secrets[requestUserCredentials.secretsKey] &&\n credentialsHost === state.host\n ) {\n return;\n }\n\n // user has requested that we use the users credentials\n // so lets grab them using the scmAuthApi and pass through\n // any additional scopes from the ui:options\n const { token } = await scmAuthApi.getCredentials({\n url: `https://${state.host}`,\n additionalScope: {\n repoWrite: true,\n customScopes: requestUserCredentials.additionalScopes,\n },\n });\n\n // set the secret using the key provided in the ui:options for use\n // in the templating the manifest with ${{ secrets[secretsKey] }}\n setSecrets({ [requestUserCredentials.secretsKey]: token });\n setCredentialsHost(state.host);\n },\n 500,\n [state, uiSchema],\n );\n\n const hostType =\n (state.host && integrationApi.byHost(state.host)?.type) ?? null;\n\n const description = uiSchema['ui:description'] ?? schema.description;\n\n const accessToken =\n uiSchema?.['ui:options']?.requestUserCredentials?.secretsKey &&\n secrets[uiSchema['ui:options'].requestUserCredentials.secretsKey];\n\n const subComponents = (\n <>\n <RepoUrlPickerHost\n host={state.host}\n hosts={allowedHosts}\n onChange={host => setState(prevState => ({ ...prevState, host }))}\n rawErrors={rawErrors}\n isDisabled={isDisabled}\n />\n {hostType === 'github' && (\n <GithubRepoPicker\n allowedOwners={allowedOwners}\n onChange={updateLocalState}\n rawErrors={rawErrors}\n state={state}\n isDisabled={isDisabled}\n accessToken={accessToken}\n />\n )}\n {hostType === 'gitea' && (\n <GiteaRepoPicker\n allowedOwners={allowedOwners}\n allowedRepos={allowedRepos}\n rawErrors={rawErrors}\n state={state}\n isDisabled={isDisabled}\n onChange={updateLocalState}\n />\n )}\n {hostType === 'gitlab' && (\n <GitlabRepoPicker\n allowedOwners={allowedOwners}\n rawErrors={rawErrors}\n state={state}\n onChange={updateLocalState}\n isDisabled={isDisabled}\n accessToken={accessToken}\n />\n )}\n {(hostType === 'bitbucket' ||\n hostType === 'bitbucketCloud' ||\n hostType === 'bitbucketServer') && (\n <BitbucketRepoPicker\n allowedOwners={allowedOwners}\n allowedProjects={allowedProjects}\n rawErrors={rawErrors}\n state={state}\n onChange={updateLocalState}\n isDisabled={isDisabled}\n accessToken={accessToken}\n />\n )}\n {hostType === 'azure' && (\n <AzureRepoPicker\n allowedOrganizations={allowedOrganizations}\n allowedProject={allowedProjects}\n rawErrors={rawErrors}\n state={state}\n isDisabled={isDisabled}\n onChange={updateLocalState}\n />\n )}\n {hostType === 'gerrit' && (\n <GerritRepoPicker\n rawErrors={rawErrors}\n state={state}\n onChange={updateLocalState}\n isDisabled={isDisabled}\n />\n )}\n <RepoUrlPickerRepoName\n repoName={state.repoName}\n allowedRepos={allowedRepos}\n onChange={repo =>\n setState(prevState => ({\n ...prevState,\n repoName: repo.id || repo.name,\n }))\n }\n isDisabled={isDisabled}\n rawErrors={rawErrors}\n availableRepos={state.availableRepos}\n />\n </>\n );\n\n if (scaffolderTheme === 'bui') {\n return (\n <Flex direction=\"column\" gap=\"4\">\n {schema.title && (\n <Text as=\"h5\" variant=\"title-small\" weight=\"bold\">\n {schema.title}\n </Text>\n )}\n {description && <MarkdownContent content={description} />}\n {subComponents}\n </Flex>\n );\n }\n\n return (\n <>\n {schema.title && (\n <Box my={1}>\n <Typography variant=\"h5\">{schema.title}</Typography>\n <Divider />\n </Box>\n )}\n {description && (\n <Typography variant=\"body1\">\n <MarkdownContent content={description} />\n </Typography>\n )}\n {subComponents}\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RepoUrlPicker.esm.js","sources":["../../../../src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n scmAuthApiRef,\n scmIntegrationsApiRef,\n} from '@backstage/integration-react';\nimport { useTemplateSecrets } from '@backstage/plugin-scaffolder-react';\nimport Box from '@material-ui/core/Box';\nimport Divider from '@material-ui/core/Divider';\nimport Typography from '@material-ui/core/Typography';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport useDebounce from 'react-use/esm/useDebounce';\nimport { AzureRepoPicker } from './AzureRepoPicker';\nimport { BitbucketRepoPicker } from './BitbucketRepoPicker';\nimport { GerritRepoPicker } from './GerritRepoPicker';\nimport { GiteaRepoPicker } from './GiteaRepoPicker';\nimport { GithubRepoPicker } from './GithubRepoPicker';\nimport { GitlabRepoPicker } from './GitlabRepoPicker';\nimport { RepoUrlPickerHost } from './RepoUrlPickerHost';\nimport { RepoUrlPickerRepoName } from './RepoUrlPickerRepoName';\nimport { RepoUrlPickerFieldSchema } from './schema';\nimport { RepoUrlPickerState } from './types';\nimport { parseRepoPickerUrl, serializeRepoPickerUrl } from './utils';\nimport { MarkdownContent } from '@backstage/core-components';\nimport { useScaffolderTheme } from '@backstage/plugin-scaffolder-react/alpha';\nimport { Flex, Text } from '@backstage/ui';\n\nexport { RepoUrlPickerSchema } from './schema';\n\n/**\n * The underlying component that is rendered in the form for the `RepoUrlPicker`\n * field extension.\n *\n * @public\n */\nexport const RepoUrlPicker = (\n props: typeof RepoUrlPickerFieldSchema.TProps,\n) => {\n const scaffolderTheme = useScaffolderTheme();\n const { uiSchema, onChange, rawErrors, formData, schema } = props;\n const [state, setState] = useState<RepoUrlPickerState>(\n parseRepoPickerUrl(formData),\n );\n const [credentialsHost, setCredentialsHost] = useState<string | undefined>(\n undefined,\n );\n const integrationApi = useApi(scmIntegrationsApiRef);\n const scmAuthApi = useApi(scmAuthApiRef);\n const { secrets, setSecrets } = useTemplateSecrets();\n const allowedHosts = useMemo(\n () => uiSchema?.['ui:options']?.allowedHosts ?? [],\n [uiSchema],\n );\n const allowedOrganizations = useMemo(\n () => uiSchema?.['ui:options']?.allowedOrganizations ?? [],\n [uiSchema],\n );\n const allowedOwners = useMemo(\n () => uiSchema?.['ui:options']?.allowedOwners ?? [],\n [uiSchema],\n );\n const allowedProjects = useMemo(\n () => uiSchema?.['ui:options']?.allowedProjects ?? [],\n [uiSchema],\n );\n const allowedRepos = useMemo(\n () => uiSchema?.['ui:options']?.allowedRepos ?? [],\n [uiSchema],\n );\n const isDisabled = useMemo(\n () => uiSchema?.['ui:disabled'] ?? false,\n [uiSchema],\n );\n const ownerLabel = uiSchema?.['ui:options']?.ownerLabel;\n const ownerDescription = uiSchema?.['ui:options']?.ownerDescription;\n const repoLabel = uiSchema?.['ui:options']?.repoLabel;\n const repoDescription = uiSchema?.['ui:options']?.repoDescription;\n const disableRepoAutocomplete =\n uiSchema?.['ui:options']?.disableRepoAutocomplete ?? false;\n\n const { owner, organization, project, repoName } = state;\n\n useEffect(() => {\n onChange(serializeRepoPickerUrl(state));\n }, [state, onChange]);\n\n /* we deal with calling the repo setting here instead of in each components for ease */\n useEffect(() => {\n if (allowedOrganizations.length > 0 && !organization) {\n setState(prevState => ({\n ...prevState,\n organization: allowedOrganizations[0],\n }));\n }\n }, [setState, allowedOrganizations, organization]);\n\n useEffect(() => {\n if (allowedOwners.length > 0 && !owner) {\n setState(prevState => ({\n ...prevState,\n owner: allowedOwners[0],\n }));\n }\n }, [setState, allowedOwners, owner]);\n\n useEffect(() => {\n if (allowedProjects.length > 0 && !project) {\n setState(prevState => ({\n ...prevState,\n project: allowedProjects[0],\n }));\n }\n }, [setState, allowedProjects, project]);\n\n useEffect(() => {\n if (allowedRepos.length > 0 && !repoName) {\n setState(prevState => ({ ...prevState, repoName: allowedRepos[0] }));\n }\n }, [setState, allowedRepos, repoName]);\n\n const updateLocalState = useCallback(\n (newState: RepoUrlPickerState) => {\n setState(prevState => ({ ...prevState, ...newState }));\n },\n [setState],\n );\n\n useDebounce(\n async () => {\n const { requestUserCredentials } = uiSchema?.['ui:options'] ?? {};\n\n if (!requestUserCredentials || !state.host) {\n return;\n }\n\n // don't show login prompt if secret value is already in state for selected host\n if (\n secrets[requestUserCredentials.secretsKey] &&\n credentialsHost === state.host\n ) {\n return;\n }\n\n // user has requested that we use the users credentials\n // so lets grab them using the scmAuthApi and pass through\n // any additional scopes from the ui:options\n const { token } = await scmAuthApi.getCredentials({\n url: `https://${state.host}`,\n additionalScope: {\n repoWrite: true,\n customScopes: requestUserCredentials.additionalScopes,\n },\n });\n\n // set the secret using the key provided in the ui:options for use\n // in the templating the manifest with ${{ secrets[secretsKey] }}\n setSecrets({ [requestUserCredentials.secretsKey]: token });\n setCredentialsHost(state.host);\n },\n 500,\n [state, uiSchema],\n );\n\n const hostType =\n (state.host && integrationApi.byHost(state.host)?.type) ?? null;\n\n const description = uiSchema['ui:description'] ?? schema.description;\n\n const accessToken =\n uiSchema?.['ui:options']?.requestUserCredentials?.secretsKey &&\n secrets[uiSchema['ui:options'].requestUserCredentials.secretsKey];\n\n const subComponents = (\n <>\n <RepoUrlPickerHost\n host={state.host}\n hosts={allowedHosts}\n onChange={host => setState(prevState => ({ ...prevState, host }))}\n rawErrors={rawErrors}\n isDisabled={isDisabled}\n />\n {hostType === 'github' && (\n <GithubRepoPicker\n allowedOwners={allowedOwners}\n onChange={updateLocalState}\n rawErrors={rawErrors}\n state={state}\n isDisabled={isDisabled}\n accessToken={accessToken}\n ownerLabel={ownerLabel}\n ownerDescription={ownerDescription}\n disableRepoAutocomplete={disableRepoAutocomplete}\n />\n )}\n {hostType === 'gitea' && (\n <GiteaRepoPicker\n allowedOwners={allowedOwners}\n allowedRepos={allowedRepos}\n rawErrors={rawErrors}\n state={state}\n isDisabled={isDisabled}\n onChange={updateLocalState}\n ownerLabel={ownerLabel}\n ownerDescription={ownerDescription}\n />\n )}\n {hostType === 'gitlab' && (\n <GitlabRepoPicker\n allowedOwners={allowedOwners}\n rawErrors={rawErrors}\n state={state}\n onChange={updateLocalState}\n isDisabled={isDisabled}\n accessToken={accessToken}\n ownerLabel={ownerLabel}\n ownerDescription={ownerDescription}\n disableRepoAutocomplete={disableRepoAutocomplete}\n />\n )}\n {(hostType === 'bitbucket' ||\n hostType === 'bitbucketCloud' ||\n hostType === 'bitbucketServer') && (\n <BitbucketRepoPicker\n allowedOwners={allowedOwners}\n allowedProjects={allowedProjects}\n rawErrors={rawErrors}\n state={state}\n onChange={updateLocalState}\n isDisabled={isDisabled}\n accessToken={accessToken}\n ownerLabel={ownerLabel}\n ownerDescription={ownerDescription}\n />\n )}\n {hostType === 'azure' && (\n <AzureRepoPicker\n allowedOrganizations={allowedOrganizations}\n allowedProject={allowedProjects}\n rawErrors={rawErrors}\n state={state}\n isDisabled={isDisabled}\n onChange={updateLocalState}\n ownerLabel={ownerLabel}\n ownerDescription={ownerDescription}\n />\n )}\n {hostType === 'gerrit' && (\n <GerritRepoPicker\n rawErrors={rawErrors}\n state={state}\n onChange={updateLocalState}\n isDisabled={isDisabled}\n ownerLabel={ownerLabel}\n ownerDescription={ownerDescription}\n />\n )}\n <RepoUrlPickerRepoName\n repoName={state.repoName}\n allowedRepos={allowedRepos}\n onChange={repo =>\n setState(prevState => ({\n ...prevState,\n repoName: repo.id || repo.name,\n }))\n }\n isDisabled={isDisabled}\n rawErrors={rawErrors}\n availableRepos={state.availableRepos}\n repoLabel={repoLabel}\n repoDescription={repoDescription}\n disableRepoAutocomplete={disableRepoAutocomplete}\n />\n </>\n );\n\n if (scaffolderTheme === 'bui') {\n return (\n <Flex direction=\"column\" gap=\"4\">\n {schema.title && (\n <Text as=\"h5\" variant=\"title-small\" weight=\"bold\">\n {schema.title}\n </Text>\n )}\n {description && <MarkdownContent content={description} />}\n {subComponents}\n </Flex>\n );\n }\n\n return (\n <>\n {schema.title && (\n <Box my={1}>\n <Typography variant=\"h5\">{schema.title}</Typography>\n <Divider />\n </Box>\n )}\n {description && (\n <Typography variant=\"body1\">\n <MarkdownContent content={description} />\n </Typography>\n )}\n {subComponents}\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RepoUrlPickerHost.esm.js","sources":["../../../../src/components/fields/RepoUrlPicker/RepoUrlPickerHost.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useEffect } from 'react';\nimport {\n Progress,\n Select as MuiSelect,\n SelectItem,\n} from '@backstage/core-components';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { useScaffolderTheme } from '@backstage/plugin-scaffolder-react/alpha';\nimport { Select as BuiSelect } from '@backstage/ui';\nimport overrides from '../scaffolderFieldOverrides.module.css';\nimport type { Key } from 'react-aria-components';\n\nexport const RepoUrlPickerHost = (props: {\n host?: string;\n hosts?: string[];\n onChange: (host: string) => void;\n rawErrors: string[];\n isDisabled?: boolean;\n}) => {\n const theme = useScaffolderTheme();\n const { host, hosts, onChange, rawErrors, isDisabled } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const scaffolderApi = useApi(scaffolderApiRef);\n\n const { value: { integrations } = { integrations: [] }, loading } = useAsync(\n async () => {\n return await scaffolderApi.getIntegrationsList({\n allowedHosts: hosts ?? [],\n });\n },\n );\n\n useEffect(() => {\n // If there is no host chosen currently\n if (!host) {\n // Set the first of the allowedHosts option if that available\n if (hosts?.length) {\n onChange(hosts[0]);\n // if there's no hosts provided, fallback to using the first integration\n } else if (integrations?.length) {\n onChange(integrations[0].host);\n }\n }\n }, [hosts, host, onChange, integrations]);\n\n // If there are no allowedHosts provided, then show all integrations. Otherwise, only show integrations\n // that are provided in the dropdown for the user to choose from.\n const hostsOptions = integrations\n ? integrations\n .filter(i => (hosts?.length ? hosts?.includes(i.host) : true))\n .map(i => ({ label: i.title, value: i.host }))\n : [{ label: 'Loading...', value: 'loading' }];\n\n if (loading) {\n return <Progress />;\n }\n\n if (theme === 'bui') {\n return (\n <BuiSelect\n className={overrides.select}\n label={t('fields.repoUrlPicker.host.title')}\n description={t('fields.repoUrlPicker.host.description')}\n isDisabled={isDisabled || hosts?.length === 1}\n isInvalid={rawErrors?.length > 0 && !host}\n selectedKey={host ?? null}\n onSelectionChange={(key: Key | null) => {\n if (key !== null) onChange(String(key));\n }}\n options={hostsOptions}\n isRequired\n data-testid=\"host-select\"\n />\n );\n }\n\n const muiHostsOptions: SelectItem[] = hostsOptions;\n\n return (\n <>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !host}\n >\n <MuiSelect\n native\n disabled={isDisabled || hosts?.length === 1}\n label={t('fields.repoUrlPicker.host.title')}\n onChange={s => onChange(String(Array.isArray(s) ? s[0] : s))}\n selected={host}\n items={muiHostsOptions}\n data-testid=\"host-select\"\n />\n\n <FormHelperText>\n {t('fields.repoUrlPicker.host.description')}\n </FormHelperText>\n </FormControl>\n </>\n );\n};\n"],"names":["BuiSelect","MuiSelect"],"mappings":"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"}
1
+ {"version":3,"file":"RepoUrlPickerHost.esm.js","sources":["../../../../src/components/fields/RepoUrlPicker/RepoUrlPickerHost.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useEffect } from 'react';\nimport {\n Progress,\n Select as MuiSelect,\n SelectItem,\n} from '@backstage/core-components';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { useScaffolderTheme } from '@backstage/plugin-scaffolder-react/alpha';\nimport { Select as BuiSelect } from '@backstage/ui';\nimport overrides from '../scaffolderFieldOverrides.module.css';\nimport type { Key } from 'react-aria-components';\n\nexport const RepoUrlPickerHost = (props: {\n host?: string;\n hosts?: string[];\n onChange: (host: string) => void;\n rawErrors: string[];\n isDisabled?: boolean;\n}) => {\n const theme = useScaffolderTheme();\n const { host, hosts, onChange, rawErrors, isDisabled } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const scaffolderApi = useApi(scaffolderApiRef);\n\n const { value: { integrations } = { integrations: [] }, loading } = useAsync(\n async () => {\n return await scaffolderApi.getIntegrationsList({\n allowedHosts: hosts ?? [],\n });\n },\n );\n\n useEffect(() => {\n // If there is no host chosen currently\n if (!host) {\n // Set the first of the allowedHosts option if that available\n if (hosts?.length) {\n onChange(hosts[0]);\n // if there's no hosts provided, fallback to using the first integration\n } else if (integrations?.length) {\n onChange(integrations[0].host);\n }\n }\n }, [hosts, host, onChange, integrations]);\n\n // If there are no allowedHosts provided, then show all integrations. Otherwise, only show integrations\n // that are provided in the dropdown for the user to choose from.\n const hostsOptions = integrations\n ? integrations\n .filter(i => (hosts?.length ? hosts?.includes(i.host) : true))\n .map(i => ({ label: i.title, value: i.host }))\n : [{ label: 'Loading...', value: 'loading' }];\n\n if (loading) {\n return <Progress />;\n }\n\n if (theme === 'bui') {\n return (\n <BuiSelect\n className={overrides.select}\n label={t('fields.repoUrlPicker.host.title')}\n description={t('fields.repoUrlPicker.host.description')}\n isDisabled={isDisabled || hosts?.length === 1}\n isInvalid={rawErrors?.length > 0 && !host}\n selectedKey={host ?? null}\n onSelectionChange={(key: Key | null) => {\n if (key !== null) onChange(String(key));\n }}\n options={hostsOptions}\n isRequired\n data-testid=\"host-select\"\n />\n );\n }\n\n const muiHostsOptions: SelectItem[] = hostsOptions;\n\n return (\n <>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !host}\n >\n <MuiSelect\n native\n disabled={isDisabled || hosts?.length === 1}\n label={t('fields.repoUrlPicker.host.title')}\n onChange={s => onChange(String(Array.isArray(s) ? s[0] : s))}\n selected={host}\n items={muiHostsOptions}\n data-testid=\"host-select\"\n />\n\n <FormHelperText>\n {t('fields.repoUrlPicker.host.description')}\n </FormHelperText>\n </FormControl>\n </>\n );\n};\n"],"names":["BuiSelect","MuiSelect"],"mappings":"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"}
@@ -8,7 +8,7 @@ import MuiAutocomplete from '@material-ui/lab/Autocomplete';
8
8
  import { useEffect } from 'react';
9
9
  import { scaffolderTranslationRef } from '../../../translation.esm.js';
10
10
  import { useScaffolderTheme } from '@backstage/plugin-scaffolder-react/alpha';
11
- import { Select } from '@backstage/ui';
11
+ import { Select, TextField } from '@backstage/ui';
12
12
  import { Autocomplete } from '../Autocomplete/Autocomplete.esm.js';
13
13
  import overrides from '../scaffolderFieldOverrides.module.css.esm.js';
14
14
 
@@ -20,7 +20,10 @@ const RepoUrlPickerRepoName = (props) => {
20
20
  onChange,
21
21
  rawErrors,
22
22
  availableRepos,
23
- isDisabled
23
+ isDisabled,
24
+ repoLabel,
25
+ repoDescription,
26
+ disableRepoAutocomplete
24
27
  } = props;
25
28
  const { t } = useTranslationRef(scaffolderTranslationRef);
26
29
  useEffect(() => {
@@ -32,24 +35,38 @@ const RepoUrlPickerRepoName = (props) => {
32
35
  }, [allowedRepos, repoName, onChange]);
33
36
  if (theme === "bui") {
34
37
  if (allowedRepos?.length) {
35
- const repoItems2 = allowedRepos.map((i) => ({ label: i, value: i }));
38
+ const repoItems = allowedRepos.map((i) => ({ label: i, value: i }));
36
39
  return /* @__PURE__ */ jsx(
37
40
  Select,
38
41
  {
39
42
  className: overrides.select,
40
- label: t("fields.repoUrlPicker.repository.title"),
41
- description: t("fields.repoUrlPicker.repository.description"),
43
+ label: repoLabel ?? t("fields.repoUrlPicker.repository.title"),
44
+ description: repoDescription ?? t("fields.repoUrlPicker.repository.description"),
42
45
  isDisabled: isDisabled || allowedRepos.length === 1,
43
46
  isInvalid: rawErrors?.length > 0 && !repoName,
44
47
  selectedKey: repoName ?? null,
45
48
  onSelectionChange: (key) => {
46
49
  if (key !== null) onChange({ name: String(key) });
47
50
  },
48
- options: repoItems2,
51
+ options: repoItems,
49
52
  isRequired: true
50
53
  }
51
54
  );
52
55
  }
56
+ if (disableRepoAutocomplete) {
57
+ return /* @__PURE__ */ jsx(
58
+ TextField,
59
+ {
60
+ label: repoLabel ?? t("fields.repoUrlPicker.repository.inputTitle"),
61
+ description: repoDescription ?? t("fields.repoUrlPicker.repository.description"),
62
+ value: repoName ?? "",
63
+ onChange: (value) => onChange({ name: value }),
64
+ isDisabled,
65
+ isRequired: true,
66
+ isInvalid: rawErrors?.length > 0 && !repoName
67
+ }
68
+ );
69
+ }
53
70
  const options = (availableRepos || []).map((r) => ({
54
71
  label: r.name,
55
72
  value: r.name
@@ -57,8 +74,8 @@ const RepoUrlPickerRepoName = (props) => {
57
74
  return /* @__PURE__ */ jsx(
58
75
  Autocomplete,
59
76
  {
60
- label: t("fields.repoUrlPicker.repository.inputTitle"),
61
- description: t("fields.repoUrlPicker.repository.description"),
77
+ label: repoLabel ?? t("fields.repoUrlPicker.repository.inputTitle"),
78
+ description: repoDescription ?? t("fields.repoUrlPicker.repository.description"),
62
79
  inputValue: repoName ?? "",
63
80
  onInputChange: (value) => {
64
81
  const selectedRepo = availableRepos?.find((r) => r.name === value);
@@ -79,7 +96,62 @@ const RepoUrlPickerRepoName = (props) => {
79
96
  }
80
97
  );
81
98
  }
82
- const repoItems = allowedRepos ? allowedRepos.map((i) => ({ label: i, value: i })) : [{ label: "Loading...", value: "loading" }];
99
+ const renderMuiInput = () => {
100
+ if (allowedRepos?.length) {
101
+ const repoItems = allowedRepos.map((i) => ({
102
+ label: i,
103
+ value: i
104
+ }));
105
+ return /* @__PURE__ */ jsx(
106
+ Select$1,
107
+ {
108
+ native: true,
109
+ label: repoLabel ?? t("fields.repoUrlPicker.repository.title"),
110
+ onChange: (selected) => onChange({
111
+ name: String(Array.isArray(selected) ? selected[0] : selected)
112
+ }),
113
+ disabled: isDisabled || allowedRepos.length === 1,
114
+ selected: repoName,
115
+ items: repoItems
116
+ }
117
+ );
118
+ }
119
+ if (disableRepoAutocomplete) {
120
+ return /* @__PURE__ */ jsx(
121
+ MuiTextField,
122
+ {
123
+ label: repoLabel ?? t("fields.repoUrlPicker.repository.inputTitle"),
124
+ value: repoName ?? "",
125
+ onChange: (e) => onChange({ name: e.target.value }),
126
+ required: true,
127
+ disabled: isDisabled,
128
+ error: rawErrors?.length > 0 && !repoName
129
+ }
130
+ );
131
+ }
132
+ return /* @__PURE__ */ jsx(
133
+ MuiAutocomplete,
134
+ {
135
+ value: repoName,
136
+ onChange: (_, newValue) => {
137
+ const selectedRepo = availableRepos?.find((r) => r.name === newValue);
138
+ onChange(selectedRepo || { name: newValue || "" });
139
+ },
140
+ options: (availableRepos || []).map((r) => r.name),
141
+ renderInput: (params) => /* @__PURE__ */ jsx(
142
+ MuiTextField,
143
+ {
144
+ ...params,
145
+ label: repoLabel ?? t("fields.repoUrlPicker.repository.inputTitle"),
146
+ required: true
147
+ }
148
+ ),
149
+ freeSolo: true,
150
+ autoSelect: true,
151
+ disabled: isDisabled
152
+ }
153
+ );
154
+ };
83
155
  return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
84
156
  FormControl,
85
157
  {
@@ -87,43 +159,8 @@ const RepoUrlPickerRepoName = (props) => {
87
159
  required: true,
88
160
  error: rawErrors?.length > 0 && !repoName,
89
161
  children: [
90
- allowedRepos?.length ? /* @__PURE__ */ jsx(
91
- Select$1,
92
- {
93
- native: true,
94
- label: t("fields.repoUrlPicker.repository.title"),
95
- onChange: (selected) => onChange({
96
- name: String(Array.isArray(selected) ? selected[0] : selected)
97
- }),
98
- disabled: isDisabled || allowedRepos.length === 1,
99
- selected: repoName,
100
- items: repoItems
101
- }
102
- ) : /* @__PURE__ */ jsx(
103
- MuiAutocomplete,
104
- {
105
- value: repoName,
106
- onChange: (_, newValue) => {
107
- const selectedRepo = availableRepos?.find(
108
- (r) => r.name === newValue
109
- );
110
- onChange(selectedRepo || { name: newValue || "" });
111
- },
112
- options: (availableRepos || []).map((r) => r.name),
113
- renderInput: (params) => /* @__PURE__ */ jsx(
114
- MuiTextField,
115
- {
116
- ...params,
117
- label: t("fields.repoUrlPicker.repository.inputTitle"),
118
- required: true
119
- }
120
- ),
121
- freeSolo: true,
122
- autoSelect: true,
123
- disabled: isDisabled
124
- }
125
- ),
126
- /* @__PURE__ */ jsx(FormHelperText, { children: t("fields.repoUrlPicker.repository.description") })
162
+ renderMuiInput(),
163
+ /* @__PURE__ */ jsx(FormHelperText, { children: repoDescription ?? t("fields.repoUrlPicker.repository.description") })
127
164
  ]
128
165
  }
129
166
  ) });
@@ -1 +1 @@
1
- {"version":3,"file":"RepoUrlPickerRepoName.esm.js","sources":["../../../../src/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Select as MuiSelect, SelectItem } from '@backstage/core-components';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport MuiTextField from '@material-ui/core/TextField';\nimport MuiAutocomplete from '@material-ui/lab/Autocomplete';\nimport { useEffect } from 'react';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { AvailableRepositories } from './types';\nimport { useScaffolderTheme } from '@backstage/plugin-scaffolder-react/alpha';\nimport { Select as BuiSelect } from '@backstage/ui';\nimport { Autocomplete as BuiAutocomplete } from '../Autocomplete';\nimport overrides from '../scaffolderFieldOverrides.module.css';\nimport type { Key } from 'react-aria-components';\n\nexport const RepoUrlPickerRepoName = (props: {\n repoName?: string;\n allowedRepos?: string[];\n onChange: (chosenRepo: AvailableRepositories) => void;\n rawErrors: string[];\n availableRepos?: AvailableRepositories[];\n isDisabled?: boolean;\n}) => {\n const theme = useScaffolderTheme();\n const {\n repoName,\n allowedRepos,\n onChange,\n rawErrors,\n availableRepos,\n isDisabled,\n } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n useEffect(() => {\n // If there is no repoName chosen currently\n if (!repoName) {\n // Set the first of the allowedRepos option if that available\n if (allowedRepos?.length) {\n onChange({ name: allowedRepos[0] });\n }\n }\n }, [allowedRepos, repoName, onChange]);\n\n if (theme === 'bui') {\n if (allowedRepos?.length) {\n const repoItems = allowedRepos.map(i => ({ label: i, value: i }));\n\n return (\n <BuiSelect\n className={overrides.select}\n label={t('fields.repoUrlPicker.repository.title')}\n description={t('fields.repoUrlPicker.repository.description')}\n isDisabled={isDisabled || allowedRepos.length === 1}\n isInvalid={rawErrors?.length > 0 && !repoName}\n selectedKey={repoName ?? null}\n onSelectionChange={(key: Key | null) => {\n if (key !== null) onChange({ name: String(key) });\n }}\n options={repoItems}\n isRequired\n />\n );\n }\n\n const options = (availableRepos || []).map(r => ({\n label: r.name,\n value: r.name,\n }));\n\n return (\n <BuiAutocomplete\n label={t('fields.repoUrlPicker.repository.inputTitle')}\n description={t('fields.repoUrlPicker.repository.description')}\n inputValue={repoName ?? ''}\n onInputChange={value => {\n const selectedRepo = availableRepos?.find(r => r.name === value);\n onChange(selectedRepo || { name: value });\n }}\n onSelectionChange={(key: Key | null) => {\n if (key !== null) {\n const selectedRepo = availableRepos?.find(\n r => r.name === String(key),\n );\n onChange(selectedRepo || { name: String(key) });\n }\n }}\n options={options}\n isDisabled={isDisabled}\n isRequired\n isInvalid={rawErrors?.length > 0 && !repoName}\n />\n );\n }\n\n const repoItems: SelectItem[] = allowedRepos\n ? allowedRepos.map(i => ({ label: i, value: i }))\n : [{ label: 'Loading...', value: 'loading' }];\n\n return (\n <>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !repoName}\n >\n {allowedRepos?.length ? (\n <MuiSelect\n native\n label={t('fields.repoUrlPicker.repository.title')}\n onChange={selected =>\n onChange({\n name: String(Array.isArray(selected) ? selected[0] : selected),\n })\n }\n disabled={isDisabled || allowedRepos.length === 1}\n selected={repoName}\n items={repoItems}\n />\n ) : (\n <MuiAutocomplete\n value={repoName}\n onChange={(_, newValue) => {\n const selectedRepo = availableRepos?.find(\n r => r.name === newValue,\n );\n onChange(selectedRepo || { name: newValue || '' });\n }}\n options={(availableRepos || []).map(r => r.name)}\n renderInput={params => (\n <MuiTextField\n {...params}\n label={t('fields.repoUrlPicker.repository.inputTitle')}\n required\n />\n )}\n freeSolo\n autoSelect\n disabled={isDisabled}\n />\n )}\n <FormHelperText>\n {t('fields.repoUrlPicker.repository.description')}\n </FormHelperText>\n </FormControl>\n </>\n );\n};\n"],"names":["repoItems","BuiSelect","BuiAutocomplete","MuiSelect"],"mappings":"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"}
1
+ {"version":3,"file":"RepoUrlPickerRepoName.esm.js","sources":["../../../../src/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Select as MuiSelect, SelectItem } from '@backstage/core-components';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport MuiTextField from '@material-ui/core/TextField';\nimport MuiAutocomplete from '@material-ui/lab/Autocomplete';\nimport { useEffect } from 'react';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { AvailableRepositories } from './types';\nimport { useScaffolderTheme } from '@backstage/plugin-scaffolder-react/alpha';\nimport { TextField as BuiTextField, Select as BuiSelect } from '@backstage/ui';\nimport { Autocomplete as BuiAutocomplete } from '../Autocomplete';\nimport overrides from '../scaffolderFieldOverrides.module.css';\nimport type { Key } from 'react-aria-components';\n\nexport const RepoUrlPickerRepoName = (props: {\n repoName?: string;\n allowedRepos?: string[];\n onChange: (chosenRepo: AvailableRepositories) => void;\n rawErrors: string[];\n availableRepos?: AvailableRepositories[];\n isDisabled?: boolean;\n repoLabel?: string;\n repoDescription?: string;\n disableRepoAutocomplete?: boolean;\n}) => {\n const theme = useScaffolderTheme();\n const {\n repoName,\n allowedRepos,\n onChange,\n rawErrors,\n availableRepos,\n isDisabled,\n repoLabel,\n repoDescription,\n disableRepoAutocomplete,\n } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n useEffect(() => {\n // If there is no repoName chosen currently\n if (!repoName) {\n // Set the first of the allowedRepos option if that available\n if (allowedRepos?.length) {\n onChange({ name: allowedRepos[0] });\n }\n }\n }, [allowedRepos, repoName, onChange]);\n\n if (theme === 'bui') {\n if (allowedRepos?.length) {\n const repoItems = allowedRepos.map(i => ({ label: i, value: i }));\n\n return (\n <BuiSelect\n className={overrides.select}\n label={repoLabel ?? t('fields.repoUrlPicker.repository.title')}\n description={\n repoDescription ?? t('fields.repoUrlPicker.repository.description')\n }\n isDisabled={isDisabled || allowedRepos.length === 1}\n isInvalid={rawErrors?.length > 0 && !repoName}\n selectedKey={repoName ?? null}\n onSelectionChange={(key: Key | null) => {\n if (key !== null) onChange({ name: String(key) });\n }}\n options={repoItems}\n isRequired\n />\n );\n }\n\n if (disableRepoAutocomplete) {\n return (\n <BuiTextField\n label={repoLabel ?? t('fields.repoUrlPicker.repository.inputTitle')}\n description={\n repoDescription ?? t('fields.repoUrlPicker.repository.description')\n }\n value={repoName ?? ''}\n onChange={value => onChange({ name: value })}\n isDisabled={isDisabled}\n isRequired\n isInvalid={rawErrors?.length > 0 && !repoName}\n />\n );\n }\n\n const options = (availableRepos || []).map(r => ({\n label: r.name,\n value: r.name,\n }));\n\n return (\n <BuiAutocomplete\n label={repoLabel ?? t('fields.repoUrlPicker.repository.inputTitle')}\n description={\n repoDescription ?? t('fields.repoUrlPicker.repository.description')\n }\n inputValue={repoName ?? ''}\n onInputChange={value => {\n const selectedRepo = availableRepos?.find(r => r.name === value);\n onChange(selectedRepo || { name: value });\n }}\n onSelectionChange={(key: Key | null) => {\n if (key !== null) {\n const selectedRepo = availableRepos?.find(\n r => r.name === String(key),\n );\n onChange(selectedRepo || { name: String(key) });\n }\n }}\n options={options}\n isDisabled={isDisabled}\n isRequired\n isInvalid={rawErrors?.length > 0 && !repoName}\n />\n );\n }\n\n const renderMuiInput = () => {\n if (allowedRepos?.length) {\n const repoItems: SelectItem[] = allowedRepos.map(i => ({\n label: i,\n value: i,\n }));\n\n return (\n <MuiSelect\n native\n label={repoLabel ?? t('fields.repoUrlPicker.repository.title')}\n onChange={selected =>\n onChange({\n name: String(Array.isArray(selected) ? selected[0] : selected),\n })\n }\n disabled={isDisabled || allowedRepos.length === 1}\n selected={repoName}\n items={repoItems}\n />\n );\n }\n\n if (disableRepoAutocomplete) {\n return (\n <MuiTextField\n label={repoLabel ?? t('fields.repoUrlPicker.repository.inputTitle')}\n value={repoName ?? ''}\n onChange={e => onChange({ name: e.target.value })}\n required\n disabled={isDisabled}\n error={rawErrors?.length > 0 && !repoName}\n />\n );\n }\n\n return (\n <MuiAutocomplete\n value={repoName}\n onChange={(_, newValue) => {\n const selectedRepo = availableRepos?.find(r => r.name === newValue);\n onChange(selectedRepo || { name: newValue || '' });\n }}\n options={(availableRepos || []).map(r => r.name)}\n renderInput={params => (\n <MuiTextField\n {...params}\n label={repoLabel ?? t('fields.repoUrlPicker.repository.inputTitle')}\n required\n />\n )}\n freeSolo\n autoSelect\n disabled={isDisabled}\n />\n );\n };\n\n return (\n <>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !repoName}\n >\n {renderMuiInput()}\n <FormHelperText>\n {repoDescription ?? t('fields.repoUrlPicker.repository.description')}\n </FormHelperText>\n </FormControl>\n </>\n );\n};\n"],"names":["BuiSelect","BuiTextField","BuiAutocomplete","MuiSelect"],"mappings":"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"}
@@ -8,6 +8,13 @@ const RepoUrlPickerFieldSchema = makeFieldSchema({
8
8
  allowedOwners: z.array(z.string()).optional().describe("List of allowed owners in the given SCM platform"),
9
9
  allowedProjects: z.array(z.string()).optional().describe("List of allowed projects in the given SCM platform"),
10
10
  allowedRepos: z.array(z.string()).optional().describe("List of allowed repos in the given SCM platform"),
11
+ ownerLabel: z.string().optional().describe("Custom label for the owner/namespace field"),
12
+ ownerDescription: z.string().optional().describe("Custom description for the owner/namespace field"),
13
+ repoLabel: z.string().optional().describe("Custom label for the repository name field"),
14
+ repoDescription: z.string().optional().describe("Custom description for the repository name field"),
15
+ disableRepoAutocomplete: z.boolean().optional().describe(
16
+ "If true, renders a plain text input instead of an autocomplete dropdown for the repository name"
17
+ ),
11
18
  requestUserCredentials: z.object({
12
19
  secretsKey: z.string().describe(
13
20
  "Key used within the template secrets context to store the credential"