diff --git a/frontend/src/entry/model/settings/AccessRequestSettings.tsx b/frontend/src/entry/model/settings/AccessRequestSettings.tsx index f4e0263ff..a68372048 100644 --- a/frontend/src/entry/model/settings/AccessRequestSettings.tsx +++ b/frontend/src/entry/model/settings/AccessRequestSettings.tsx @@ -23,6 +23,7 @@ export default function AccessRequestSettings({ model }: AccessRequestSettingsPr const updatedModelSettings = { settings: { ungovernedAccess: allowUngoverned, + allowTemplating: model.settings.allowTemplating, }, } diff --git a/frontend/src/entry/model/settings/TemplateSettings.tsx b/frontend/src/entry/model/settings/TemplateSettings.tsx new file mode 100644 index 000000000..e87095a38 --- /dev/null +++ b/frontend/src/entry/model/settings/TemplateSettings.tsx @@ -0,0 +1,72 @@ +import { LoadingButton } from '@mui/lab' +import { Checkbox, Divider, FormControlLabel, Stack, Typography } from '@mui/material' +import { patchModel } from 'actions/model' +import { useState } from 'react' +import useNotification from 'src/hooks/useNotification' +import MessageAlert from 'src/MessageAlert' +import { EntryInterface } from 'types/types' +import { getErrorMessage } from 'utils/fetcher' + +type TemplateSettingsProps = { + model: EntryInterface +} + +export default function TemplateSettings({ model }: TemplateSettingsProps) { + const [allowTemplating, setAllowTemplating] = useState(model.settings.allowTemplating) + const [loading, setLoading] = useState(false) + const [errorMessage, setErrorMessage] = useState('') + const sendNotification = useNotification() + + async function handleSave() { + setLoading(true) + const updatedModelSettings = { + settings: { + ungovernedAccess: model.settings.ungovernedAccess, + allowTemplating, + }, + } + + const response = await patchModel(model.id, updatedModelSettings) + + if (!response.ok) { + setErrorMessage(await getErrorMessage(response)) + } else { + sendNotification({ + variant: 'success', + msg: 'Template settings updated', + anchorOrigin: { horizontal: 'center', vertical: 'bottom' }, + }) + } + setLoading(false) + } + + return ( + + + Manage Template + + setAllowTemplating(event.target.checked)} + checked={allowTemplating} + size='small' + /> + } + /> + +
+ + Save + + +
+
+ ) +} diff --git a/frontend/src/entry/settings/Settings.tsx b/frontend/src/entry/settings/Settings.tsx index 2ab076106..defb83ea8 100644 --- a/frontend/src/entry/settings/Settings.tsx +++ b/frontend/src/entry/settings/Settings.tsx @@ -4,6 +4,7 @@ import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import SimpleListItemButton from 'src/common/SimpleListItemButton' import AccessRequestSettings from 'src/entry/model/settings/AccessRequestSettings' +import TemplateSettings from 'src/entry/model/settings/TemplateSettings' import EntryAccessPage from 'src/entry/settings/EntryAccessPage' import EntryDetails from 'src/entry/settings/EntryDetails' import { EntryInterface, EntryKind, EntryKindKeys } from 'types/types' @@ -14,6 +15,7 @@ export const SettingsCategory = { DANGER: 'danger', ACCESS_REQUESTS: 'access_requests', PERMISSIONS: 'permissions', + TEMPLATE: 'template', } as const export type SettingsCategoryKeys = (typeof SettingsCategory)[keyof typeof SettingsCategory] @@ -28,7 +30,8 @@ function isSettingsCategory( value === SettingsCategory.DETAILS || value === SettingsCategory.PERMISSIONS || value === SettingsCategory.ACCESS_REQUESTS || - value === SettingsCategory.DANGER + value === SettingsCategory.DANGER || + value === SettingsCategory.TEMPLATE ) case EntryKind.DATA_CARD: return value === SettingsCategory.DETAILS || value === SettingsCategory.PERMISSIONS @@ -93,6 +96,12 @@ export default function Settings({ entry }: SettingsProps) { > Access Requests + handleListItemClick(SettingsCategory.TEMPLATE)} + > + Template + handleListItemClick(SettingsCategory.DANGER)} @@ -106,6 +115,7 @@ export default function Settings({ entry }: SettingsProps) { {selectedCategory === SettingsCategory.DETAILS && } {selectedCategory === SettingsCategory.PERMISSIONS && } {selectedCategory === SettingsCategory.ACCESS_REQUESTS && } + {selectedCategory === SettingsCategory.TEMPLATE && } {selectedCategory === SettingsCategory.DANGER && ( diff --git a/frontend/types/types.ts b/frontend/types/types.ts index 712638ea3..5cf3dd680 100644 --- a/frontend/types/types.ts +++ b/frontend/types/types.ts @@ -378,6 +378,7 @@ export interface EntryInterface { description: string settings: { ungovernedAccess: boolean + allowTemplating: boolean } card: EntryCardInterface visibility: EntryVisibilityKeys diff --git a/frontend/utils/test/testModels.ts b/frontend/utils/test/testModels.ts index 3e3280b78..d60b2cda0 100644 --- a/frontend/utils/test/testModels.ts +++ b/frontend/utils/test/testModels.ts @@ -82,6 +82,7 @@ export const testV2Model: EntryInterface = { ], settings: { ungovernedAccess: false, + allowTemplating: false, }, teamId: 'test-team', card: testModelCard,