@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.
- package/CHANGELOG.md +50 -0
- package/dist/alpha/api/FormDecoratorsApi.esm.js.map +1 -1
- package/dist/alpha/api/ref.esm.js.map +1 -1
- package/dist/alpha/components/EditorSubPage.esm.js.map +1 -1
- package/dist/alpha/components/TasksSubPage.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/CustomFieldExplorer.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/CustomFieldPlayground.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/CustomFieldsPage.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/DirectoryEditorContext.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/DryRunContext.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResults.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsList.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsSplitView.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsView.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/DryRunResults/IconLink.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskPageLinks.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskStatusStepper.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateEditor.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateEditorBrowser.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateEditorIntro.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateEditorLayout.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateEditorPage.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateEditorTextArea.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarFileMenu.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarTemplatesMenu.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateFormPage.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateIntroPage.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/useTemplateDirectory.esm.js.map +1 -1
- package/dist/alpha/components/TemplateListPage/RegisterExistingButton.esm.js.map +1 -1
- package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js.map +1 -1
- package/dist/alpha/components/TemplateWizardPage/TemplateWizardPage.esm.js +2 -2
- package/dist/alpha/components/TemplateWizardPage/TemplateWizardPage.esm.js.map +1 -1
- package/dist/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js.map +1 -1
- package/dist/alpha/components/TemplatesSubPage.esm.js +16 -2
- package/dist/alpha/components/TemplatesSubPage.esm.js.map +1 -1
- package/dist/alpha/extensions.esm.js +4 -1
- package/dist/alpha/extensions.esm.js.map +1 -1
- package/dist/alpha/fields/EntityNamePicker.esm.js.map +1 -1
- package/dist/alpha/fields/EntityPicker.esm.js.map +1 -1
- package/dist/alpha/fields/EntityTagsPicker.esm.js.map +1 -1
- package/dist/alpha/fields/MultiEntityPicker.esm.js.map +1 -1
- package/dist/alpha/fields/MyGroupsPicker.esm.js.map +1 -1
- package/dist/alpha/fields/OwnedEntityPicker.esm.js.map +1 -1
- package/dist/alpha/fields/OwnerPicker.esm.js.map +1 -1
- package/dist/alpha/fields/RepoBranchPicker.esm.js.map +1 -1
- package/dist/alpha/fields/RepoOwnerPicker.esm.js.map +1 -1
- package/dist/alpha/fields/RepoUrlPicker.esm.js.map +1 -1
- package/dist/alpha/formFieldsApi.esm.js.map +1 -1
- package/dist/alpha/hooks/useFormDecorators.esm.js.map +1 -1
- package/dist/alpha/hooks/useScaffolderTemplateIconLinkProps.esm.js.map +1 -1
- package/dist/alpha/lib/createGroupsWithOther.esm.js.map +1 -1
- package/dist/alpha/plugin.esm.js.map +1 -1
- package/dist/alpha.d.ts +2 -0
- package/dist/alpha.esm.js.map +1 -1
- package/dist/api.esm.js.map +1 -1
- package/dist/components/ActionsPage/ActionsPage.esm.js +3 -3
- package/dist/components/ActionsPage/ActionsPage.esm.js.map +1 -1
- package/dist/components/FileBrowser/FileBrowser.esm.js.map +1 -1
- package/dist/components/ListTasksPage/ListTasksPage.esm.js +4 -4
- package/dist/components/ListTasksPage/ListTasksPage.esm.js.map +1 -1
- package/dist/components/ListTasksPage/OwnerListPicker.esm.js.map +1 -1
- package/dist/components/ListTasksPage/columns/CreatedAtColumn.esm.js.map +1 -1
- package/dist/components/ListTasksPage/columns/OwnerEntityColumn.esm.js.map +1 -1
- package/dist/components/ListTasksPage/columns/TaskStatusColumn.esm.js.map +1 -1
- package/dist/components/ListTasksPage/columns/TemplateTitleColumn.esm.js.map +1 -1
- package/dist/components/OngoingTask/ContextMenu.esm.js.map +1 -1
- package/dist/components/OngoingTask/OngoingTask.esm.js +3 -3
- package/dist/components/OngoingTask/OngoingTask.esm.js.map +1 -1
- package/dist/components/OngoingTask/OngoingTaskContextMenu.esm.js.map +1 -1
- package/dist/components/RenderSchema/RenderSchema.esm.js.map +1 -1
- package/dist/components/Router/Router.esm.js.map +1 -1
- package/dist/components/ScaffolderUsageExamplesTable/ScaffolderUsageExamplesTable.esm.js.map +1 -1
- package/dist/components/TemplateTypePicker/TemplateTypePicker.esm.js.map +1 -1
- package/dist/components/TemplatingExtensionsPage/TemplateFilters.esm.js.map +1 -1
- package/dist/components/TemplatingExtensionsPage/TemplateGlobals.esm.js.map +1 -1
- package/dist/components/TemplatingExtensionsPage/TemplatingExtensionsPage.esm.js.map +1 -1
- package/dist/components/TemplatingExtensionsPage/functionArgs.esm.js.map +1 -1
- package/dist/components/TemplatingExtensionsPage/navigation.esm.js.map +1 -1
- package/dist/components/fields/Autocomplete/Autocomplete.esm.js.map +1 -1
- package/dist/components/fields/EntityNamePicker/EntityNamePicker.esm.js.map +1 -1
- package/dist/components/fields/EntityNamePicker/schema.esm.js.map +1 -1
- package/dist/components/fields/EntityNamePicker/validation.esm.js.map +1 -1
- package/dist/components/fields/EntityPicker/EntityPicker.esm.js.map +1 -1
- package/dist/components/fields/EntityPicker/schema.esm.js.map +1 -1
- package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js +2 -2
- package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js.map +1 -1
- package/dist/components/fields/EntityTagsPicker/schema.esm.js.map +1 -1
- package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js.map +1 -1
- package/dist/components/fields/MultiEntityPicker/schema.esm.js.map +1 -1
- package/dist/components/fields/MyGroupsPicker/MyGroupsPicker.esm.js.map +1 -1
- package/dist/components/fields/MyGroupsPicker/schema.esm.js.map +1 -1
- package/dist/components/fields/OwnedEntityPicker/OwnedEntityPicker.esm.js.map +1 -1
- package/dist/components/fields/OwnedEntityPicker/schema.esm.js.map +1 -1
- package/dist/components/fields/OwnerPicker/OwnerPicker.esm.js.map +1 -1
- package/dist/components/fields/OwnerPicker/schema.esm.js.map +1 -1
- package/dist/components/fields/RepoBranchPicker/BitbucketRepoBranchPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoBranchPicker/DefaultRepoBranchPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoBranchPicker/GitHubRepoBranchPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoBranchPicker/RepoBranchPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoBranchPicker/schema.esm.js.map +1 -1
- package/dist/components/fields/RepoOwnerPicker/DefaultRepoOwnerPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoOwnerPicker/GitHubRepoOwnerPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoOwnerPicker/GitLabRepoOwnerPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoOwnerPicker/RepoOwnerPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoOwnerPicker/schema.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js +11 -9
- package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js +10 -8
- package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js +12 -5
- package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js +17 -9
- package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js +21 -9
- package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js +21 -10
- package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js +29 -7
- package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/RepoUrlPickerHost.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js +83 -46
- package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/schema.esm.js +7 -0
- package/dist/components/fields/RepoUrlPicker/schema.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/utils.esm.js.map +1 -1
- package/dist/components/fields/RepoUrlPicker/validation.esm.js.map +1 -1
- package/dist/components/fields/SecretInput/SecretInput.esm.js.map +1 -1
- package/dist/components/fields/VirtualizedListbox.esm.js +1 -1
- package/dist/components/fields/VirtualizedListbox.esm.js.map +1 -1
- package/dist/components/fields/buiChipStyles.esm.js.map +1 -1
- package/dist/components/fields/scaffolderFieldOverrides.module.css.esm.js.map +1 -1
- package/dist/components/fields/utils.esm.js.map +1 -1
- package/dist/deprecated.esm.js.map +1 -1
- package/dist/extensions/default.esm.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/lib/download/helpers.esm.js.map +1 -1
- package/dist/lib/filesystem/WebFileSystemAccess.esm.js.map +1 -1
- package/dist/lib/filesystem/WebFileSystemStore.esm.js.map +1 -1
- package/dist/lib/filesystem/createExampleTemplate.esm.js.map +1 -1
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -1
- package/dist/packages/opaque-internal/src/OpaqueType.esm.js.map +1 -1
- package/dist/packages/scaffolder-internal/src/wiring/InternalFormDecorator.esm.js.map +1 -1
- package/dist/packages/scaffolder-internal/src/wiring/InternalFormField.esm.js.map +1 -1
- package/dist/plugin.esm.js.map +1 -1
- package/dist/plugins/scaffolder/package.json.esm.js +1 -1
- package/dist/plugins/scaffolder/package.json.esm.js.map +1 -1
- package/dist/routes.esm.js.map +1 -1
- package/dist/translation.esm.js.map +1 -1
- package/package.json +25 -25
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formFieldsApi.esm.js","sources":["../../src/alpha/formFieldsApi.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ApiBlueprint,\n appTreeApiRef,\n createExtensionInput,\n} from '@backstage/frontend-plugin-api';\nimport {\n FormFieldBlueprint,\n formFieldsApiRef,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { OpaqueFormField } from '@internal/scaffolder';\n\nexport const formFieldsApi = ApiBlueprint.makeWithOverrides({\n name: 'form-fields',\n inputs: {\n formFields: createExtensionInput([\n FormFieldBlueprint.dataRefs.formFieldLoader,\n ]),\n },\n factory(originalFactory, { inputs }) {\n const formFieldLoaders = inputs.formFields.map(e =>\n e.get(FormFieldBlueprint.dataRefs.formFieldLoader),\n );\n\n return originalFactory(defineParams =>\n defineParams({\n api: formFieldsApiRef,\n deps: { appTreeApi: appTreeApiRef },\n factory: ({ appTreeApi }) => ({\n async loadFormFields() {\n const pageFormFieldLoaders = getPageFormFieldLoaders(appTreeApi);\n\n const formFields = await Promise.all(\n [...formFieldLoaders, ...pageFormFieldLoaders].map(loader =>\n loader(),\n ),\n );\n\n return formFields.map(OpaqueFormField.toInternal);\n },\n }),\n }),\n );\n },\n});\n\nfunction getPageFormFieldLoaders(appTreeApi: typeof appTreeApiRef.T) {\n const { tree } = appTreeApi.getTree();\n const pageNode = tree.nodes.get('page:scaffolder');\n if (!pageNode?.instance) {\n return [];\n }\n const formFieldNodes = pageNode.edges.attachments.get('formFields') ?? [];\n return formFieldNodes.flatMap(node => {\n if (!node.instance) {\n return [];\n }\n const loader = node.instance.getData(\n FormFieldBlueprint.dataRefs.formFieldLoader,\n );\n return loader ? [loader] : [];\n });\n}\n\nexport {\n formFieldsApiRef,\n type ScaffolderFormFieldsApi,\n} from '@backstage/plugin-scaffolder-react/alpha';\n"],"names":[],"mappings":";;;;;;AA2BO,MAAM,aAAA,GAAgB,aAAa,iBAAA,CAAkB;AAAA,EAC1D,IAAA,EAAM,aAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,YAAY,oBAAA,CAAqB;AAAA,MAC/B,mBAAmB,QAAA,CAAS;AAAA,KAC7B;AAAA,GACH;AAAA,EACA,OAAA,CAAQ,eAAA,EAAiB,EAAE,MAAA,EAAO,EAAG;AACnC,IAAA,MAAM,gBAAA,GAAmB,OAAO,UAAA,CAAW,GAAA;AAAA,MAAI,CAAA,CAAA,KAC7C,CAAA,CAAE,GAAA,CAAI,kBAAA,CAAmB,SAAS,eAAe;AAAA,KACnD;AAEA,IAAA,OAAO,eAAA;AAAA,MAAgB,kBACrB,YAAA,CAAa;AAAA,QACX,GAAA,EAAK,gBAAA;AAAA,QACL,IAAA,EAAM,EAAE,UAAA,EAAY,aAAA,EAAc;AAAA,QAClC,OAAA,EAAS,CAAC,EAAE,UAAA,EAAW,MAAO;AAAA,UAC5B,MAAM,cAAA,GAAiB;AACrB,YAAA,MAAM,oBAAA,GAAuB,wBAAwB,UAAU,CAAA;AAE/D,YAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,GAAA;AAAA,cAC/B,CAAC,GAAG,gBAAA,EAAkB,GAAG,oBAAoB,CAAA,CAAE,GAAA;AAAA,gBAAI,YACjD,MAAA;AAAO;AACT,aACF;AAEA,YAAA,OAAO,UAAA,CAAW,GAAA,CAAI,eAAA,CAAgB,UAAU,CAAA;AAAA,UAClD;AAAA,SACF;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;AAED,SAAS,wBAAwB,UAAA,EAAoC;AACnE,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,UAAA,CAAW,OAAA,EAAQ;AACpC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,iBAAiB,CAAA;AACjD,EAAA,IAAI,CAAC,UAAU,QAAA,EAAU;AACvB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,iBAAiB,QAAA,CAAS,KAAA,CAAM,YAAY,GAAA,CAAI,YAAY,KAAK,EAAC;AACxE,EAAA,OAAO,cAAA,CAAe,QAAQ,CAAA,IAAA,KAAQ;AACpC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS,OAAA;AAAA,MAC3B,mBAAmB,QAAA,CAAS;AAAA,KAC9B;AACA,IAAA,OAAO,MAAA,GAAS,CAAC,MAAM,CAAA,GAAI,EAAC;AAAA,EAC9B,CAAC,CAAA;AACH
|
|
1
|
+
{"version":3,"file":"formFieldsApi.esm.js","sources":["../../src/alpha/formFieldsApi.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ApiBlueprint,\n appTreeApiRef,\n createExtensionInput,\n} from '@backstage/frontend-plugin-api';\nimport {\n FormFieldBlueprint,\n formFieldsApiRef,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { OpaqueFormField } from '@internal/scaffolder';\n\nexport const formFieldsApi = ApiBlueprint.makeWithOverrides({\n name: 'form-fields',\n inputs: {\n formFields: createExtensionInput([\n FormFieldBlueprint.dataRefs.formFieldLoader,\n ]),\n },\n factory(originalFactory, { inputs }) {\n const formFieldLoaders = inputs.formFields.map(e =>\n e.get(FormFieldBlueprint.dataRefs.formFieldLoader),\n );\n\n return originalFactory(defineParams =>\n defineParams({\n api: formFieldsApiRef,\n deps: { appTreeApi: appTreeApiRef },\n factory: ({ appTreeApi }) => ({\n async loadFormFields() {\n const pageFormFieldLoaders = getPageFormFieldLoaders(appTreeApi);\n\n const formFields = await Promise.all(\n [...formFieldLoaders, ...pageFormFieldLoaders].map(loader =>\n loader(),\n ),\n );\n\n return formFields.map(OpaqueFormField.toInternal);\n },\n }),\n }),\n );\n },\n});\n\nfunction getPageFormFieldLoaders(appTreeApi: typeof appTreeApiRef.T) {\n const { tree } = appTreeApi.getTree();\n const pageNode = tree.nodes.get('page:scaffolder');\n if (!pageNode?.instance) {\n return [];\n }\n const formFieldNodes = pageNode.edges.attachments.get('formFields') ?? [];\n return formFieldNodes.flatMap(node => {\n if (!node.instance) {\n return [];\n }\n const loader = node.instance.getData(\n FormFieldBlueprint.dataRefs.formFieldLoader,\n );\n return loader ? [loader] : [];\n });\n}\n\nexport {\n formFieldsApiRef,\n type ScaffolderFormFieldsApi,\n} from '@backstage/plugin-scaffolder-react/alpha';\n"],"names":[],"mappings":";;;;;;AA2BO,MAAM,aAAA,GAAgB,aAAa,iBAAA,CAAkB;AAAA,EAC1D,IAAA,EAAM,aAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,YAAY,oBAAA,CAAqB;AAAA,MAC/B,mBAAmB,QAAA,CAAS;AAAA,KAC7B;AAAA,GACH;AAAA,EACA,OAAA,CAAQ,eAAA,EAAiB,EAAE,MAAA,EAAO,EAAG;AACnC,IAAA,MAAM,gBAAA,GAAmB,OAAO,UAAA,CAAW,GAAA;AAAA,MAAI,CAAA,CAAA,KAC7C,CAAA,CAAE,GAAA,CAAI,kBAAA,CAAmB,SAAS,eAAe;AAAA,KACnD;AAEA,IAAA,OAAO,eAAA;AAAA,MAAgB,kBACrB,YAAA,CAAa;AAAA,QACX,GAAA,EAAK,gBAAA;AAAA,QACL,IAAA,EAAM,EAAE,UAAA,EAAY,aAAA,EAAc;AAAA,QAClC,OAAA,EAAS,CAAC,EAAE,UAAA,EAAW,MAAO;AAAA,UAC5B,MAAM,cAAA,GAAiB;AACrB,YAAA,MAAM,oBAAA,GAAuB,wBAAwB,UAAU,CAAA;AAE/D,YAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,GAAA;AAAA,cAC/B,CAAC,GAAG,gBAAA,EAAkB,GAAG,oBAAoB,CAAA,CAAE,GAAA;AAAA,gBAAI,YACjD,MAAA;AAAO;AACT,aACF;AAEA,YAAA,OAAO,UAAA,CAAW,GAAA,CAAI,eAAA,CAAgB,UAAU,CAAA;AAAA,UAClD;AAAA,SACF;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;AAED,SAAS,wBAAwB,UAAA,EAAoC;AACnE,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,UAAA,CAAW,OAAA,EAAQ;AACpC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,iBAAiB,CAAA;AACjD,EAAA,IAAI,CAAC,UAAU,QAAA,EAAU;AACvB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,iBAAiB,QAAA,CAAS,KAAA,CAAM,YAAY,GAAA,CAAI,YAAY,KAAK,EAAC;AACxE,EAAA,OAAO,cAAA,CAAe,QAAQ,CAAA,IAAA,KAAQ;AACpC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS,OAAA;AAAA,MAC3B,mBAAmB,QAAA,CAAS;AAAA,KAC9B;AACA,IAAA,OAAO,MAAA,GAAS,CAAC,MAAM,CAAA,GAAI,EAAC;AAAA,EAC9B,CAAC,CAAA;AACH;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormDecorators.esm.js","sources":["../../../src/alpha/hooks/useFormDecorators.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { errorApiRef, useApi, useApiHolder } from '@backstage/core-plugin-api';\nimport { formDecoratorsApiRef } from '../api/ref';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useCallback, useMemo } from 'react';\nimport { ScaffolderFormDecoratorContext } from '@backstage/plugin-scaffolder-react/alpha';\nimport { OpaqueFormDecorator } from '@internal/scaffolder';\nimport { TemplateParameterSchema } from '@backstage/plugin-scaffolder-react';\nimport { JsonObject, JsonValue } from '@backstage/types';\nimport { z } from 'zod/v3';\n\n/** @internal */\ntype BoundFieldDecorator = {\n decorator: (ctx: ScaffolderFormDecoratorContext) => Promise<void>;\n};\n\nexport const useFormDecorators = () => {\n const formDecoratorsApi = useApi(formDecoratorsApiRef);\n const errorApi = useApi(errorApiRef);\n const { value: decorators } = useAsync(\n () => formDecoratorsApi.getFormDecorators(),\n [],\n );\n const apiHolder = useApiHolder();\n\n const boundDecorators = useMemo(() => {\n const decoratorsMap = new Map<string, BoundFieldDecorator>();\n\n for (const decorator of decorators ?? []) {\n try {\n const {\n decorator: decoratorFn,\n deps,\n schema,\n } = OpaqueFormDecorator.toInternal(decorator);\n\n const resolvedDeps = Object.entries(deps ?? {}).map(([key, value]) => {\n const api = apiHolder.get(value);\n if (!api) {\n throw new Error(\n `Failed to resolve apiRef ${value.id} for form decorator ${decorator.id} it will be disabled`,\n );\n }\n return [key, api];\n });\n\n const inputSchema = schema?.input\n ? z.object(\n Object.fromEntries(\n Object.entries(schema.input).map(([key, build]) => [\n key,\n build(z),\n ]),\n ),\n )\n : undefined;\n\n decoratorsMap.set(decorator.id, {\n decorator: async ctx => {\n let input: JsonObject = ctx.input;\n if (inputSchema) {\n const parsed = inputSchema.safeParse(ctx.input);\n if (!parsed.success) {\n errorApi.post(\n new Error(\n `Invalid input for form decorator ${decorator.id}: ${parsed.error.message}`,\n ),\n );\n return;\n }\n input = parsed.data as JsonObject;\n }\n await decoratorFn(\n { ...ctx, input },\n Object.fromEntries(resolvedDeps),\n );\n },\n });\n } catch (ex) {\n errorApi.post(ex);\n return undefined;\n }\n }\n return decoratorsMap;\n }, [apiHolder, decorators, errorApi]);\n\n const run = useCallback(\n async (opts: {\n formState: Record<string, JsonValue>;\n secrets: Record<string, string>;\n manifest?: TemplateParameterSchema;\n }) => {\n let formState: Record<string, JsonValue> = { ...opts.formState };\n let secrets: Record<string, string> = { ...opts.secrets };\n\n const formDecorators =\n opts.manifest?.formDecorators ??\n opts.manifest?.EXPERIMENTAL_formDecorators;\n if (formDecorators) {\n // for each of the form decorators, go and call the decorator with the context\n await Promise.all(\n formDecorators.map(async decorator => {\n const formDecorator = boundDecorators?.get(decorator.id);\n if (!formDecorator) {\n errorApi.post(\n new Error(`Failed to find form decorator ${decorator.id}`),\n );\n return;\n }\n\n await formDecorator.decorator({\n setSecrets: (\n handler: (\n oldState: Record<string, string>,\n ) => Record<string, string>,\n ) => {\n secrets = { ...handler(secrets) };\n },\n setFormState: (\n handler: (\n oldState: Record<string, JsonValue>,\n ) => Record<string, JsonValue>,\n ) => {\n formState = { ...handler(formState) };\n },\n formState,\n input: decorator.input ?? {},\n });\n }),\n );\n }\n\n return { formState, secrets };\n },\n [boundDecorators, errorApi],\n );\n\n return useMemo(\n () => ({\n run,\n }),\n [run],\n );\n};\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"useFormDecorators.esm.js","sources":["../../../src/alpha/hooks/useFormDecorators.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { errorApiRef, useApi, useApiHolder } from '@backstage/core-plugin-api';\nimport { formDecoratorsApiRef } from '../api/ref';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useCallback, useMemo } from 'react';\nimport { ScaffolderFormDecoratorContext } from '@backstage/plugin-scaffolder-react/alpha';\nimport { OpaqueFormDecorator } from '@internal/scaffolder';\nimport { TemplateParameterSchema } from '@backstage/plugin-scaffolder-react';\nimport { JsonObject, JsonValue } from '@backstage/types';\nimport { z } from 'zod/v3';\n\n/** @internal */\ntype BoundFieldDecorator = {\n decorator: (ctx: ScaffolderFormDecoratorContext) => Promise<void>;\n};\n\nexport const useFormDecorators = () => {\n const formDecoratorsApi = useApi(formDecoratorsApiRef);\n const errorApi = useApi(errorApiRef);\n const { value: decorators } = useAsync(\n () => formDecoratorsApi.getFormDecorators(),\n [],\n );\n const apiHolder = useApiHolder();\n\n const boundDecorators = useMemo(() => {\n const decoratorsMap = new Map<string, BoundFieldDecorator>();\n\n for (const decorator of decorators ?? []) {\n try {\n const {\n decorator: decoratorFn,\n deps,\n schema,\n } = OpaqueFormDecorator.toInternal(decorator);\n\n const resolvedDeps = Object.entries(deps ?? {}).map(([key, value]) => {\n const api = apiHolder.get(value);\n if (!api) {\n throw new Error(\n `Failed to resolve apiRef ${value.id} for form decorator ${decorator.id} it will be disabled`,\n );\n }\n return [key, api];\n });\n\n const inputSchema = schema?.input\n ? z.object(\n Object.fromEntries(\n Object.entries(schema.input).map(([key, build]) => [\n key,\n build(z),\n ]),\n ),\n )\n : undefined;\n\n decoratorsMap.set(decorator.id, {\n decorator: async ctx => {\n let input: JsonObject = ctx.input;\n if (inputSchema) {\n const parsed = inputSchema.safeParse(ctx.input);\n if (!parsed.success) {\n errorApi.post(\n new Error(\n `Invalid input for form decorator ${decorator.id}: ${parsed.error.message}`,\n ),\n );\n return;\n }\n input = parsed.data as JsonObject;\n }\n await decoratorFn(\n { ...ctx, input },\n Object.fromEntries(resolvedDeps),\n );\n },\n });\n } catch (ex) {\n errorApi.post(ex);\n return undefined;\n }\n }\n return decoratorsMap;\n }, [apiHolder, decorators, errorApi]);\n\n const run = useCallback(\n async (opts: {\n formState: Record<string, JsonValue>;\n secrets: Record<string, string>;\n manifest?: TemplateParameterSchema;\n }) => {\n let formState: Record<string, JsonValue> = { ...opts.formState };\n let secrets: Record<string, string> = { ...opts.secrets };\n\n const formDecorators =\n opts.manifest?.formDecorators ??\n opts.manifest?.EXPERIMENTAL_formDecorators;\n if (formDecorators) {\n // for each of the form decorators, go and call the decorator with the context\n await Promise.all(\n formDecorators.map(async decorator => {\n const formDecorator = boundDecorators?.get(decorator.id);\n if (!formDecorator) {\n errorApi.post(\n new Error(`Failed to find form decorator ${decorator.id}`),\n );\n return;\n }\n\n await formDecorator.decorator({\n setSecrets: (\n handler: (\n oldState: Record<string, string>,\n ) => Record<string, string>,\n ) => {\n secrets = { ...handler(secrets) };\n },\n setFormState: (\n handler: (\n oldState: Record<string, JsonValue>,\n ) => Record<string, JsonValue>,\n ) => {\n formState = { ...handler(formState) };\n },\n formState,\n input: decorator.input ?? {},\n });\n }),\n );\n }\n\n return { formState, secrets };\n },\n [boundDecorators, errorApi],\n );\n\n return useMemo(\n () => ({\n run,\n }),\n [run],\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScaffolderTemplateIconLinkProps.esm.js","sources":["../../../src/alpha/hooks/useScaffolderTemplateIconLinkProps.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DEFAULT_NAMESPACE } from '@backstage/catalog-model';\nimport { useApp, useRouteRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport { taskCreatePermission } from '@backstage/plugin-scaffolder-common/alpha';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nimport { scaffolderTranslationRef } from '../../translation';\nimport { selectedTemplateRouteRef } from '../../routes';\n\n// Note: If you update this hook, please also update the \"useScaffolderTemplateIconLinkProps\" hook\n// in the \"plugins/catalog/src/components/AboutCard/AboutCard.tsx\" file\n/** @alpha */\nexport function useScaffolderTemplateIconLinkProps() {\n const app = useApp();\n const { entity } = useEntity();\n const templateRoute = useRouteRef(selectedTemplateRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const Icon = app.getSystemIcon('scaffolder') ?? CreateComponentIcon;\n const { allowed: canCreateTemplateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n return {\n label: t('aboutCard.launchTemplate'),\n icon: <Icon />,\n disabled: !templateRoute || !canCreateTemplateTask,\n href:\n templateRoute &&\n templateRoute({\n templateName: entity.metadata.name,\n namespace: entity.metadata.namespace || DEFAULT_NAMESPACE,\n }),\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;AA+BO,SAAS,kCAAA,GAAqC;AACnD,EAAA,MAAM,MAAM,MAAA,EAAO;AACnB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,aAAA,GAAgB,YAAY,wBAAwB,CAAA;AAC1D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,YAAY,CAAA,IAAK,mBAAA;AAChD,EAAA,MAAM,EAAE,OAAA,EAAS,qBAAA,EAAsB,GAAI,aAAA,CAAc;AAAA,IACvD,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,IACnC,IAAA,sBAAO,IAAA,EAAA,EAAK,CAAA;AAAA,IACZ,QAAA,EAAU,CAAC,aAAA,IAAiB,CAAC,qBAAA;AAAA,IAC7B,IAAA,EACE,iBACA,aAAA,CAAc;AAAA,MACZ,YAAA,EAAc,OAAO,QAAA,CAAS,IAAA;AAAA,MAC9B,SAAA,EAAW,MAAA,CAAO,QAAA,CAAS,SAAA,IAAa;AAAA,KACzC;AAAA,GACL;AACF
|
|
1
|
+
{"version":3,"file":"useScaffolderTemplateIconLinkProps.esm.js","sources":["../../../src/alpha/hooks/useScaffolderTemplateIconLinkProps.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DEFAULT_NAMESPACE } from '@backstage/catalog-model';\nimport { useApp, useRouteRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport { taskCreatePermission } from '@backstage/plugin-scaffolder-common/alpha';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nimport { scaffolderTranslationRef } from '../../translation';\nimport { selectedTemplateRouteRef } from '../../routes';\n\n// Note: If you update this hook, please also update the \"useScaffolderTemplateIconLinkProps\" hook\n// in the \"plugins/catalog/src/components/AboutCard/AboutCard.tsx\" file\n/** @alpha */\nexport function useScaffolderTemplateIconLinkProps() {\n const app = useApp();\n const { entity } = useEntity();\n const templateRoute = useRouteRef(selectedTemplateRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const Icon = app.getSystemIcon('scaffolder') ?? CreateComponentIcon;\n const { allowed: canCreateTemplateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n return {\n label: t('aboutCard.launchTemplate'),\n icon: <Icon />,\n disabled: !templateRoute || !canCreateTemplateTask,\n href:\n templateRoute &&\n templateRoute({\n templateName: entity.metadata.name,\n namespace: entity.metadata.namespace || DEFAULT_NAMESPACE,\n }),\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;AA+BO,SAAS,kCAAA,GAAqC;AACnD,EAAA,MAAM,MAAM,MAAA,EAAO;AACnB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,aAAA,GAAgB,YAAY,wBAAwB,CAAA;AAC1D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,YAAY,CAAA,IAAK,mBAAA;AAChD,EAAA,MAAM,EAAE,OAAA,EAAS,qBAAA,EAAsB,GAAI,aAAA,CAAc;AAAA,IACvD,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,IACnC,IAAA,sBAAO,IAAA,EAAA,EAAK,CAAA;AAAA,IACZ,QAAA,EAAU,CAAC,aAAA,IAAiB,CAAC,qBAAA;AAAA,IAC7B,IAAA,EACE,iBACA,aAAA,CAAc;AAAA,MACZ,YAAA,EAAc,OAAO,QAAA,CAAS,IAAA;AAAA,MAC9B,SAAA,EAAW,MAAA,CAAO,QAAA,CAAS,SAAA,IAAa;AAAA,KACzC;AAAA,GACL;AACF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createGroupsWithOther.esm.js","sources":["../../../src/alpha/lib/createGroupsWithOther.ts"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react';\n\n/**\n * Appends an \"Other\" group matching templates not matched by any of the\n * configured groups. The `otherTitle` should already be translated.\n */\nexport const createGroupsWithOther = (\n groups: TemplateGroupFilter[],\n otherTitle: string,\n): TemplateGroupFilter[] => {\n const baseGroups = [...groups];\n return [\n ...baseGroups,\n {\n title: otherTitle,\n filter: e => !baseGroups.some(({ filter }) => filter(e)),\n },\n ];\n};\n"],"names":[],"mappings":"AAsBO,MAAM,qBAAA,GAAwB,CACnC,MAAA,EACA,UAAA,KAC0B;AAC1B,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,MAAM,CAAA;AAC7B,EAAA,OAAO;AAAA,IACL,GAAG,UAAA;AAAA,IACH;AAAA,MACE,KAAA,EAAO,UAAA;AAAA,MACP,MAAA,EAAQ,CAAA,CAAA,KAAK,CAAC,UAAA,CAAW,IAAA,CAAK,CAAC,EAAE,MAAA,EAAO,KAAM,MAAA,CAAO,CAAC,CAAC;AAAA;AACzD,GACF;AACF
|
|
1
|
+
{"version":3,"file":"createGroupsWithOther.esm.js","sources":["../../../src/alpha/lib/createGroupsWithOther.ts"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react';\n\n/**\n * Appends an \"Other\" group matching templates not matched by any of the\n * configured groups. The `otherTitle` should already be translated.\n */\nexport const createGroupsWithOther = (\n groups: TemplateGroupFilter[],\n otherTitle: string,\n): TemplateGroupFilter[] => {\n const baseGroups = [...groups];\n return [\n ...baseGroups,\n {\n title: otherTitle,\n filter: e => !baseGroups.some(({ filter }) => filter(e)),\n },\n ];\n};\n"],"names":[],"mappings":"AAsBO,MAAM,qBAAA,GAAwB,CACnC,MAAA,EACA,UAAA,KAC0B;AAC1B,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,MAAM,CAAA;AAC7B,EAAA,OAAO;AAAA,IACL,GAAG,UAAA;AAAA,IACH;AAAA,MACE,KAAA,EAAO,UAAA;AAAA,MACP,MAAA,EAAQ,CAAA,CAAA,KAAK,CAAC,UAAA,CAAW,IAAA,CAAK,CAAC,EAAE,MAAA,EAAO,KAAM,MAAA,CAAO,CAAC,CAAC;AAAA;AACzD,GACF;AACF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.esm.js","sources":["../../src/alpha/plugin.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createFrontendPlugin } from '@backstage/frontend-plugin-api';\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport {\n actionsRouteRef,\n editRouteRef,\n registerComponentRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n templatingExtensionsRouteRef,\n viewTechDocRouteRef,\n} from '../routes';\nimport {\n entityNamePickerFormField,\n entityPickerFormField,\n entityTagsPickerFormField,\n multiEntityPickerFormField,\n myGroupsPickerFormField,\n ownedEntityPickerFormField,\n ownerPickerFormField,\n repoBranchPickerFormField,\n repoOwnerPickerFormField,\n repoUrlPickerFormField,\n scaffolderApi,\n scaffolderPage,\n scaffolderTemplatesSubPage,\n scaffolderTasksSubPage,\n scaffolderActionsSubPage,\n scaffolderEditorSubPage,\n scaffolderTemplatingExtensionsSubPage,\n} from './extensions';\nimport { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { formFieldsApi } from './formFieldsApi';\nimport { formDecoratorsApi } from './api';\nimport { EntityIconLinkBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { useScaffolderTemplateIconLinkProps } from './hooks/useScaffolderTemplateIconLinkProps';\n\n/** @alpha */\nconst scaffolderEntityIconLink = EntityIconLinkBlueprint.make({\n name: 'launch-template',\n params: {\n filter: isTemplateEntityV1beta3,\n useProps: useScaffolderTemplateIconLinkProps,\n },\n});\n\n/** @alpha */\nexport default createFrontendPlugin({\n pluginId: 'scaffolder',\n title: 'Create',\n icon: <CreateComponentIcon fontSize=\"inherit\" />,\n info: { packageJson: () => import('../../package.json') },\n routes: {\n root: rootRouteRef,\n selectedTemplate: selectedTemplateRouteRef,\n ongoingTask: scaffolderTaskRouteRef,\n actions: actionsRouteRef,\n listTasks: scaffolderListTaskRouteRef,\n edit: editRouteRef,\n templatingExtensions: templatingExtensionsRouteRef,\n },\n externalRoutes: {\n registerComponent: registerComponentRouteRef,\n viewTechDoc: viewTechDocRouteRef,\n },\n extensions: [\n scaffolderApi,\n scaffolderPage,\n scaffolderTemplatesSubPage,\n scaffolderTasksSubPage,\n scaffolderActionsSubPage,\n scaffolderEditorSubPage,\n scaffolderTemplatingExtensionsSubPage,\n scaffolderEntityIconLink,\n formDecoratorsApi,\n formFieldsApi,\n repoUrlPickerFormField,\n entityNamePickerFormField,\n entityPickerFormField,\n ownerPickerFormField,\n entityTagsPickerFormField,\n multiEntityPickerFormField,\n myGroupsPickerFormField,\n ownedEntityPickerFormField,\n repoBranchPickerFormField,\n repoOwnerPickerFormField,\n ],\n});\n"],"names":[],"mappings":";;;;;;;;;;;;AAuDA,MAAM,wBAAA,GAA2B,wBAAwB,IAAA,CAAK;AAAA,EAC5D,IAAA,EAAM,iBAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,uBAAA;AAAA,IACR,QAAA,EAAU;AAAA;AAEd,CAAC,CAAA;AAGD,aAAe,oBAAA,CAAqB;AAAA,EAClC,QAAA,EAAU,YAAA;AAAA,EACV,KAAA,EAAO,QAAA;AAAA,EACP,IAAA,kBAAM,GAAA,CAAC,mBAAA,EAAA,EAAoB,QAAA,EAAS,SAAA,EAAU,CAAA;AAAA,EAC9C,MAAM,EAAE,WAAA,EAAa,MAAM,OAAO,2CAAoB,CAAA,EAAE;AAAA,EACxD,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,YAAA;AAAA,IACN,gBAAA,EAAkB,wBAAA;AAAA,IAClB,WAAA,EAAa,sBAAA;AAAA,IACb,OAAA,EAAS,eAAA;AAAA,IACT,SAAA,EAAW,0BAAA;AAAA,IACX,IAAA,EAAM,YAAA;AAAA,IACN,oBAAA,EAAsB;AAAA,GACxB;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,iBAAA,EAAmB,yBAAA;AAAA,IACnB,WAAA,EAAa;AAAA,GACf;AAAA,EACA,UAAA,EAAY;AAAA,IACV,aAAA;AAAA,IACA,cAAA;AAAA,IACA,0BAAA;AAAA,IACA,sBAAA;AAAA,IACA,wBAAA;AAAA,IACA,uBAAA;AAAA,IACA,qCAAA;AAAA,IACA,wBAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,sBAAA;AAAA,IACA,yBAAA;AAAA,IACA,qBAAA;AAAA,IACA,oBAAA;AAAA,IACA,yBAAA;AAAA,IACA,0BAAA;AAAA,IACA,uBAAA;AAAA,IACA,0BAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA;AAEJ,CAAC,CAAA
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../../src/alpha/plugin.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createFrontendPlugin } from '@backstage/frontend-plugin-api';\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport {\n actionsRouteRef,\n editRouteRef,\n registerComponentRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n templatingExtensionsRouteRef,\n viewTechDocRouteRef,\n} from '../routes';\nimport {\n entityNamePickerFormField,\n entityPickerFormField,\n entityTagsPickerFormField,\n multiEntityPickerFormField,\n myGroupsPickerFormField,\n ownedEntityPickerFormField,\n ownerPickerFormField,\n repoBranchPickerFormField,\n repoOwnerPickerFormField,\n repoUrlPickerFormField,\n scaffolderApi,\n scaffolderPage,\n scaffolderTemplatesSubPage,\n scaffolderTasksSubPage,\n scaffolderActionsSubPage,\n scaffolderEditorSubPage,\n scaffolderTemplatingExtensionsSubPage,\n} from './extensions';\nimport { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { formFieldsApi } from './formFieldsApi';\nimport { formDecoratorsApi } from './api';\nimport { EntityIconLinkBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { useScaffolderTemplateIconLinkProps } from './hooks/useScaffolderTemplateIconLinkProps';\n\n/** @alpha */\nconst scaffolderEntityIconLink = EntityIconLinkBlueprint.make({\n name: 'launch-template',\n params: {\n filter: isTemplateEntityV1beta3,\n useProps: useScaffolderTemplateIconLinkProps,\n },\n});\n\n/** @alpha */\nexport default createFrontendPlugin({\n pluginId: 'scaffolder',\n title: 'Create',\n icon: <CreateComponentIcon fontSize=\"inherit\" />,\n info: { packageJson: () => import('../../package.json') },\n routes: {\n root: rootRouteRef,\n selectedTemplate: selectedTemplateRouteRef,\n ongoingTask: scaffolderTaskRouteRef,\n actions: actionsRouteRef,\n listTasks: scaffolderListTaskRouteRef,\n edit: editRouteRef,\n templatingExtensions: templatingExtensionsRouteRef,\n },\n externalRoutes: {\n registerComponent: registerComponentRouteRef,\n viewTechDoc: viewTechDocRouteRef,\n },\n extensions: [\n scaffolderApi,\n scaffolderPage,\n scaffolderTemplatesSubPage,\n scaffolderTasksSubPage,\n scaffolderActionsSubPage,\n scaffolderEditorSubPage,\n scaffolderTemplatingExtensionsSubPage,\n scaffolderEntityIconLink,\n formDecoratorsApi,\n formFieldsApi,\n repoUrlPickerFormField,\n entityNamePickerFormField,\n entityPickerFormField,\n ownerPickerFormField,\n entityTagsPickerFormField,\n multiEntityPickerFormField,\n myGroupsPickerFormField,\n ownedEntityPickerFormField,\n repoBranchPickerFormField,\n repoOwnerPickerFormField,\n ],\n});\n"],"names":[],"mappings":";;;;;;;;;;;;AAuDA,MAAM,wBAAA,GAA2B,wBAAwB,IAAA,CAAK;AAAA,EAC5D,IAAA,EAAM,iBAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,uBAAA;AAAA,IACR,QAAA,EAAU;AAAA;AAEd,CAAC,CAAA;AAGD,aAAe,oBAAA,CAAqB;AAAA,EAClC,QAAA,EAAU,YAAA;AAAA,EACV,KAAA,EAAO,QAAA;AAAA,EACP,IAAA,kBAAM,GAAA,CAAC,mBAAA,EAAA,EAAoB,QAAA,EAAS,SAAA,EAAU,CAAA;AAAA,EAC9C,MAAM,EAAE,WAAA,EAAa,MAAM,OAAO,2CAAoB,CAAA,EAAE;AAAA,EACxD,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,YAAA;AAAA,IACN,gBAAA,EAAkB,wBAAA;AAAA,IAClB,WAAA,EAAa,sBAAA;AAAA,IACb,OAAA,EAAS,eAAA;AAAA,IACT,SAAA,EAAW,0BAAA;AAAA,IACX,IAAA,EAAM,YAAA;AAAA,IACN,oBAAA,EAAsB;AAAA,GACxB;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,iBAAA,EAAmB,yBAAA;AAAA,IACnB,WAAA,EAAa;AAAA,GACf;AAAA,EACA,UAAA,EAAY;AAAA,IACV,aAAA;AAAA,IACA,cAAA;AAAA,IACA,0BAAA;AAAA,IACA,sBAAA;AAAA,IACA,wBAAA;AAAA,IACA,uBAAA;AAAA,IACA,qCAAA;AAAA,IACA,wBAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,sBAAA;AAAA,IACA,yBAAA;AAAA,IACA,qBAAA;AAAA,IACA,oBAAA;AAAA,IACA,yBAAA;AAAA,IACA,0BAAA;AAAA,IACA,uBAAA;AAAA,IACA,0BAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA;AAEJ,CAAC,CAAA;;"}
|
package/dist/alpha.d.ts
CHANGED
|
@@ -433,6 +433,7 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
433
433
|
title: string;
|
|
434
434
|
filter: _backstage_filter_predicates.FilterPredicate;
|
|
435
435
|
}[] | undefined;
|
|
436
|
+
templateFilter: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
436
437
|
path: string | undefined;
|
|
437
438
|
title: string | undefined;
|
|
438
439
|
};
|
|
@@ -442,6 +443,7 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
442
443
|
title: string;
|
|
443
444
|
filter: _backstage_filter_predicates.FilterPredicate;
|
|
444
445
|
}[] | undefined;
|
|
446
|
+
templateFilter?: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
445
447
|
path?: string | undefined;
|
|
446
448
|
title?: string | undefined;
|
|
447
449
|
};
|
package/dist/alpha.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha/index.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport {\n type FormProps,\n type TemplateListPageProps,\n type TemplateWizardPageProps,\n type ScaffolderCustomFieldExplorerClassKey,\n type ScaffolderTemplateEditorClassKey,\n type ScaffolderTemplateFormPreviewerClassKey,\n} from './components';\n\nimport { scaffolderTranslationRef as _scaffolderTranslationRef } from '../translation';\n\n/**\n * @alpha\n * @deprecated Import from `@backstage/plugin-scaffolder` instead.\n */\nexport const scaffolderTranslationRef = _scaffolderTranslationRef;\nexport * from './api';\nexport {\n formFieldsApiRef,\n type ScaffolderFormFieldsApi,\n} from './formFieldsApi';\n\nexport { default } from './plugin';\n"],"names":["_scaffolderTranslationRef"],"mappings":";;;;;;;AA8BO,MAAM,wBAAA,GAA2BA
|
|
1
|
+
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha/index.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport {\n type FormProps,\n type TemplateListPageProps,\n type TemplateWizardPageProps,\n type ScaffolderCustomFieldExplorerClassKey,\n type ScaffolderTemplateEditorClassKey,\n type ScaffolderTemplateFormPreviewerClassKey,\n} from './components';\n\nimport { scaffolderTranslationRef as _scaffolderTranslationRef } from '../translation';\n\n/**\n * @alpha\n * @deprecated Import from `@backstage/plugin-scaffolder` instead.\n */\nexport const scaffolderTranslationRef = _scaffolderTranslationRef;\nexport * from './api';\nexport {\n formFieldsApiRef,\n type ScaffolderFormFieldsApi,\n} from './formFieldsApi';\n\nexport { default } from './plugin';\n"],"names":["_scaffolderTranslationRef"],"mappings":";;;;;;;AA8BO,MAAM,wBAAA,GAA2BA;;"}
|
package/dist/api.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.esm.js","sources":["../src/api.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { ScaffolderClient as _ScaffolderClient } from '@backstage/plugin-scaffolder-common';\n\n/**\n * An API to interact with the scaffolder backend.\n *\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-common#ScaffolderClient} instead as this has now been moved.\n */\nexport class ScaffolderClient extends _ScaffolderClient {}\n"],"names":["_ScaffolderClient"],"mappings":";;AAwBO,MAAM,yBAAyBA,kBAAA,CAAkB;AAAC
|
|
1
|
+
{"version":3,"file":"api.esm.js","sources":["../src/api.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { ScaffolderClient as _ScaffolderClient } from '@backstage/plugin-scaffolder-common';\n\n/**\n * An API to interact with the scaffolder backend.\n *\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-common#ScaffolderClient} instead as this has now been moved.\n */\nexport class ScaffolderClient extends _ScaffolderClient {}\n"],"names":["_ScaffolderClient"],"mappings":";;AAwBO,MAAM,yBAAyBA,kBAAA,CAAkB;AAAC;;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { jsxs,
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useRef, useEffect, useMemo } from 'react';
|
|
3
3
|
import useAsync from 'react-use/esm/useAsync';
|
|
4
4
|
import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { useApi, useRouteRef } from '@backstage/core-plugin-api';
|
|
6
|
+
import { ErrorPanel, EmptyState, MarkdownContent, Page, Header, Content } from '@backstage/core-components';
|
|
7
7
|
import { SearchField, List, ListRow, Flex, Text } from '@backstage/ui';
|
|
8
8
|
import { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';
|
|
9
9
|
import { useNavigate } from 'react-router-dom';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsPage.esm.js","sources":["../../../src/components/ActionsPage/ActionsPage.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, useMemo, useRef, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { Action, scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\n\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n MarkdownContent,\n Page,\n} from '@backstage/core-components';\nimport { Flex, List, ListRow, SearchField, Text } from '@backstage/ui';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport {\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\n\nfunction ActionDetail({ action }: { action: Action }) {\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const expanded = useState<Expanded>({});\n\n const partialSchemaRenderContext: Omit<SchemaRenderContext, 'parentId'> = {\n expanded,\n };\n\n const hasInput = !!action.schema?.input;\n const hasOutput = !!action.schema?.output;\n const hasExamples = !!action.examples;\n\n if (!hasInput && !hasOutput && !hasExamples) {\n return null;\n }\n\n return (\n <Flex direction=\"column\" gap=\"6\">\n {hasInput && (\n <Flex direction=\"column\" gap=\"2\">\n <Text as=\"h3\" variant=\"title-small\" weight=\"bold\">\n {t('actionsPage.action.input')}\n </Text>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.input`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.input}\n />\n </Flex>\n )}\n {hasOutput && (\n <Flex direction=\"column\" gap=\"2\">\n <Text as=\"h3\" variant=\"title-small\" weight=\"bold\">\n {t('actionsPage.action.output')}\n </Text>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.output}\n />\n </Flex>\n )}\n {hasExamples && (\n <Flex direction=\"column\" gap=\"2\">\n <Text as=\"h3\" variant=\"title-small\" weight=\"bold\">\n {t('actionsPage.action.examples')}\n </Text>\n <ScaffolderUsageExamplesTable examples={action.examples!} />\n </Flex>\n )}\n </Flex>\n );\n}\n\nexport const ActionPageContent = () => {\n const api = useApi(scaffolderApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const {\n loading,\n value: actions,\n error,\n } = useAsync(async () => {\n return api.listActions();\n }, [api]);\n\n const [selectedActionId, setSelectedActionId] = useState<\n string | undefined\n >();\n const [searchQuery, setSearchQuery] = useState('');\n const initialHashHandled = useRef(false);\n\n useEffect(() => {\n if (initialHashHandled.current || !actions) {\n return;\n }\n const hash = window.location.hash.slice(1);\n if (hash && actions.some(a => a.id === hash)) {\n initialHashHandled.current = true;\n setSelectedActionId(hash);\n requestAnimationFrame(() => {\n const row = document.querySelector(`[data-key=\"${CSS.escape(hash)}\"]`);\n if (row && typeof row.scrollIntoView === 'function') {\n row.scrollIntoView({ block: 'nearest' });\n }\n });\n }\n }, [actions]);\n\n const filteredActions = useMemo(() => {\n const nonLegacy =\n actions?.filter(action => !action.id.startsWith('legacy:')) ?? [];\n if (!searchQuery) {\n return nonLegacy;\n }\n const lowerQuery = searchQuery.toLowerCase();\n return nonLegacy.filter(\n action =>\n action.id.toLowerCase().includes(lowerQuery) ||\n action.description?.toLowerCase().includes(lowerQuery),\n );\n }, [actions, searchQuery]);\n\n const selectedAction = useMemo(\n () => filteredActions.find(a => a.id === selectedActionId),\n [filteredActions, selectedActionId],\n );\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: selectedAction ? '320px 1fr' : '1fr',\n gridTemplateRows: 'auto 1fr',\n gap: 24,\n }}\n >\n <SearchField\n aria-label={t('actionsPage.content.searchFieldPlaceholder')}\n placeholder={t('actionsPage.content.searchFieldPlaceholder')}\n value={searchQuery}\n onChange={setSearchQuery}\n />\n {!loading && !filteredActions.length ? (\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n ) : (\n <List\n aria-label={t('actionsPage.title')}\n selectionMode=\"single\"\n selectionBehavior=\"toggle\"\n selectedKeys={selectedActionId ? [selectedActionId] : []}\n style={{ minWidth: 0, overflow: 'hidden' }}\n onSelectionChange={selection => {\n if (selection === 'all') {\n return;\n }\n const selected = [...selection][0] as string | undefined;\n setSelectedActionId(prev => {\n const next = prev === selected ? undefined : selected;\n const hash = next ? `#${next}` : '';\n window.history.replaceState(\n null,\n '',\n `${window.location.pathname}${window.location.search}${hash}`,\n );\n return next;\n });\n }}\n >\n {filteredActions.map(action => (\n <ListRow\n key={action.id}\n id={action.id}\n textValue={action.id}\n description={action.description ?? undefined}\n >\n {action.id}\n </ListRow>\n ))}\n </List>\n )}\n {selectedAction && (\n <Flex\n direction=\"column\"\n gap=\"3\"\n style={{ gridColumn: 2, gridRow: '1 / -1', minWidth: 0 }}\n >\n <Flex direction=\"column\" gap=\"1\">\n <Text as=\"h2\" variant=\"title-medium\" weight=\"bold\">\n {selectedAction.id}\n </Text>\n {selectedAction.description && (\n <MarkdownContent content={selectedAction.description} />\n )}\n </Flex>\n <ActionDetail action={selectedAction} />\n </Flex>\n )}\n </div>\n );\n};\n\nexport type ActionsPageProps = {\n contextMenu?: {\n editor?: boolean;\n tasks?: boolean;\n create?: boolean;\n templatingExtensions?: boolean;\n };\n};\n\nexport const ActionsPage = (props: ActionsPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked: undefined,\n onTasksClicked:\n props?.contextMenu?.tasks !== false\n ? () => navigate(tasksLink())\n : undefined,\n onCreateClicked:\n props?.contextMenu?.create !== false\n ? () => navigate(createLink())\n : undefined,\n onTemplatingExtensionsClicked:\n props?.contextMenu?.templatingExtensions !== false\n ? () => navigate(templatingExtensionsLink())\n : undefined,\n };\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('actionsPage.pageTitle')}\n title={t('actionsPage.title')}\n subtitle={t('actionsPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ActionPageContent />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActionsPage.esm.js","sources":["../../../src/components/ActionsPage/ActionsPage.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, useMemo, useRef, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { Action, scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\n\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n MarkdownContent,\n Page,\n} from '@backstage/core-components';\nimport { Flex, List, ListRow, SearchField, Text } from '@backstage/ui';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport {\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\n\nfunction ActionDetail({ action }: { action: Action }) {\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const expanded = useState<Expanded>({});\n\n const partialSchemaRenderContext: Omit<SchemaRenderContext, 'parentId'> = {\n expanded,\n };\n\n const hasInput = !!action.schema?.input;\n const hasOutput = !!action.schema?.output;\n const hasExamples = !!action.examples;\n\n if (!hasInput && !hasOutput && !hasExamples) {\n return null;\n }\n\n return (\n <Flex direction=\"column\" gap=\"6\">\n {hasInput && (\n <Flex direction=\"column\" gap=\"2\">\n <Text as=\"h3\" variant=\"title-small\" weight=\"bold\">\n {t('actionsPage.action.input')}\n </Text>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.input`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.input}\n />\n </Flex>\n )}\n {hasOutput && (\n <Flex direction=\"column\" gap=\"2\">\n <Text as=\"h3\" variant=\"title-small\" weight=\"bold\">\n {t('actionsPage.action.output')}\n </Text>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.output}\n />\n </Flex>\n )}\n {hasExamples && (\n <Flex direction=\"column\" gap=\"2\">\n <Text as=\"h3\" variant=\"title-small\" weight=\"bold\">\n {t('actionsPage.action.examples')}\n </Text>\n <ScaffolderUsageExamplesTable examples={action.examples!} />\n </Flex>\n )}\n </Flex>\n );\n}\n\nexport const ActionPageContent = () => {\n const api = useApi(scaffolderApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const {\n loading,\n value: actions,\n error,\n } = useAsync(async () => {\n return api.listActions();\n }, [api]);\n\n const [selectedActionId, setSelectedActionId] = useState<\n string | undefined\n >();\n const [searchQuery, setSearchQuery] = useState('');\n const initialHashHandled = useRef(false);\n\n useEffect(() => {\n if (initialHashHandled.current || !actions) {\n return;\n }\n const hash = window.location.hash.slice(1);\n if (hash && actions.some(a => a.id === hash)) {\n initialHashHandled.current = true;\n setSelectedActionId(hash);\n requestAnimationFrame(() => {\n const row = document.querySelector(`[data-key=\"${CSS.escape(hash)}\"]`);\n if (row && typeof row.scrollIntoView === 'function') {\n row.scrollIntoView({ block: 'nearest' });\n }\n });\n }\n }, [actions]);\n\n const filteredActions = useMemo(() => {\n const nonLegacy =\n actions?.filter(action => !action.id.startsWith('legacy:')) ?? [];\n if (!searchQuery) {\n return nonLegacy;\n }\n const lowerQuery = searchQuery.toLowerCase();\n return nonLegacy.filter(\n action =>\n action.id.toLowerCase().includes(lowerQuery) ||\n action.description?.toLowerCase().includes(lowerQuery),\n );\n }, [actions, searchQuery]);\n\n const selectedAction = useMemo(\n () => filteredActions.find(a => a.id === selectedActionId),\n [filteredActions, selectedActionId],\n );\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: selectedAction ? '320px 1fr' : '1fr',\n gridTemplateRows: 'auto 1fr',\n gap: 24,\n }}\n >\n <SearchField\n aria-label={t('actionsPage.content.searchFieldPlaceholder')}\n placeholder={t('actionsPage.content.searchFieldPlaceholder')}\n value={searchQuery}\n onChange={setSearchQuery}\n />\n {!loading && !filteredActions.length ? (\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n ) : (\n <List\n aria-label={t('actionsPage.title')}\n selectionMode=\"single\"\n selectionBehavior=\"toggle\"\n selectedKeys={selectedActionId ? [selectedActionId] : []}\n style={{ minWidth: 0, overflow: 'hidden' }}\n onSelectionChange={selection => {\n if (selection === 'all') {\n return;\n }\n const selected = [...selection][0] as string | undefined;\n setSelectedActionId(prev => {\n const next = prev === selected ? undefined : selected;\n const hash = next ? `#${next}` : '';\n window.history.replaceState(\n null,\n '',\n `${window.location.pathname}${window.location.search}${hash}`,\n );\n return next;\n });\n }}\n >\n {filteredActions.map(action => (\n <ListRow\n key={action.id}\n id={action.id}\n textValue={action.id}\n description={action.description ?? undefined}\n >\n {action.id}\n </ListRow>\n ))}\n </List>\n )}\n {selectedAction && (\n <Flex\n direction=\"column\"\n gap=\"3\"\n style={{ gridColumn: 2, gridRow: '1 / -1', minWidth: 0 }}\n >\n <Flex direction=\"column\" gap=\"1\">\n <Text as=\"h2\" variant=\"title-medium\" weight=\"bold\">\n {selectedAction.id}\n </Text>\n {selectedAction.description && (\n <MarkdownContent content={selectedAction.description} />\n )}\n </Flex>\n <ActionDetail action={selectedAction} />\n </Flex>\n )}\n </div>\n );\n};\n\nexport type ActionsPageProps = {\n contextMenu?: {\n editor?: boolean;\n tasks?: boolean;\n create?: boolean;\n templatingExtensions?: boolean;\n };\n};\n\nexport const ActionsPage = (props: ActionsPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked: undefined,\n onTasksClicked:\n props?.contextMenu?.tasks !== false\n ? () => navigate(tasksLink())\n : undefined,\n onCreateClicked:\n props?.contextMenu?.create !== false\n ? () => navigate(createLink())\n : undefined,\n onTemplatingExtensionsClicked:\n props?.contextMenu?.templatingExtensions !== false\n ? () => navigate(templatingExtensionsLink())\n : undefined,\n };\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('actionsPage.pageTitle')}\n title={t('actionsPage.title')}\n subtitle={t('actionsPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ActionPageContent />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileBrowser.esm.js","sources":["../../../src/components/FileBrowser/FileBrowser.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useMemo } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport TreeView from '@material-ui/lab/TreeView';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport TreeItem from '@material-ui/lab/TreeItem';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n whiteSpace: 'nowrap',\n overflowY: 'auto',\n padding: theme.spacing(1),\n },\n}));\n\nexport type FileEntry =\n | {\n type: 'file';\n name: string;\n path: string;\n }\n | {\n type: 'directory';\n name: string;\n path: string;\n children: FileEntry[];\n };\n\nexport function parseFileEntries(paths: string[]): FileEntry[] {\n const root: FileEntry = {\n type: 'directory',\n name: '',\n path: '',\n children: [],\n };\n\n for (const path of paths.slice().sort()) {\n const parts = path.split('/');\n\n let current = root;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === '') {\n throw new Error(`Invalid path part: ''`);\n }\n\n const entryPath = parts.slice(0, i + 1).join('/');\n\n const existing = current.children.find(child => child.name === part);\n if (existing?.type === 'file') {\n throw new Error(`Duplicate filename at '${entryPath}'`);\n } else if (existing) {\n current = existing;\n } else {\n if (i < parts.length - 1) {\n const newEntry: FileEntry = {\n type: 'directory',\n name: part,\n path: entryPath,\n children: [],\n };\n const firstFileIndex = current.children.findIndex(\n child => child.type === 'file',\n );\n current.children.splice(firstFileIndex, 0, newEntry);\n current = newEntry;\n } else {\n current.children.push({\n type: 'file',\n name: part,\n path: entryPath,\n });\n }\n }\n }\n }\n\n return root.children;\n}\n\nfunction FileTreeItem({ entry }: { entry: FileEntry }) {\n if (entry.type === 'file') {\n return <TreeItem nodeId={entry.path} label={entry.name} />;\n }\n\n return (\n <TreeItem nodeId={entry.path} label={entry.name}>\n {entry.children.map(child => (\n <FileTreeItem key={child.path} entry={child} />\n ))}\n </TreeItem>\n );\n}\n\ninterface FileBrowserProps {\n /** A list of all filepaths to show, directories are separated with a `/` */\n filePaths: string[];\n /** The currently selected file */\n selected?: string;\n /** Callback for when a file is selected */\n onSelect?(filePath: string): void;\n}\n\n/** A simple file browser that allows you to select individual files */\nexport function FileBrowser(props: FileBrowserProps) {\n const classes = useStyles();\n\n const fileTree = useMemo(\n () => parseFileEntries(props.filePaths),\n [props.filePaths],\n );\n\n return (\n <TreeView\n selected={props.selected}\n className={classes.root}\n defaultCollapseIcon={<ExpandMoreIcon />}\n defaultExpandIcon={<ChevronRightIcon />}\n onNodeSelect={(_e: unknown, nodeId: string) => {\n if (props.onSelect && props.filePaths.includes(nodeId)) {\n props.onSelect(nodeId);\n }\n }}\n >\n {fileTree.map(entry => (\n <FileTreeItem key={entry.path} entry={entry} />\n ))}\n </TreeView>\n );\n}\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"FileBrowser.esm.js","sources":["../../../src/components/FileBrowser/FileBrowser.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useMemo } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport TreeView from '@material-ui/lab/TreeView';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport TreeItem from '@material-ui/lab/TreeItem';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n whiteSpace: 'nowrap',\n overflowY: 'auto',\n padding: theme.spacing(1),\n },\n}));\n\nexport type FileEntry =\n | {\n type: 'file';\n name: string;\n path: string;\n }\n | {\n type: 'directory';\n name: string;\n path: string;\n children: FileEntry[];\n };\n\nexport function parseFileEntries(paths: string[]): FileEntry[] {\n const root: FileEntry = {\n type: 'directory',\n name: '',\n path: '',\n children: [],\n };\n\n for (const path of paths.slice().sort()) {\n const parts = path.split('/');\n\n let current = root;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === '') {\n throw new Error(`Invalid path part: ''`);\n }\n\n const entryPath = parts.slice(0, i + 1).join('/');\n\n const existing = current.children.find(child => child.name === part);\n if (existing?.type === 'file') {\n throw new Error(`Duplicate filename at '${entryPath}'`);\n } else if (existing) {\n current = existing;\n } else {\n if (i < parts.length - 1) {\n const newEntry: FileEntry = {\n type: 'directory',\n name: part,\n path: entryPath,\n children: [],\n };\n const firstFileIndex = current.children.findIndex(\n child => child.type === 'file',\n );\n current.children.splice(firstFileIndex, 0, newEntry);\n current = newEntry;\n } else {\n current.children.push({\n type: 'file',\n name: part,\n path: entryPath,\n });\n }\n }\n }\n }\n\n return root.children;\n}\n\nfunction FileTreeItem({ entry }: { entry: FileEntry }) {\n if (entry.type === 'file') {\n return <TreeItem nodeId={entry.path} label={entry.name} />;\n }\n\n return (\n <TreeItem nodeId={entry.path} label={entry.name}>\n {entry.children.map(child => (\n <FileTreeItem key={child.path} entry={child} />\n ))}\n </TreeItem>\n );\n}\n\ninterface FileBrowserProps {\n /** A list of all filepaths to show, directories are separated with a `/` */\n filePaths: string[];\n /** The currently selected file */\n selected?: string;\n /** Callback for when a file is selected */\n onSelect?(filePath: string): void;\n}\n\n/** A simple file browser that allows you to select individual files */\nexport function FileBrowser(props: FileBrowserProps) {\n const classes = useStyles();\n\n const fileTree = useMemo(\n () => parseFileEntries(props.filePaths),\n [props.filePaths],\n );\n\n return (\n <TreeView\n selected={props.selected}\n className={classes.root}\n defaultCollapseIcon={<ExpandMoreIcon />}\n defaultExpandIcon={<ChevronRightIcon />}\n onNodeSelect={(_e: unknown, nodeId: string) => {\n if (props.onSelect && props.filePaths.includes(nodeId)) {\n props.onSelect(nodeId);\n }\n }}\n >\n {fileTree.map(entry => (\n <FileTreeItem key={entry.path} entry={entry} />\n ))}\n </TreeView>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Progress, ErrorPanel, EmptyState, Table, Link, Page, Header, Content } from '@backstage/core-components';
|
|
3
|
+
import { useApi, useRouteRef } from '@backstage/core-plugin-api';
|
|
4
4
|
import { CatalogFilterLayout } from '@backstage/plugin-catalog-react';
|
|
5
5
|
import useAsync from 'react-use/esm/useAsync';
|
|
6
6
|
import { useState } from 'react';
|
|
@@ -10,7 +10,7 @@ import { CreatedAtColumn } from './columns/CreatedAtColumn.esm.js';
|
|
|
10
10
|
import { OwnerEntityColumn } from './columns/OwnerEntityColumn.esm.js';
|
|
11
11
|
import { TaskStatusColumn } from './columns/TaskStatusColumn.esm.js';
|
|
12
12
|
import { TemplateTitleColumn } from './columns/TemplateTitleColumn.esm.js';
|
|
13
|
-
import { editRouteRef, actionsRouteRef,
|
|
13
|
+
import { rootRouteRef, editRouteRef, actionsRouteRef, templatingExtensionsRouteRef } from '../../routes.esm.js';
|
|
14
14
|
import { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';
|
|
15
15
|
import { useNavigate } from 'react-router-dom';
|
|
16
16
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListTasksPage.esm.js","sources":["../../../src/components/ListTasksPage/ListTasksPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n Page,\n Progress,\n Table,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { CatalogFilterLayout } from '@backstage/plugin-catalog-react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useState } from 'react';\nimport {\n scaffolderApiRef,\n ScaffolderTask,\n} from '@backstage/plugin-scaffolder-react';\nimport { OwnerListPicker } from './OwnerListPicker';\nimport {\n CreatedAtColumn,\n OwnerEntityColumn,\n TaskStatusColumn,\n TemplateTitleColumn,\n} from './columns';\nimport {\n actionsRouteRef,\n editRouteRef,\n rootRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nexport interface MyTaskPageProps {\n initiallySelectedFilter?: 'owned' | 'all';\n contextMenu?: {\n editor?: boolean;\n actions?: boolean;\n create?: boolean;\n templatingExtensions?: boolean;\n };\n}\n\nexport const ListTaskPageContent = (props: MyTaskPageProps) => {\n const { initiallySelectedFilter = 'owned' } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const [limit, setLimit] = useState(5);\n const [page, setPage] = useState(0);\n\n const scaffolderApi = useApi(scaffolderApiRef);\n const rootLink = useRouteRef(rootRouteRef);\n\n const [ownerFilter, setOwnerFilter] = useState(initiallySelectedFilter);\n const { value, loading, error } = useAsync(() => {\n if (scaffolderApi.listTasks) {\n return scaffolderApi.listTasks?.({\n filterByOwnership: ownerFilter,\n limit,\n offset: page * limit,\n });\n }\n\n // eslint-disable-next-line no-console\n console.warn(\n 'listTasks is not implemented in the scaffolderApi, please make sure to implement this method.',\n );\n\n return Promise.resolve({ tasks: [], totalTasks: 0 });\n }, [scaffolderApi, ownerFilter, limit, page]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <OwnerListPicker\n filter={ownerFilter}\n onSelectOwner={id => setOwnerFilter(id)}\n />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('listTaskPage.content.emptyState.title')}\n description={t('listTaskPage.content.emptyState.description')}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n );\n }\n\n return (\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <OwnerListPicker\n filter={ownerFilter}\n onSelectOwner={id => setOwnerFilter(id)}\n />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <Table<ScaffolderTask>\n onRowsPerPageChange={pageSize => {\n setPage(0);\n setLimit(pageSize);\n }}\n onPageChange={newPage => setPage(newPage)}\n options={{ pageSize: limit, emptyRowsWhenPaging: false }}\n data={value?.tasks ?? []}\n page={page}\n totalCount={value?.totalTasks ?? 0}\n title={t('listTaskPage.content.tableTitle')}\n columns={[\n {\n title: t('listTaskPage.content.tableCell.taskID'),\n field: 'id',\n render: row => (\n <Link to={`${rootLink()}/tasks/${row.id}`}>{row.id}</Link>\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.template'),\n field: 'spec.templateInfo.entity.metadata.title',\n render: row => (\n <TemplateTitleColumn\n entityRef={row.spec.templateInfo?.entityRef}\n />\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.created'),\n field: 'createdAt',\n render: row => <CreatedAtColumn createdAt={row.createdAt} />,\n },\n {\n title: t('listTaskPage.content.tableCell.owner'),\n field: 'createdBy',\n render: row => (\n <OwnerEntityColumn entityRef={row.spec?.user?.ref} />\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.status'),\n field: 'status',\n render: row => <TaskStatusColumn status={row.status} />,\n },\n ]}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n );\n};\n\nexport const ListTasksPage = (props: MyTaskPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const actionsLink = useRouteRef(actionsRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked:\n props?.contextMenu?.actions !== false\n ? () => navigate(actionsLink())\n : undefined,\n onTasksClicked: undefined,\n onCreateClicked:\n props?.contextMenu?.create !== false\n ? () => navigate(createLink())\n : undefined,\n onTemplatingExtensionsClicked:\n props?.contextMenu?.templatingExtensions !== false\n ? () => navigate(templatingExtensionsLink())\n : undefined,\n };\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('listTaskPage.pageTitle')}\n title={t('listTaskPage.title')}\n subtitle={t('listTaskPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ListTaskPageContent {...props} />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ListTasksPage.esm.js","sources":["../../../src/components/ListTasksPage/ListTasksPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n Page,\n Progress,\n Table,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { CatalogFilterLayout } from '@backstage/plugin-catalog-react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useState } from 'react';\nimport {\n scaffolderApiRef,\n ScaffolderTask,\n} from '@backstage/plugin-scaffolder-react';\nimport { OwnerListPicker } from './OwnerListPicker';\nimport {\n CreatedAtColumn,\n OwnerEntityColumn,\n TaskStatusColumn,\n TemplateTitleColumn,\n} from './columns';\nimport {\n actionsRouteRef,\n editRouteRef,\n rootRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nexport interface MyTaskPageProps {\n initiallySelectedFilter?: 'owned' | 'all';\n contextMenu?: {\n editor?: boolean;\n actions?: boolean;\n create?: boolean;\n templatingExtensions?: boolean;\n };\n}\n\nexport const ListTaskPageContent = (props: MyTaskPageProps) => {\n const { initiallySelectedFilter = 'owned' } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const [limit, setLimit] = useState(5);\n const [page, setPage] = useState(0);\n\n const scaffolderApi = useApi(scaffolderApiRef);\n const rootLink = useRouteRef(rootRouteRef);\n\n const [ownerFilter, setOwnerFilter] = useState(initiallySelectedFilter);\n const { value, loading, error } = useAsync(() => {\n if (scaffolderApi.listTasks) {\n return scaffolderApi.listTasks?.({\n filterByOwnership: ownerFilter,\n limit,\n offset: page * limit,\n });\n }\n\n // eslint-disable-next-line no-console\n console.warn(\n 'listTasks is not implemented in the scaffolderApi, please make sure to implement this method.',\n );\n\n return Promise.resolve({ tasks: [], totalTasks: 0 });\n }, [scaffolderApi, ownerFilter, limit, page]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <OwnerListPicker\n filter={ownerFilter}\n onSelectOwner={id => setOwnerFilter(id)}\n />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('listTaskPage.content.emptyState.title')}\n description={t('listTaskPage.content.emptyState.description')}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n );\n }\n\n return (\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <OwnerListPicker\n filter={ownerFilter}\n onSelectOwner={id => setOwnerFilter(id)}\n />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <Table<ScaffolderTask>\n onRowsPerPageChange={pageSize => {\n setPage(0);\n setLimit(pageSize);\n }}\n onPageChange={newPage => setPage(newPage)}\n options={{ pageSize: limit, emptyRowsWhenPaging: false }}\n data={value?.tasks ?? []}\n page={page}\n totalCount={value?.totalTasks ?? 0}\n title={t('listTaskPage.content.tableTitle')}\n columns={[\n {\n title: t('listTaskPage.content.tableCell.taskID'),\n field: 'id',\n render: row => (\n <Link to={`${rootLink()}/tasks/${row.id}`}>{row.id}</Link>\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.template'),\n field: 'spec.templateInfo.entity.metadata.title',\n render: row => (\n <TemplateTitleColumn\n entityRef={row.spec.templateInfo?.entityRef}\n />\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.created'),\n field: 'createdAt',\n render: row => <CreatedAtColumn createdAt={row.createdAt} />,\n },\n {\n title: t('listTaskPage.content.tableCell.owner'),\n field: 'createdBy',\n render: row => (\n <OwnerEntityColumn entityRef={row.spec?.user?.ref} />\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.status'),\n field: 'status',\n render: row => <TaskStatusColumn status={row.status} />,\n },\n ]}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n );\n};\n\nexport const ListTasksPage = (props: MyTaskPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const actionsLink = useRouteRef(actionsRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked:\n props?.contextMenu?.actions !== false\n ? () => navigate(actionsLink())\n : undefined,\n onTasksClicked: undefined,\n onCreateClicked:\n props?.contextMenu?.create !== false\n ? () => navigate(createLink())\n : undefined,\n onTemplatingExtensionsClicked:\n props?.contextMenu?.templatingExtensions !== false\n ? () => navigate(templatingExtensionsLink())\n : undefined,\n };\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('listTaskPage.pageTitle')}\n title={t('listTaskPage.title')}\n subtitle={t('listTaskPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ListTaskPageContent {...props} />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OwnerListPicker.esm.js","sources":["../../../src/components/ListTasksPage/OwnerListPicker.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { IconComponent } from '@backstage/core-plugin-api';\nimport Card from '@material-ui/core/Card';\nimport List from '@material-ui/core/List';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport { Fragment } from 'react';\nimport {\n TranslationFunction,\n useTranslationRef,\n} from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nimport AllIcon from '@material-ui/icons/FontDownload';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n backgroundColor: 'rgba(0, 0, 0, .11)',\n boxShadow: 'none',\n margin: theme.spacing(1, 0, 1, 0),\n },\n title: {\n margin: theme.spacing(1, 0, 0, 1),\n textTransform: 'uppercase',\n fontSize: 12,\n fontWeight: 'bold',\n },\n listIcon: {\n minWidth: 30,\n color: theme.palette.text.primary,\n },\n menuItem: {\n minHeight: theme.spacing(6),\n },\n groupWrapper: {\n margin: theme.spacing(1, 1, 2, 1),\n },\n }),\n {\n name: 'ScaffolderReactOwnerListPicker',\n },\n);\n\nexport type ButtonGroup = {\n name: string;\n items: {\n id: 'owned' | 'starred' | 'all';\n label: string;\n icon?: IconComponent;\n }[];\n};\n\nfunction getFilterGroups(\n t: TranslationFunction<typeof scaffolderTranslationRef.T>,\n): ButtonGroup[] {\n return [\n {\n name: t('ownerListPicker.title'),\n items: [\n {\n id: 'owned',\n label: t('ownerListPicker.options.owned'),\n icon: SettingsIcon,\n },\n {\n id: 'all',\n label: t('ownerListPicker.options.all'),\n icon: AllIcon,\n },\n ],\n },\n ];\n}\n\nexport const OwnerListPicker = (props: {\n filter: string;\n onSelectOwner: (id: 'owned' | 'all') => void;\n}) => {\n const { filter, onSelectOwner } = props;\n const classes = useStyles();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const filterGroups = getFilterGroups(t);\n return (\n <Card className={classes.root}>\n {filterGroups.map(group => (\n <Fragment key={group.name}>\n <Typography\n variant=\"subtitle2\"\n component=\"span\"\n className={classes.title}\n >\n {group.name}\n </Typography>\n <Card className={classes.groupWrapper}>\n <List disablePadding dense role=\"menu\">\n {group.items.map((item, index) => (\n <MenuItem\n key={item.id}\n divider={index !== group.items.length - 1}\n ContainerProps={{ role: 'menuitem' }}\n onClick={() => onSelectOwner(item.id as 'owned' | 'all')}\n selected={item.id === filter}\n className={classes.menuItem}\n data-testid={`owner-picker-${item.id}`}\n >\n {item.icon && (\n <ListItemIcon className={classes.listIcon}>\n <item.icon fontSize=\"small\" />\n </ListItemIcon>\n )}\n <ListItemText>\n <Typography variant=\"body1\">{item.label}</Typography>\n </ListItemText>\n </MenuItem>\n ))}\n </List>\n </Card>\n </Fragment>\n ))}\n </Card>\n );\n};\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"OwnerListPicker.esm.js","sources":["../../../src/components/ListTasksPage/OwnerListPicker.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { IconComponent } from '@backstage/core-plugin-api';\nimport Card from '@material-ui/core/Card';\nimport List from '@material-ui/core/List';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport { Fragment } from 'react';\nimport {\n TranslationFunction,\n useTranslationRef,\n} from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nimport AllIcon from '@material-ui/icons/FontDownload';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n backgroundColor: 'rgba(0, 0, 0, .11)',\n boxShadow: 'none',\n margin: theme.spacing(1, 0, 1, 0),\n },\n title: {\n margin: theme.spacing(1, 0, 0, 1),\n textTransform: 'uppercase',\n fontSize: 12,\n fontWeight: 'bold',\n },\n listIcon: {\n minWidth: 30,\n color: theme.palette.text.primary,\n },\n menuItem: {\n minHeight: theme.spacing(6),\n },\n groupWrapper: {\n margin: theme.spacing(1, 1, 2, 1),\n },\n }),\n {\n name: 'ScaffolderReactOwnerListPicker',\n },\n);\n\nexport type ButtonGroup = {\n name: string;\n items: {\n id: 'owned' | 'starred' | 'all';\n label: string;\n icon?: IconComponent;\n }[];\n};\n\nfunction getFilterGroups(\n t: TranslationFunction<typeof scaffolderTranslationRef.T>,\n): ButtonGroup[] {\n return [\n {\n name: t('ownerListPicker.title'),\n items: [\n {\n id: 'owned',\n label: t('ownerListPicker.options.owned'),\n icon: SettingsIcon,\n },\n {\n id: 'all',\n label: t('ownerListPicker.options.all'),\n icon: AllIcon,\n },\n ],\n },\n ];\n}\n\nexport const OwnerListPicker = (props: {\n filter: string;\n onSelectOwner: (id: 'owned' | 'all') => void;\n}) => {\n const { filter, onSelectOwner } = props;\n const classes = useStyles();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const filterGroups = getFilterGroups(t);\n return (\n <Card className={classes.root}>\n {filterGroups.map(group => (\n <Fragment key={group.name}>\n <Typography\n variant=\"subtitle2\"\n component=\"span\"\n className={classes.title}\n >\n {group.name}\n </Typography>\n <Card className={classes.groupWrapper}>\n <List disablePadding dense role=\"menu\">\n {group.items.map((item, index) => (\n <MenuItem\n key={item.id}\n divider={index !== group.items.length - 1}\n ContainerProps={{ role: 'menuitem' }}\n onClick={() => onSelectOwner(item.id as 'owned' | 'all')}\n selected={item.id === filter}\n className={classes.menuItem}\n data-testid={`owner-picker-${item.id}`}\n >\n {item.icon && (\n <ListItemIcon className={classes.listIcon}>\n <item.icon fontSize=\"small\" />\n </ListItemIcon>\n )}\n <ListItemText>\n <Typography variant=\"body1\">{item.label}</Typography>\n </ListItemText>\n </MenuItem>\n ))}\n </List>\n </Card>\n </Fragment>\n ))}\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreatedAtColumn.esm.js","sources":["../../../../src/components/ListTasksPage/columns/CreatedAtColumn.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { DateTime } from 'luxon';\nimport Typography from '@material-ui/core/Typography';\n\ninterface CreatedAtColumnProps {\n createdAt: string;\n locale?: string;\n}\n\nexport function CreatedAtColumn({ createdAt, locale }: CreatedAtColumnProps) {\n const createdAtTime = DateTime.fromISO(createdAt);\n\n const userLocale = locale || window.navigator.language || 'en-US';\n\n const formatted = createdAtTime.setLocale(userLocale).toLocaleString({\n ...DateTime.DATETIME_SHORT_WITH_SECONDS,\n });\n\n return <Typography paragraph>{formatted}</Typography>;\n}\n"],"names":[],"mappings":";;;;AAuBO,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAW,MAAA,EAAO,EAAyB;AAC3E,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA;AAEhD,EAAA,MAAM,UAAA,GAAa,MAAA,IAAU,MAAA,CAAO,SAAA,CAAU,QAAA,IAAY,OAAA;AAE1D,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,SAAA,CAAU,UAAU,EAAE,cAAA,CAAe;AAAA,IACnE,GAAG,QAAA,CAAS;AAAA,GACb,CAAA;AAED,EAAA,uBAAO,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAS,IAAA,EAAE,QAAA,EAAA,SAAA,EAAU,CAAA;AAC1C
|
|
1
|
+
{"version":3,"file":"CreatedAtColumn.esm.js","sources":["../../../../src/components/ListTasksPage/columns/CreatedAtColumn.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { DateTime } from 'luxon';\nimport Typography from '@material-ui/core/Typography';\n\ninterface CreatedAtColumnProps {\n createdAt: string;\n locale?: string;\n}\n\nexport function CreatedAtColumn({ createdAt, locale }: CreatedAtColumnProps) {\n const createdAtTime = DateTime.fromISO(createdAt);\n\n const userLocale = locale || window.navigator.language || 'en-US';\n\n const formatted = createdAtTime.setLocale(userLocale).toLocaleString({\n ...DateTime.DATETIME_SHORT_WITH_SECONDS,\n });\n\n return <Typography paragraph>{formatted}</Typography>;\n}\n"],"names":[],"mappings":";;;;AAuBO,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAW,MAAA,EAAO,EAAyB;AAC3E,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA;AAEhD,EAAA,MAAM,UAAA,GAAa,MAAA,IAAU,MAAA,CAAO,SAAA,CAAU,QAAA,IAAY,OAAA;AAE1D,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,SAAA,CAAU,UAAU,EAAE,cAAA,CAAe;AAAA,IACnE,GAAG,QAAA,CAAS;AAAA,GACb,CAAA;AAED,EAAA,uBAAO,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAS,IAAA,EAAE,QAAA,EAAA,SAAA,EAAU,CAAA;AAC1C;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OwnerEntityColumn.esm.js","sources":["../../../../src/components/ListTasksPage/columns/OwnerEntityColumn.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport Typography from '@material-ui/core/Typography';\n\nexport const OwnerEntityColumn = ({ entityRef }: { entityRef?: string }) => {\n if (!entityRef) {\n return <Typography>Unknown</Typography>;\n }\n\n return <EntityRefLink entityRef={entityRef} />;\n};\n"],"names":[],"mappings":";;;;AAkBO,MAAM,iBAAA,GAAoB,CAAC,EAAE,SAAA,EAAU,KAA8B;AAC1E,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,uBAAO,GAAA,CAAC,cAAW,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,EAC5B;AAEA,EAAA,uBAAO,GAAA,CAAC,iBAAc,SAAA,EAAsB,CAAA;AAC9C
|
|
1
|
+
{"version":3,"file":"OwnerEntityColumn.esm.js","sources":["../../../../src/components/ListTasksPage/columns/OwnerEntityColumn.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport Typography from '@material-ui/core/Typography';\n\nexport const OwnerEntityColumn = ({ entityRef }: { entityRef?: string }) => {\n if (!entityRef) {\n return <Typography>Unknown</Typography>;\n }\n\n return <EntityRefLink entityRef={entityRef} />;\n};\n"],"names":[],"mappings":";;;;AAkBO,MAAM,iBAAA,GAAoB,CAAC,EAAE,SAAA,EAAU,KAA8B;AAC1E,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,uBAAO,GAAA,CAAC,cAAW,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,EAC5B;AAEA,EAAA,uBAAO,GAAA,CAAC,iBAAc,SAAA,EAAsB,CAAA;AAC9C;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskStatusColumn.esm.js","sources":["../../../../src/components/ListTasksPage/columns/TaskStatusColumn.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n StatusError,\n StatusOK,\n StatusPending,\n} from '@backstage/core-components';\n\nexport const TaskStatusColumn = ({ status }: { status: string }) => {\n switch (status) {\n case 'processing':\n return <StatusPending>{status}</StatusPending>;\n case 'completed':\n return <StatusOK>{status}</StatusOK>;\n case 'error':\n default:\n return <StatusError>{status}</StatusError>;\n }\n};\n"],"names":[],"mappings":";;;AAqBO,MAAM,gBAAA,GAAmB,CAAC,EAAE,MAAA,EAAO,KAA0B;AAClE,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,YAAA;AACH,MAAA,uBAAO,GAAA,CAAC,iBAAe,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,IAChC,KAAK,WAAA;AACH,MAAA,uBAAO,GAAA,CAAC,YAAU,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,IAC3B,KAAK,OAAA;AAAA,IACL;AACE,MAAA,uBAAO,GAAA,CAAC,eAAa,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA;AAElC
|
|
1
|
+
{"version":3,"file":"TaskStatusColumn.esm.js","sources":["../../../../src/components/ListTasksPage/columns/TaskStatusColumn.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n StatusError,\n StatusOK,\n StatusPending,\n} from '@backstage/core-components';\n\nexport const TaskStatusColumn = ({ status }: { status: string }) => {\n switch (status) {\n case 'processing':\n return <StatusPending>{status}</StatusPending>;\n case 'completed':\n return <StatusOK>{status}</StatusOK>;\n case 'error':\n default:\n return <StatusError>{status}</StatusError>;\n }\n};\n"],"names":[],"mappings":";;;AAqBO,MAAM,gBAAA,GAAmB,CAAC,EAAE,MAAA,EAAO,KAA0B;AAClE,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,YAAA;AACH,MAAA,uBAAO,GAAA,CAAC,iBAAe,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,IAChC,KAAK,WAAA;AACH,MAAA,uBAAO,GAAA,CAAC,YAAU,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,IAC3B,KAAK,OAAA;AAAA,IACL;AACE,MAAA,uBAAO,GAAA,CAAC,eAAa,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA;AAElC;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateTitleColumn.esm.js","sources":["../../../../src/components/ListTasksPage/columns/TemplateTitleColumn.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\n\nexport const TemplateTitleColumn = ({ entityRef }: { entityRef?: string }) => {\n const scaffolder = useApi(scaffolderApiRef);\n const { value, loading, error } = useAsync(\n () => scaffolder.getTemplateParameterSchema(entityRef || ''),\n [scaffolder, entityRef],\n );\n\n if (loading || error || !entityRef) {\n return null;\n }\n\n return (\n <EntityRefLink entityRef={parseEntityRef(entityRef)} title={value?.title} />\n );\n};\n"],"names":[],"mappings":";;;;;;;AAqBO,MAAM,mBAAA,GAAsB,CAAC,EAAE,SAAA,EAAU,KAA8B;AAC5E,EAAA,MAAM,UAAA,GAAa,OAAO,gBAAgB,CAAA;AAC1C,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM,GAAI,QAAA;AAAA,IAChC,MAAM,UAAA,CAAW,0BAAA,CAA2B,SAAA,IAAa,EAAE,CAAA;AAAA,IAC3D,CAAC,YAAY,SAAS;AAAA,GACxB;AAEA,EAAA,IAAI,OAAA,IAAW,KAAA,IAAS,CAAC,SAAA,EAAW;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,GAAA,CAAC,iBAAc,SAAA,EAAW,cAAA,CAAe,SAAS,CAAA,EAAG,KAAA,EAAO,OAAO,KAAA,EAAO,CAAA;AAE9E
|
|
1
|
+
{"version":3,"file":"TemplateTitleColumn.esm.js","sources":["../../../../src/components/ListTasksPage/columns/TemplateTitleColumn.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\n\nexport const TemplateTitleColumn = ({ entityRef }: { entityRef?: string }) => {\n const scaffolder = useApi(scaffolderApiRef);\n const { value, loading, error } = useAsync(\n () => scaffolder.getTemplateParameterSchema(entityRef || ''),\n [scaffolder, entityRef],\n );\n\n if (loading || error || !entityRef) {\n return null;\n }\n\n return (\n <EntityRefLink entityRef={parseEntityRef(entityRef)} title={value?.title} />\n );\n};\n"],"names":[],"mappings":";;;;;;;AAqBO,MAAM,mBAAA,GAAsB,CAAC,EAAE,SAAA,EAAU,KAA8B;AAC5E,EAAA,MAAM,UAAA,GAAa,OAAO,gBAAgB,CAAA;AAC1C,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM,GAAI,QAAA;AAAA,IAChC,MAAM,UAAA,CAAW,0BAAA,CAA2B,SAAA,IAAa,EAAE,CAAA;AAAA,IAC3D,CAAC,YAAY,SAAS;AAAA,GACxB;AAEA,EAAA,IAAI,OAAA,IAAW,KAAA,IAAS,CAAC,SAAA,EAAW;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,GAAA,CAAC,iBAAc,SAAA,EAAW,cAAA,CAAe,SAAS,CAAA,EAAG,KAAA,EAAO,OAAO,KAAA,EAAO,CAAA;AAE9E;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenu.esm.js","sources":["../../../src/components/OngoingTask/ContextMenu.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MenuList from '@material-ui/core/MenuList';\nimport Popover from '@material-ui/core/Popover';\nimport { makeStyles, Theme, useTheme } from '@material-ui/core/styles';\nimport Cancel from '@material-ui/icons/Cancel';\nimport Repeat from '@material-ui/icons/Repeat';\nimport Replay from '@material-ui/icons/Replay';\nimport Toc from '@material-ui/icons/Toc';\nimport ControlPointIcon from '@material-ui/icons/ControlPoint';\nimport MoreVert from '@material-ui/icons/MoreVert';\nimport { SyntheticEvent, useState } from 'react';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n taskReadPermission,\n taskCreatePermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\ntype ContextMenuProps = {\n cancelEnabled?: boolean;\n canRetry: boolean;\n isRetryableTask: boolean;\n logsVisible?: boolean;\n buttonBarVisible?: boolean;\n onRetry?: () => void;\n onStartOver?: () => void;\n onToggleLogs?: (state: boolean) => void;\n onToggleButtonBar?: (state: boolean) => void;\n taskId?: string;\n isCancelButtonDisabled: boolean;\n onCancel: () => void;\n};\n\nconst useStyles = makeStyles<Theme, { fontColor: string }>(() => ({\n button: {\n color: ({ fontColor }) => fontColor,\n },\n}));\n\nexport const ContextMenu = (props: ContextMenuProps) => {\n const {\n cancelEnabled,\n canRetry,\n isRetryableTask,\n logsVisible,\n buttonBarVisible,\n onRetry,\n onStartOver,\n onToggleLogs,\n onToggleButtonBar,\n taskId,\n } = props;\n const { getPageTheme } = useTheme();\n const pageTheme = getPageTheme({ themeId: 'website' });\n const classes = useStyles({ fontColor: pageTheme.fontColor });\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n // Start Over endpoint requires user to have both read (to grab parameters) and create (to create new task) permissions\n const canStartOver = canReadTask && canCreateTask;\n\n return (\n <>\n <IconButton\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n onClick={(event: SyntheticEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n }}\n data-testid=\"menu-button\"\n className={classes.button}\n >\n <MoreVert />\n </IconButton>\n <Popover\n open={Boolean(anchorEl)}\n onClose={() => setAnchorEl(undefined)}\n anchorEl={anchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuList>\n <MenuItem onClick={() => onToggleLogs?.(!logsVisible)}>\n <ListItemIcon>\n <Toc fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={\n logsVisible\n ? t('ongoingTask.contextMenu.hideLogs')\n : t('ongoingTask.contextMenu.showLogs')\n }\n />\n </MenuItem>\n <MenuItem onClick={() => onToggleButtonBar?.(!buttonBarVisible)}>\n <ListItemIcon>\n <ControlPointIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={\n buttonBarVisible\n ? t('ongoingTask.contextMenu.hideButtonBar')\n : t('ongoingTask.contextMenu.showButtonBar')\n }\n />\n </MenuItem>\n <MenuItem\n onClick={onStartOver}\n disabled={cancelEnabled || !canStartOver}\n data-testid=\"start-over-task\"\n >\n <ListItemIcon>\n <Repeat fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('ongoingTask.contextMenu.startOver')} />\n </MenuItem>\n {isRetryableTask && (\n <MenuItem\n onClick={onRetry}\n disabled={cancelEnabled || !canRetry}\n data-testid=\"retry-task\"\n >\n <ListItemIcon>\n <Replay fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('ongoingTask.contextMenu.retry')} />\n </MenuItem>\n )}\n <MenuItem\n onClick={props.onCancel}\n disabled={props.isCancelButtonDisabled}\n data-testid=\"cancel-task\"\n >\n <ListItemIcon>\n <Cancel fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('ongoingTask.contextMenu.cancel')} />\n </MenuItem>\n </MenuList>\n </Popover>\n </>\n );\n};\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ContextMenu.esm.js","sources":["../../../src/components/OngoingTask/ContextMenu.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MenuList from '@material-ui/core/MenuList';\nimport Popover from '@material-ui/core/Popover';\nimport { makeStyles, Theme, useTheme } from '@material-ui/core/styles';\nimport Cancel from '@material-ui/icons/Cancel';\nimport Repeat from '@material-ui/icons/Repeat';\nimport Replay from '@material-ui/icons/Replay';\nimport Toc from '@material-ui/icons/Toc';\nimport ControlPointIcon from '@material-ui/icons/ControlPoint';\nimport MoreVert from '@material-ui/icons/MoreVert';\nimport { SyntheticEvent, useState } from 'react';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n taskReadPermission,\n taskCreatePermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\ntype ContextMenuProps = {\n cancelEnabled?: boolean;\n canRetry: boolean;\n isRetryableTask: boolean;\n logsVisible?: boolean;\n buttonBarVisible?: boolean;\n onRetry?: () => void;\n onStartOver?: () => void;\n onToggleLogs?: (state: boolean) => void;\n onToggleButtonBar?: (state: boolean) => void;\n taskId?: string;\n isCancelButtonDisabled: boolean;\n onCancel: () => void;\n};\n\nconst useStyles = makeStyles<Theme, { fontColor: string }>(() => ({\n button: {\n color: ({ fontColor }) => fontColor,\n },\n}));\n\nexport const ContextMenu = (props: ContextMenuProps) => {\n const {\n cancelEnabled,\n canRetry,\n isRetryableTask,\n logsVisible,\n buttonBarVisible,\n onRetry,\n onStartOver,\n onToggleLogs,\n onToggleButtonBar,\n taskId,\n } = props;\n const { getPageTheme } = useTheme();\n const pageTheme = getPageTheme({ themeId: 'website' });\n const classes = useStyles({ fontColor: pageTheme.fontColor });\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n resourceRef: taskId,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n // Start Over endpoint requires user to have both read (to grab parameters) and create (to create new task) permissions\n const canStartOver = canReadTask && canCreateTask;\n\n return (\n <>\n <IconButton\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n onClick={(event: SyntheticEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n }}\n data-testid=\"menu-button\"\n className={classes.button}\n >\n <MoreVert />\n </IconButton>\n <Popover\n open={Boolean(anchorEl)}\n onClose={() => setAnchorEl(undefined)}\n anchorEl={anchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuList>\n <MenuItem onClick={() => onToggleLogs?.(!logsVisible)}>\n <ListItemIcon>\n <Toc fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={\n logsVisible\n ? t('ongoingTask.contextMenu.hideLogs')\n : t('ongoingTask.contextMenu.showLogs')\n }\n />\n </MenuItem>\n <MenuItem onClick={() => onToggleButtonBar?.(!buttonBarVisible)}>\n <ListItemIcon>\n <ControlPointIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={\n buttonBarVisible\n ? t('ongoingTask.contextMenu.hideButtonBar')\n : t('ongoingTask.contextMenu.showButtonBar')\n }\n />\n </MenuItem>\n <MenuItem\n onClick={onStartOver}\n disabled={cancelEnabled || !canStartOver}\n data-testid=\"start-over-task\"\n >\n <ListItemIcon>\n <Repeat fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('ongoingTask.contextMenu.startOver')} />\n </MenuItem>\n {isRetryableTask && (\n <MenuItem\n onClick={onRetry}\n disabled={cancelEnabled || !canRetry}\n data-testid=\"retry-task\"\n >\n <ListItemIcon>\n <Replay fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('ongoingTask.contextMenu.retry')} />\n </MenuItem>\n )}\n <MenuItem\n onClick={props.onCancel}\n disabled={props.isCancelButtonDisabled}\n data-testid=\"cancel-task\"\n >\n <ListItemIcon>\n <Cancel fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('ongoingTask.contextMenu.cancel')} />\n </MenuItem>\n </MenuList>\n </Popover>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useCallback, useMemo, useEffect } from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { Content, ErrorPanel, Page, Header } from '@backstage/core-components';
|
|
4
4
|
import { useParams, useNavigate } from 'react-router-dom';
|
|
5
5
|
import Box from '@material-ui/core/Box';
|
|
6
6
|
import Button from '@material-ui/core/Button';
|
|
@@ -8,7 +8,7 @@ import Paper from '@material-ui/core/Paper';
|
|
|
8
8
|
import { makeStyles } from '@material-ui/core/styles';
|
|
9
9
|
import { useTaskEventStream, scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
|
|
10
10
|
import { selectedTemplateRouteRef } from '../../routes.esm.js';
|
|
11
|
-
import {
|
|
11
|
+
import { useApi, useRouteRef, useAnalytics, AnalyticsContext } from '@backstage/core-plugin-api';
|
|
12
12
|
import qs from 'qs';
|
|
13
13
|
import { ContextMenu } from './ContextMenu.esm.js';
|
|
14
14
|
import { DefaultTemplateOutputs, TaskSteps, TaskLogStream } from '@backstage/plugin-scaffolder-react/alpha';
|