@backstage/plugin-scaffolder 1.39.0-next.2 → 1.39.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 (31) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js +1 -1
  3. package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js.map +1 -1
  4. package/dist/alpha/components/TemplatesSubPage.esm.js +16 -2
  5. package/dist/alpha/components/TemplatesSubPage.esm.js.map +1 -1
  6. package/dist/alpha/extensions.esm.js +4 -1
  7. package/dist/alpha/extensions.esm.js.map +1 -1
  8. package/dist/alpha.d.ts +2 -0
  9. package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js +2 -2
  10. package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js.map +1 -1
  11. package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js +11 -9
  12. package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js.map +1 -1
  13. package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js +10 -8
  14. package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js.map +1 -1
  15. package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js +12 -5
  16. package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js.map +1 -1
  17. package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js +17 -9
  18. package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js.map +1 -1
  19. package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js +21 -9
  20. package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js.map +1 -1
  21. package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js +21 -10
  22. package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js.map +1 -1
  23. package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js +29 -7
  24. package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js.map +1 -1
  25. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js +83 -46
  26. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js.map +1 -1
  27. package/dist/components/fields/RepoUrlPicker/schema.esm.js +7 -0
  28. package/dist/components/fields/RepoUrlPicker/schema.esm.js.map +1 -1
  29. package/dist/index.d.ts +10 -0
  30. package/dist/plugins/scaffolder/package.json.esm.js +1 -1
  31. package/package.json +27 -27
@@ -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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"}
@@ -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"
@@ -1 +1 @@
1
- {"version":3,"file":"schema.esm.js","sources":["../../../../src/components/fields/RepoUrlPicker/schema.ts"],"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 { makeFieldSchema } from '@backstage/plugin-scaffolder-react';\n\n/**\n * @public\n */\nexport const RepoUrlPickerFieldSchema = makeFieldSchema({\n output: z => z.string(),\n uiOptions: z =>\n z.object({\n allowedHosts: z\n .array(z.string())\n .optional()\n .describe('List of allowed SCM platform hosts'),\n allowedOrganizations: z\n .array(z.string())\n .optional()\n .describe('List of allowed organizations in the given SCM platform'),\n allowedOwners: z\n .array(z.string())\n .optional()\n .describe('List of allowed owners in the given SCM platform'),\n allowedProjects: z\n .array(z.string())\n .optional()\n .describe('List of allowed projects in the given SCM platform'),\n allowedRepos: z\n .array(z.string())\n .optional()\n .describe('List of allowed repos in the given SCM platform'),\n requestUserCredentials: z\n .object({\n secretsKey: z\n .string()\n .describe(\n 'Key used within the template secrets context to store the credential',\n ),\n additionalScopes: z\n .object({\n gitea: z\n .array(z.string())\n .optional()\n .describe('Additional Gitea scopes to request'),\n gerrit: z\n .array(z.string())\n .optional()\n .describe('Additional Gerrit scopes to request'),\n github: z\n .array(z.string())\n .optional()\n .describe('Additional GitHub scopes to request'),\n gitlab: z\n .array(z.string())\n .optional()\n .describe('Additional GitLab scopes to request'),\n bitbucket: z\n .array(z.string())\n .optional()\n .describe('Additional BitBucket scopes to request'),\n azure: z\n .array(z.string())\n .optional()\n .describe('Additional Azure scopes to request'),\n })\n .optional()\n .describe('Additional permission scopes to request'),\n })\n .optional()\n .describe(\n 'If defined will request user credentials to auth against the given SCM platform',\n ),\n }),\n});\n\n/**\n * The input props that can be specified under `ui:options` for the\n * `RepoUrlPicker` field extension.\n *\n * @public\n * @deprecated this will be removed as it's no longer used\n */\nexport type RepoUrlPickerUiOptions = NonNullable<\n (typeof RepoUrlPickerFieldSchema.TProps.uiSchema)['ui:options']\n>;\n\nexport type RepoUrlPickerProps = typeof RepoUrlPickerFieldSchema.TProps;\n\n// This has been duplicated to /plugins/scaffolder/src/components/fields/RepoBranchPicker/schema.ts\n// NOTE: There is a bug with this failing validation in the custom field explorer due\n// to https://github.com/rjsf-team/react-jsonschema-form/issues/675 even if\n// requestUserCredentials is not defined\nexport const RepoUrlPickerSchema = RepoUrlPickerFieldSchema.schema;\n"],"names":[],"mappings":";;AAqBO,MAAM,2BAA2B,eAAA,CAAgB;AAAA,EACtD,MAAA,EAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,EAAO;AAAA,EACtB,SAAA,EAAW,CAAA,CAAA,KACT,CAAA,CAAE,MAAA,CAAO;AAAA,IACP,YAAA,EAAc,CAAA,CACX,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,oCAAoC,CAAA;AAAA,IAChD,oBAAA,EAAsB,CAAA,CACnB,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,yDAAyD,CAAA;AAAA,IACrE,aAAA,EAAe,CAAA,CACZ,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,kDAAkD,CAAA;AAAA,IAC9D,eAAA,EAAiB,CAAA,CACd,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,oDAAoD,CAAA;AAAA,IAChE,YAAA,EAAc,CAAA,CACX,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,iDAAiD,CAAA;AAAA,IAC7D,sBAAA,EAAwB,EACrB,MAAA,CAAO;AAAA,MACN,UAAA,EAAY,CAAA,CACT,MAAA,EAAO,CACP,QAAA;AAAA,QACC;AAAA,OACF;AAAA,MACF,gBAAA,EAAkB,EACf,MAAA,CAAO;AAAA,QACN,KAAA,EAAO,CAAA,CACJ,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,oCAAoC,CAAA;AAAA,QAChD,MAAA,EAAQ,CAAA,CACL,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,qCAAqC,CAAA;AAAA,QACjD,MAAA,EAAQ,CAAA,CACL,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,qCAAqC,CAAA;AAAA,QACjD,MAAA,EAAQ,CAAA,CACL,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,qCAAqC,CAAA;AAAA,QACjD,SAAA,EAAW,CAAA,CACR,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,wCAAwC,CAAA;AAAA,QACpD,KAAA,EAAO,CAAA,CACJ,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,oCAAoC;AAAA,OACjD,CAAA,CACA,QAAA,EAAS,CACT,SAAS,yCAAyC;AAAA,KACtD,CAAA,CACA,QAAA,EAAS,CACT,QAAA;AAAA,MACC;AAAA;AACF,GACH;AACL,CAAC;AAmBM,MAAM,sBAAsB,wBAAA,CAAyB;;;;"}
1
+ {"version":3,"file":"schema.esm.js","sources":["../../../../src/components/fields/RepoUrlPicker/schema.ts"],"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 { makeFieldSchema } from '@backstage/plugin-scaffolder-react';\n\n/**\n * @public\n */\nexport const RepoUrlPickerFieldSchema = makeFieldSchema({\n output: z => z.string(),\n uiOptions: z =>\n z.object({\n allowedHosts: z\n .array(z.string())\n .optional()\n .describe('List of allowed SCM platform hosts'),\n allowedOrganizations: z\n .array(z.string())\n .optional()\n .describe('List of allowed organizations in the given SCM platform'),\n allowedOwners: z\n .array(z.string())\n .optional()\n .describe('List of allowed owners in the given SCM platform'),\n allowedProjects: z\n .array(z.string())\n .optional()\n .describe('List of allowed projects in the given SCM platform'),\n allowedRepos: z\n .array(z.string())\n .optional()\n .describe('List of allowed repos in the given SCM platform'),\n ownerLabel: z\n .string()\n .optional()\n .describe('Custom label for the owner/namespace field'),\n ownerDescription: z\n .string()\n .optional()\n .describe('Custom description for the owner/namespace field'),\n repoLabel: z\n .string()\n .optional()\n .describe('Custom label for the repository name field'),\n repoDescription: z\n .string()\n .optional()\n .describe('Custom description for the repository name field'),\n disableRepoAutocomplete: z\n .boolean()\n .optional()\n .describe(\n 'If true, renders a plain text input instead of an autocomplete dropdown for the repository name',\n ),\n requestUserCredentials: z\n .object({\n secretsKey: z\n .string()\n .describe(\n 'Key used within the template secrets context to store the credential',\n ),\n additionalScopes: z\n .object({\n gitea: z\n .array(z.string())\n .optional()\n .describe('Additional Gitea scopes to request'),\n gerrit: z\n .array(z.string())\n .optional()\n .describe('Additional Gerrit scopes to request'),\n github: z\n .array(z.string())\n .optional()\n .describe('Additional GitHub scopes to request'),\n gitlab: z\n .array(z.string())\n .optional()\n .describe('Additional GitLab scopes to request'),\n bitbucket: z\n .array(z.string())\n .optional()\n .describe('Additional BitBucket scopes to request'),\n azure: z\n .array(z.string())\n .optional()\n .describe('Additional Azure scopes to request'),\n })\n .optional()\n .describe('Additional permission scopes to request'),\n })\n .optional()\n .describe(\n 'If defined will request user credentials to auth against the given SCM platform',\n ),\n }),\n});\n\n/**\n * The input props that can be specified under `ui:options` for the\n * `RepoUrlPicker` field extension.\n *\n * @public\n * @deprecated this will be removed as it's no longer used\n */\nexport type RepoUrlPickerUiOptions = NonNullable<\n (typeof RepoUrlPickerFieldSchema.TProps.uiSchema)['ui:options']\n>;\n\nexport type RepoUrlPickerProps = typeof RepoUrlPickerFieldSchema.TProps;\n\n// This has been duplicated to /plugins/scaffolder/src/components/fields/RepoBranchPicker/schema.ts\n// NOTE: There is a bug with this failing validation in the custom field explorer due\n// to https://github.com/rjsf-team/react-jsonschema-form/issues/675 even if\n// requestUserCredentials is not defined\nexport const RepoUrlPickerSchema = RepoUrlPickerFieldSchema.schema;\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -135,10 +135,15 @@ type OwnerPickerUiOptions = NonNullable<(typeof OwnerPickerFieldSchema.TProps.ui
135
135
  * @public
136
136
  */
137
137
  declare const RepoUrlPickerFieldSchema: _backstage_plugin_scaffolder_react.FieldSchema<string, {
138
+ ownerLabel?: string | undefined;
138
139
  allowedOrganizations?: string[] | undefined;
140
+ ownerDescription?: string | undefined;
139
141
  allowedOwners?: string[] | undefined;
140
142
  allowedProjects?: string[] | undefined;
143
+ disableRepoAutocomplete?: boolean | undefined;
141
144
  allowedRepos?: string[] | undefined;
145
+ repoLabel?: string | undefined;
146
+ repoDescription?: string | undefined;
142
147
  allowedHosts?: string[] | undefined;
143
148
  requestUserCredentials?: {
144
149
  secretsKey: string;
@@ -296,10 +301,15 @@ declare const MultiEntityPickerFieldExtension: _backstage_plugin_scaffolder_reac
296
301
  * @public
297
302
  */
298
303
  declare const RepoUrlPickerFieldExtension: _backstage_plugin_scaffolder_react.FieldExtensionComponent<string, {
304
+ ownerLabel?: string | undefined;
299
305
  allowedOrganizations?: string[] | undefined;
306
+ ownerDescription?: string | undefined;
300
307
  allowedOwners?: string[] | undefined;
301
308
  allowedProjects?: string[] | undefined;
309
+ disableRepoAutocomplete?: boolean | undefined;
302
310
  allowedRepos?: string[] | undefined;
311
+ repoLabel?: string | undefined;
312
+ repoDescription?: string | undefined;
303
313
  allowedHosts?: string[] | undefined;
304
314
  requestUserCredentials?: {
305
315
  secretsKey: string;
@@ -1,5 +1,5 @@
1
1
  var name = "@backstage/plugin-scaffolder";
2
- var version = "1.39.0-next.2";
2
+ var version = "1.39.0";
3
3
  var description = "The Backstage plugin that helps you create new things";
4
4
  var backstage = {
5
5
  role: "frontend-plugin",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-scaffolder",
3
- "version": "1.39.0-next.2",
3
+ "version": "1.39.0",
4
4
  "description": "The Backstage plugin that helps you create new things",
5
5
  "backstage": {
6
6
  "role": "frontend-plugin",
@@ -70,24 +70,24 @@
70
70
  "test": "backstage-cli package test"
71
71
  },
72
72
  "dependencies": {
73
- "@backstage/catalog-client": "1.16.2-next.1",
74
- "@backstage/catalog-model": "1.10.0",
75
- "@backstage/core-components": "0.18.14-next.2",
76
- "@backstage/core-plugin-api": "1.12.10-next.1",
77
- "@backstage/errors": "1.3.1",
78
- "@backstage/filter-predicates": "0.1.5-next.1",
79
- "@backstage/frontend-plugin-api": "0.18.1-next.1",
80
- "@backstage/integration": "2.1.2-next.1",
81
- "@backstage/integration-react": "1.2.22-next.1",
82
- "@backstage/plugin-catalog-common": "1.2.0-next.0",
83
- "@backstage/plugin-catalog-react": "3.2.3-next.2",
84
- "@backstage/plugin-permission-react": "0.5.5-next.1",
85
- "@backstage/plugin-scaffolder-common": "2.3.0-next.2",
86
- "@backstage/plugin-scaffolder-react": "2.1.0-next.1",
87
- "@backstage/plugin-techdocs-common": "0.1.1",
88
- "@backstage/plugin-techdocs-react": "1.3.15-next.2",
89
- "@backstage/types": "1.2.2",
90
- "@backstage/ui": "0.18.0-next.2",
73
+ "@backstage/catalog-client": "^1.16.2",
74
+ "@backstage/catalog-model": "^1.10.1",
75
+ "@backstage/core-components": "^0.18.14",
76
+ "@backstage/core-plugin-api": "^1.12.10",
77
+ "@backstage/errors": "^1.3.1",
78
+ "@backstage/filter-predicates": "^0.1.5",
79
+ "@backstage/frontend-plugin-api": "^0.18.1",
80
+ "@backstage/integration": "^2.1.2",
81
+ "@backstage/integration-react": "^1.2.22",
82
+ "@backstage/plugin-catalog-common": "^1.2.0",
83
+ "@backstage/plugin-catalog-react": "^3.2.3",
84
+ "@backstage/plugin-permission-react": "^0.5.5",
85
+ "@backstage/plugin-scaffolder-common": "^2.3.0",
86
+ "@backstage/plugin-scaffolder-react": "^2.1.0",
87
+ "@backstage/plugin-techdocs-common": "^0.1.1",
88
+ "@backstage/plugin-techdocs-react": "^1.3.15",
89
+ "@backstage/types": "^1.2.2",
90
+ "@backstage/ui": "^0.18.0",
91
91
  "@codemirror/language": "^6.0.0",
92
92
  "@codemirror/legacy-modes": "^6.1.0",
93
93
  "@codemirror/view": "^6.0.0",
@@ -120,14 +120,14 @@
120
120
  "zod-to-json-schema": "^3.25.1"
121
121
  },
122
122
  "devDependencies": {
123
- "@backstage/cli": "0.36.6-next.1",
124
- "@backstage/core-app-api": "1.20.5-next.2",
125
- "@backstage/dev-utils": "1.1.27-next.1",
126
- "@backstage/frontend-test-utils": "0.6.4-next.2",
127
- "@backstage/plugin-catalog": "2.0.9-next.2",
128
- "@backstage/plugin-permission-common": "0.9.11-next.0",
129
- "@backstage/plugin-techdocs": "1.18.1-next.2",
130
- "@backstage/test-utils": "1.7.22-next.2",
123
+ "@backstage/cli": "^0.36.6",
124
+ "@backstage/core-app-api": "^1.20.5",
125
+ "@backstage/dev-utils": "^1.1.27",
126
+ "@backstage/frontend-test-utils": "^0.6.4",
127
+ "@backstage/plugin-catalog": "^2.0.9",
128
+ "@backstage/plugin-permission-common": "^0.9.11",
129
+ "@backstage/plugin-techdocs": "^1.18.1",
130
+ "@backstage/test-utils": "^1.7.22",
131
131
  "@testing-library/dom": "^10.0.0",
132
132
  "@testing-library/jest-dom": "^6.0.0",
133
133
  "@testing-library/react": "^16.0.0",