mirror of
https://github.com/docmost/docmost.git
synced 2026-07-24 14:42:55 +10:00
feat: workspace default edit preference
This commit is contained in:
+71
@@ -0,0 +1,71 @@
|
||||
import { Group, Text, SegmentedControl } from "@mantine/core";
|
||||
import { useAtom } from "jotai";
|
||||
import { workspaceAtom } from "@/features/user/atoms/current-user-atom.ts";
|
||||
import { useState, useEffect } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { updateWorkspace } from "@/features/workspace/services/workspace-service.ts";
|
||||
import { notifications } from "@mantine/notifications";
|
||||
import { getApiErrorMessage } from "@/lib/api-error.ts";
|
||||
import { PageEditMode } from "@/features/user/types/user.types.ts";
|
||||
|
||||
export default function WorkspaceDefaultPageEditMode() {
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<Group justify="space-between" wrap="nowrap" gap="xl">
|
||||
<div>
|
||||
<Text size="md">{t("Default page edit mode")}</Text>
|
||||
<Text size="sm" c="dimmed">
|
||||
{t(
|
||||
"Choose the page edit mode new members start with. Existing members are not affected.",
|
||||
)}
|
||||
</Text>
|
||||
</div>
|
||||
|
||||
<DefaultPageEditModeControl />
|
||||
</Group>
|
||||
);
|
||||
}
|
||||
|
||||
function DefaultPageEditModeControl() {
|
||||
const { t } = useTranslation();
|
||||
const [workspace, setWorkspace] = useAtom(workspaceAtom);
|
||||
const defaultPageEditMode =
|
||||
workspace?.settings?.defaultPageEditMode ?? PageEditMode.Edit;
|
||||
const [value, setValue] = useState<string>(defaultPageEditMode);
|
||||
|
||||
const handleChange = async (newValue: string) => {
|
||||
const prevValue = value;
|
||||
setValue(newValue);
|
||||
try {
|
||||
const updatedWorkspace = await updateWorkspace({
|
||||
defaultPageEditMode: newValue,
|
||||
});
|
||||
setWorkspace(updatedWorkspace);
|
||||
} catch (err) {
|
||||
setValue(prevValue);
|
||||
notifications.show({
|
||||
message: getApiErrorMessage(err, t("Failed to update setting")),
|
||||
color: "red",
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (defaultPageEditMode !== value) {
|
||||
setValue(defaultPageEditMode);
|
||||
}
|
||||
}, [defaultPageEditMode, value]);
|
||||
|
||||
return (
|
||||
<SegmentedControl
|
||||
aria-label={t("Default page edit mode")}
|
||||
value={value}
|
||||
onChange={handleChange}
|
||||
data={[
|
||||
{ label: t("Edit"), value: PageEditMode.Edit },
|
||||
{ label: t("Read"), value: PageEditMode.Read },
|
||||
]}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -29,6 +29,7 @@ export interface IWorkspace {
|
||||
restrictApiToAdmins?: boolean;
|
||||
allowMemberTemplates?: boolean;
|
||||
allowPersonalSpaces?: boolean;
|
||||
defaultPageEditMode?: string;
|
||||
isScimEnabled?: boolean;
|
||||
}
|
||||
|
||||
@@ -38,6 +39,7 @@ export interface IWorkspaceSettings {
|
||||
api?: IWorkspaceApiSettings;
|
||||
templates?: IWorkspaceTemplateSettings;
|
||||
spaces?: IWorkspaceSpaceSettings;
|
||||
defaultPageEditMode?: string;
|
||||
}
|
||||
|
||||
export interface IWorkspaceApiSettings {
|
||||
|
||||
@@ -7,6 +7,7 @@ import { Helmet } from "react-helmet-async";
|
||||
import ManageHostname from "@/ee/components/manage-hostname.tsx";
|
||||
import { Divider } from "@mantine/core";
|
||||
import AllowMemberTemplates from "@/ee/security/components/allow-member-templates.tsx";
|
||||
import WorkspaceDefaultPageEditMode from "@/features/workspace/components/settings/components/workspace-default-page-edit-mode.tsx";
|
||||
import PersonalSpacesSetting from "@/ee/personal-space/components/personal-spaces-setting.tsx";
|
||||
|
||||
export default function WorkspaceSettings() {
|
||||
@@ -32,6 +33,9 @@ export default function WorkspaceSettings() {
|
||||
<ManageHostname />
|
||||
</>
|
||||
)}
|
||||
|
||||
<Divider my="md" />
|
||||
<WorkspaceDefaultPageEditMode />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user