Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/dashboard/src/teams/policies/EditorOptions.tsx
2501 views
1
/**
2
* Copyright (c) 2025 Gitpod GmbH. All rights reserved.
3
* Licensed under the GNU Affero General Public License (AGPL).
4
* See License.AGPL.txt in the project root for license information.
5
*/
6
7
import { OrganizationSettings } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
8
import { Button } from "@podkit/buttons/Button";
9
import { useMutation } from "@tanstack/react-query";
10
import { useState } from "react";
11
import { IdeOptionsModifyModalProps, IdeOptions, IdeOptionsModifyModal } from "../../components/IdeOptions";
12
import { Heading3, Subheading } from "../../components/typography/headings";
13
import { useAllowedWorkspaceEditorsMemo } from "../../data/ide-options/ide-options-query";
14
import { ConfigurationSettingsField } from "../../repositories/detail/ConfigurationSettingsField";
15
16
type Props = {
17
settings: OrganizationSettings | undefined;
18
isOwner: boolean;
19
handleUpdateTeamSettings: (
20
newSettings: Partial<OrganizationSettings>,
21
options?: { throwMutateError?: boolean },
22
) => Promise<void>;
23
};
24
export const EditorOptions = ({ isOwner, settings, handleUpdateTeamSettings }: Props) => {
25
const [showModal, setShowModal] = useState(false);
26
const { data: installationOptions, isLoading: installationOptionsIsLoading } = useAllowedWorkspaceEditorsMemo(
27
undefined,
28
{
29
filterOutDisabled: true,
30
ignoreScope: ["organization", "configuration"],
31
},
32
);
33
const { data: orgOptions, isLoading: orgOptionsIsLoading } = useAllowedWorkspaceEditorsMemo(undefined, {
34
filterOutDisabled: true,
35
ignoreScope: ["configuration"],
36
});
37
38
const updateMutation: IdeOptionsModifyModalProps["updateMutation"] = useMutation({
39
mutationFn: async ({ restrictedEditors, pinnedEditorVersions }) => {
40
const updatedRestrictedEditors = [...restrictedEditors.keys()];
41
const updatedPinnedEditorVersions = Object.fromEntries(pinnedEditorVersions.entries());
42
43
await handleUpdateTeamSettings(
44
{ restrictedEditorNames: updatedRestrictedEditors, pinnedEditorVersions: updatedPinnedEditorVersions },
45
{ throwMutateError: true },
46
);
47
},
48
});
49
50
const restrictedEditors = new Set<string>(settings?.restrictedEditorNames || []);
51
const pinnedEditorVersions = new Map<string, string>(Object.entries(settings?.pinnedEditorVersions || {}));
52
53
return (
54
<ConfigurationSettingsField>
55
<Heading3>Available editors</Heading3>
56
<Subheading>
57
Limit the available editors in your organization. Requires <span className="font-medium">Owner</span>{" "}
58
permissions to change.
59
</Subheading>
60
61
<IdeOptions
62
isLoading={orgOptionsIsLoading}
63
className="mt-4"
64
ideOptions={orgOptions}
65
pinnedEditorVersions={pinnedEditorVersions}
66
/>
67
68
{isOwner && (
69
<Button className="mt-6" onClick={() => setShowModal(true)}>
70
Manage Editors
71
</Button>
72
)}
73
74
{showModal && (
75
<IdeOptionsModifyModal
76
isLoading={installationOptionsIsLoading}
77
ideOptions={installationOptions}
78
restrictedEditors={restrictedEditors}
79
pinnedEditorVersions={pinnedEditorVersions}
80
updateMutation={updateMutation}
81
onClose={() => setShowModal(false)}
82
/>
83
)}
84
</ConfigurationSettingsField>
85
);
86
};
87
88