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,