Merge pull request #26946 from stephenglass/scaffolder-permission-manage1

feat(scaffolder): add permission for template management features
This commit is contained in:
Ben Lambert
2024-11-07 16:35:20 +01:00
committed by GitHub
5 changed files with 56 additions and 21 deletions
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-scaffolder-common': patch
'@backstage/plugin-scaffolder-react': patch
'@backstage/plugin-scaffolder': minor
---
Add scaffolder permission `scaffolder.template.management` for accessing the template management features
@@ -40,6 +40,9 @@ export const taskCreatePermission: BasicPermission;
// @alpha
export const taskReadPermission: BasicPermission;
// @alpha
export const templateManagementPermission: BasicPermission;
// @alpha
export const templateParameterReadPermission: ResourcePermission<'scaffolder-template'>;
@@ -113,6 +113,16 @@ export const taskCancelPermission = createPermission({
attributes: {},
});
/**
* This permission is used to authorize template management features.
*
* @alpha
*/
export const templateManagementPermission = createPermission({
name: 'scaffolder.template.management',
attributes: {},
});
/**
* List of the scaffolder permissions that are associated with template steps and parameters.
* @alpha
@@ -146,4 +156,5 @@ export const scaffolderPermissions = [
...scaffolderTemplatePermissions,
...scaffolderActionPermissions,
...scaffolderTaskPermissions,
templateManagementPermission,
];
@@ -29,6 +29,7 @@ import MoreVert from '@material-ui/icons/MoreVert';
import React, { useState } from 'react';
import { usePermission } from '@backstage/plugin-permission-react';
import { taskReadPermission } from '@backstage/plugin-scaffolder-common/alpha';
import { templateManagementPermission } from '@backstage/plugin-scaffolder-common/alpha';
const useStyles = makeStyles(theme => ({
button: {
@@ -61,6 +62,10 @@ export function ScaffolderPageContextMenu(
permission: taskReadPermission,
});
const { allowed: canManageTemplates } = usePermission({
permission: templateManagementPermission,
});
if (!onEditorClicked && !onActionsClicked) {
return null;
}
@@ -106,7 +111,7 @@ export function ScaffolderPageContextMenu(
<ListItemText primary="Create" />
</MenuItem>
)}
{onEditorClicked && (
{onEditorClicked && canManageTemplates && (
<MenuItem onClick={onEditorClicked}>
<ListItemIcon>
<Edit fontSize="small" />
@@ -61,6 +61,7 @@ import {
} from '../../alpha/components/TemplateEditorPage';
import { RequirePermission } from '@backstage/plugin-permission-react';
import { taskReadPermission } from '@backstage/plugin-scaffolder-common/alpha';
import { templateManagementPermission } from '@backstage/plugin-scaffolder-common/alpha';
/**
* The Props for the Scaffolder Router
@@ -174,29 +175,35 @@ export const Router = (props: PropsWithChildren<RouterProps>) => {
<Route
path={editRouteRef.path}
element={
<SecretsContextProvider>
<TemplateIntroPage />
</SecretsContextProvider>
<RequirePermission permission={templateManagementPermission}>
<SecretsContextProvider>
<TemplateIntroPage />
</SecretsContextProvider>
</RequirePermission>
}
/>
<Route
path={customFieldsRouteRef.path}
element={
<SecretsContextProvider>
<CustomFieldsPage fieldExtensions={fieldExtensions} />
</SecretsContextProvider>
<RequirePermission permission={templateManagementPermission}>
<SecretsContextProvider>
<CustomFieldsPage fieldExtensions={fieldExtensions} />
</SecretsContextProvider>
</RequirePermission>
}
/>
<Route
path={templateFormRouteRef.path}
element={
<SecretsContextProvider>
<TemplateFormPage
layouts={customLayouts}
formProps={props.formProps}
fieldExtensions={fieldExtensions}
/>
</SecretsContextProvider>
<RequirePermission permission={templateManagementPermission}>
<SecretsContextProvider>
<TemplateFormPage
layouts={customLayouts}
formProps={props.formProps}
fieldExtensions={fieldExtensions}
/>
</SecretsContextProvider>
</RequirePermission>
}
/>
@@ -212,13 +219,15 @@ export const Router = (props: PropsWithChildren<RouterProps>) => {
<Route
path={editorRouteRef.path}
element={
<SecretsContextProvider>
<TemplateEditorPage
layouts={customLayouts}
formProps={props.formProps}
fieldExtensions={fieldExtensions}
/>
</SecretsContextProvider>
<RequirePermission permission={templateManagementPermission}>
<SecretsContextProvider>
<TemplateEditorPage
layouts={customLayouts}
formProps={props.formProps}
fieldExtensions={fieldExtensions}
/>
</SecretsContextProvider>
</RequirePermission>
}
/>
<Route