chore: prioritize access policies in system settings

This commit is contained in:
johnnyjoygh 2026-09-01 23:30:43 +08:00
parent 191ec01d11
commit 245e5e3a3e
6 changed files with 62 additions and 47 deletions

View file

@ -122,27 +122,30 @@ const InstanceSection = () => {
{t("common.edit")}
</Button>
</SettingListItem>
<SettingListItem label={t("setting.instance.week-start-day")} description={t("setting.instance.week-start-day-description")}>
<Select
value={instanceGeneralSetting.weekStartDayOffset.toString()}
items={weekStartDayOptions}
onValueChange={(value) => {
updatePartialSetting({ weekStartDayOffset: parseInt(value) || 0 });
}}
>
<SelectTrigger className="min-w-fit">
<SelectValue />
</SelectTrigger>
<SelectContent>
{weekStartDayOptions.map((option) => (
<SelectItem key={option.value} value={option.value}>
{option.label}
</SelectItem>
))}
</SelectContent>
</Select>
</SettingListItem>
</SettingList>
</SettingGroup>
<SettingGroup title={t("setting.system.custom-code-title")} description={t("setting.system.custom-code-description")} showSeparator>
<SettingCodeEditor
label={t("setting.system.additional-style")}
description={t("setting.system.additional-style-description")}
placeholder={t("setting.system.additional-style-placeholder")}
value={instanceGeneralSetting.additionalStyle}
onChange={(additionalStyle) => updatePartialSetting({ additionalStyle })}
/>
<SettingCodeEditor
label={t("setting.system.additional-script")}
description={t("setting.system.additional-script-description")}
placeholder={t("setting.system.additional-script-placeholder")}
value={instanceGeneralSetting.additionalScript}
onChange={(additionalScript) => updatePartialSetting({ additionalScript })}
/>
</SettingGroup>
<SettingGroup title={t("setting.instance.access-title")} description={t("setting.instance.access-description")} showSeparator>
<SettingList>
<SettingListItem
@ -197,30 +200,27 @@ const InstanceSection = () => {
onCheckedChange={(checked) => updatePartialSetting({ disallowChangeNickname: checked })}
/>
</SettingListItem>
<SettingListItem label={t("setting.instance.week-start-day")} description={t("setting.instance.week-start-day-description")}>
<Select
value={instanceGeneralSetting.weekStartDayOffset.toString()}
items={weekStartDayOptions}
onValueChange={(value) => {
updatePartialSetting({ weekStartDayOffset: parseInt(value) || 0 });
}}
>
<SelectTrigger className="min-w-fit">
<SelectValue />
</SelectTrigger>
<SelectContent>
{weekStartDayOptions.map((option) => (
<SelectItem key={option.value} value={option.value}>
{option.label}
</SelectItem>
))}
</SelectContent>
</Select>
</SettingListItem>
</SettingList>
</SettingGroup>
<SettingGroup title={t("setting.system.custom-code-title")} description={t("setting.system.custom-code-description")} showSeparator>
<SettingCodeEditor
label={t("setting.system.additional-style")}
description={t("setting.system.additional-style-description")}
placeholder={t("setting.system.additional-style-placeholder")}
value={instanceGeneralSetting.additionalStyle}
onChange={(additionalStyle) => updatePartialSetting({ additionalStyle })}
/>
<SettingCodeEditor
label={t("setting.system.additional-script")}
description={t("setting.system.additional-script-description")}
placeholder={t("setting.system.additional-script-placeholder")}
value={instanceGeneralSetting.additionalScript}
onChange={(additionalScript) => updatePartialSetting({ additionalScript })}
/>
</SettingGroup>
<div className="w-full flex justify-end">
<Button disabled={!hasUnsavedChanges} onClick={handleSaveSettings}>
{t("common.save")}

View file

@ -392,7 +392,7 @@
"saturday": "Saturday",
"sunday": "Sunday",
"week-start-day": "Week start day",
"access-description": "Control anonymous browsing, sign-up, authentication, profile editing, and calendar defaults for this instance.",
"access-description": "Control anonymous browsing, sign-up, authentication, and profile editing for this instance.",
"access-title": "Access and policies",
"disallow-change-nickname-description": "Prevent users from changing their display name.",
"disallow-change-username-description": "Prevent users from changing their login username.",
@ -613,7 +613,7 @@
"title": "General",
"additional-script-description": "Inject JavaScript into every web page. Use only trusted code.",
"additional-style-description": "Inject CSS into the web app to adjust instance-wide presentation.",
"basic-description": "Configure the public identity shown by this instance.",
"basic-description": "Configure the public identity and calendar defaults for this instance.",
"custom-code-description": "Optional instance-wide CSS and JavaScript applied to the frontend.",
"custom-code-title": "Custom code"
},

View file

@ -606,7 +606,7 @@
"transcription-warning-no-key": "The selected provider has no API key set. Edit the integration above to add one."
},
"instance": {
"access-description": "Control anonymous browsing, sign-up, authentication, profile editing, and calendar defaults for this instance.",
"access-description": "Control anonymous browsing, sign-up, authentication, and profile editing for this instance.",
"access-title": "Access and policies",
"allow-public-access-description": "Allow signed-out visitors to browse public memos. Shared memo links remain available when this is disabled.",
"allow-public-access": "Allow public access",
@ -941,7 +941,7 @@
"additional-style-description": "Inject CSS into the web app to adjust instance-wide presentation.",
"additional-style-placeholder": "Additional CSS code",
"allow-user-signup": "Allow user signup",
"basic-description": "Configure the public identity shown by this instance.",
"basic-description": "Configure the public identity and calendar defaults for this instance.",
"customize-server": {
"description": "Description",
"icon-url": "Icon URL",

View file

@ -657,7 +657,7 @@
"additional-style-description": "向前端应用注入 CSS,用于调整实例范围内的显示效果。",
"additional-style-placeholder": "自定义 CSS 代码",
"allow-user-signup": "允许用户注册",
"basic-description": "配置该实例对外展示的身份信息。",
"basic-description": "配置该实例对外展示的身份信息和日历默认行为。",
"customize-server": {
"description": "描述",
"icon-url": "图标链接",
@ -722,7 +722,7 @@
"username-note": "用于登录"
},
"instance": {
"access-description": "控制该实例的注册、登录、资料编辑和日历默认行为。",
"access-description": "控制该实例的公开访问、注册、登录和资料编辑。",
"access-title": "访问和策略",
"disallow-change-nickname-description": "阻止用户修改显示昵称。",
"disallow-change-nickname": "禁止修改用户昵称",

View file

@ -611,7 +611,7 @@
"transcription-warning-no-key": "所選服務供應商尚未設定 API 金鑰。請編輯上方的整合以新增。"
},
"instance": {
"access-description": "控制此實例的註冊、身分驗證、個人檔案編輯和日曆預設值。",
"access-description": "控制此實例的公開存取、註冊、身分驗證和個人檔案編輯。",
"access-title": "存取與政策",
"allow-public-access": "允許公開存取",
"allow-public-access-description": "允許未登入的訪客瀏覽公開備忘錄。停用此選項後,共享的備忘錄連結仍可使用。",
@ -946,7 +946,7 @@
"additional-style-description": "在網頁應用程式中注入 CSS 以調整實例範圍的呈現方式。",
"additional-style-placeholder": "自訂 CSS 代碼",
"allow-user-signup": "允許使用者註冊",
"basic-description": "設定此實例顯示的公開身分資訊。",
"basic-description": "設定此實例顯示的公開身分資訊和日曆預設值。",
"customize-server": {
"description": "說明",
"icon-url": "圖示網址",

View file

@ -58,4 +58,19 @@ describe("<InstanceSection> access setting", () => {
expect(setting.value.value.accessMode).toBe(InstanceAccessMode.PUBLIC);
expect(instance.fetchSetting).not.toHaveBeenCalled();
});
it("orders general settings before access policies and custom code", () => {
render(<InstanceSection />);
const groupHeadings = screen.getAllByRole("heading", { level: 4 });
expect(groupHeadings.map((heading) => heading.textContent)).toEqual([
"common.basic",
"setting.instance.access-title",
"setting.system.custom-code-title",
]);
const weekStartDay = screen.getByText("setting.instance.week-start-day");
const accessHeading = screen.getByRole("heading", { level: 4, name: "setting.instance.access-title" });
expect(weekStartDay.compareDocumentPosition(accessHeading) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();
});
});