Skip to content

Commit 9b13421

Browse files
committed
Properly do partial org opts
Unfortunately, this entails having a duplicate `OnboardingSettings` message specified in the proto definition Tool: gitpod/catfood.gitpod.cloud
1 parent 5009281 commit 9b13421

File tree

14 files changed

+2915
-633
lines changed

14 files changed

+2915
-633
lines changed

components/dashboard/src/data/organizations/update-org-settings-mutation.ts

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,25 @@ import { useOrgWorkspaceClassesQueryInvalidator } from "./org-workspace-classes-
1414
import { PlainMessage } from "@bufbuild/protobuf";
1515
import { useOrgRepoSuggestionsInvalidator } from "./suggested-repositories-query";
1616

17-
type UpdateOrganizationSettingsArgs = Partial<
18-
Pick<
19-
PlainMessage<OrganizationSettings>,
20-
| "workspaceSharingDisabled"
21-
| "defaultWorkspaceImage"
22-
| "allowedWorkspaceClasses"
23-
| "pinnedEditorVersions"
24-
| "restrictedEditorNames"
25-
| "defaultRole"
26-
| "timeoutSettings"
27-
| "roleRestrictions"
28-
| "maxParallelRunningWorkspaces"
29-
| "onboardingSettings"
30-
| "annotateGitCommits"
31-
>
17+
export type UpdateOrganizationSettingsArgs = Partial<
18+
Omit<
19+
Pick<
20+
PlainMessage<OrganizationSettings>,
21+
| "workspaceSharingDisabled"
22+
| "defaultWorkspaceImage"
23+
| "allowedWorkspaceClasses"
24+
| "pinnedEditorVersions"
25+
| "restrictedEditorNames"
26+
| "defaultRole"
27+
| "timeoutSettings"
28+
| "roleRestrictions"
29+
| "maxParallelRunningWorkspaces"
30+
| "annotateGitCommits"
31+
>,
32+
never
33+
> & {
34+
onboardingSettings?: Partial<PlainMessage<OrganizationSettings>["onboardingSettings"]>; // this enables us to not have to specify all of the onboarding settings on every update
35+
}
3236
>;
3337

3438
export const useUpdateOrgSettingsMutation = () => {
@@ -66,7 +70,10 @@ export const useUpdateOrgSettingsMutation = () => {
6670
roleRestrictions,
6771
updateRoleRestrictions: !!roleRestrictions,
6872
maxParallelRunningWorkspaces,
69-
onboardingSettings,
73+
onboardingSettings: {
74+
...onboardingSettings,
75+
updateRecommendedRepositories: !!onboardingSettings?.recommendedRepositories,
76+
},
7077
annotateGitCommits,
7178
});
7279
return settings.settings!;

components/dashboard/src/repositories/list/RepositoryTable.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export const RepositoryTable: FC<Props> = ({
6969
await updateTeamSettings.mutateAsync(
7070
{
7171
onboardingSettings: {
72+
...settings?.onboardingSettings,
7273
recommendedRepositories: [...newRepositories],
7374
},
7475
},

components/dashboard/src/teams/TeamOnboarding.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@
44
* See License.AGPL.txt in the project root for license information.
55
*/
66

7-
import { OrganizationSettings } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
87
import { FormEvent, useCallback, useEffect, useState } from "react";
98
import { Heading2, Heading3, Subheading } from "../components/typography/headings";
109
import { useIsOwner } from "../data/organizations/members-query";
1110
import { useOrgSettingsQuery } from "../data/organizations/org-settings-query";
1211
import { useCurrentOrg } from "../data/organizations/orgs-query";
13-
import { useUpdateOrgSettingsMutation } from "../data/organizations/update-org-settings-mutation";
12+
import {
13+
UpdateOrganizationSettingsArgs,
14+
useUpdateOrgSettingsMutation,
15+
} from "../data/organizations/update-org-settings-mutation";
1416
import { OrgSettingsPage } from "./OrgSettingsPage";
1517
import { ConfigurationSettingsField } from "../repositories/detail/ConfigurationSettingsField";
1618
import { useDocumentTitle } from "../hooks/use-document-title";
1719
import { useToast } from "../components/toasts/Toasts";
18-
import type { PlainMessage } from "@bufbuild/protobuf";
1920
import { InputField } from "../components/forms/InputField";
2021
import { TextInput } from "../components/forms/TextInputField";
2122
import { LoadingButton } from "@podkit/buttons/LoadingButton";
@@ -44,7 +45,7 @@ export default function TeamOnboardingPage() {
4445
const [internalLink, setInternalLink] = useState<string | undefined>(undefined);
4546

4647
const handleUpdateTeamSettings = useCallback(
47-
async (newSettings: Partial<PlainMessage<OrganizationSettings>>, options?: UpdateTeamSettingsOptions) => {
48+
async (newSettings: UpdateOrganizationSettingsArgs, options?: UpdateTeamSettingsOptions) => {
4849
if (!org?.id) {
4950
throw new Error("no organization selected");
5051
}
@@ -74,12 +75,12 @@ export default function TeamOnboardingPage() {
7475

7576
await handleUpdateTeamSettings({
7677
onboardingSettings: {
78+
...settings?.onboardingSettings,
7779
internalLink,
78-
recommendedRepositories: settings?.onboardingSettings?.recommendedRepositories ?? [],
7980
},
8081
});
8182
},
82-
[handleUpdateTeamSettings, internalLink, settings?.onboardingSettings?.recommendedRepositories],
83+
[handleUpdateTeamSettings, internalLink, settings?.onboardingSettings],
8384
);
8485

8586
useEffect(() => {

components/dashboard/src/teams/onboarding/OrgMemberAvatarInput.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
import { useState } from "react";
88
import { useListOrganizationMembers } from "../../data/organizations/members-query";
99

10-
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@podkit/dropdown/DropDown";
11-
import { Button } from "@podkit/buttons/Button";
1210
import type { OnboardingSettings_WelcomeMessage } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
11+
import { Button } from "@podkit/buttons/Button";
12+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@podkit/dropdown/DropDown";
1313

1414
type Props = {
1515
settings: OnboardingSettings_WelcomeMessage | undefined;

components/dashboard/src/teams/onboarding/OrganizationJoinModal.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,11 @@
44
* See License.AGPL.txt in the project root for license information.
55
*/
66

7+
import { OrganizationSettings } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
78
import { Button } from "@podkit/buttons/Button";
8-
import { ModalHeader } from "../../components/Modal";
9-
import { ModalBody } from "../../components/Modal";
10-
import { ModalFooter } from "../../components/Modal";
11-
import { Modal } from "../../components/Modal";
12-
import { useMemo, useCallback, useState, useEffect } from "react";
9+
import { useCallback, useEffect, useMemo, useState } from "react";
10+
import { Modal, ModalBody, ModalFooter, ModalHeader } from "../../components/Modal";
1311
import { storageAvailable } from "../../utils";
14-
import { OrganizationSettings } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
1512
import { WelcomeMessagePreview } from "./WelcomeMessagePreview";
1613

1714
type Props = {

components/dashboard/src/teams/onboarding/WelcomeMessageConfigurationField.tsx

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,30 @@
44
* See License.AGPL.txt in the project root for license information.
55
*/
66

7+
import { PlainMessage } from "@bufbuild/protobuf";
8+
import type { OnboardingSettings_WelcomeMessage } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
9+
import { SwitchInputField } from "@podkit/switch/Switch";
710
import { Heading3, Subheading } from "@podkit/typography/Headings";
8-
import { ConfigurationSettingsField } from "../../repositories/detail/ConfigurationSettingsField";
9-
import { useOrgSettingsQuery } from "../../data/organizations/org-settings-query";
11+
import { useCallback, useState } from "react";
12+
import { InputField } from "../../components/forms/InputField";
1013
import { useToast } from "../../components/toasts/Toasts";
1114
import { useIsOwner } from "../../data/organizations/members-query";
12-
import { useUpdateOrgSettingsMutation } from "../../data/organizations/update-org-settings-mutation";
13-
import { InputField } from "../../components/forms/InputField";
14-
import { SwitchInputField } from "@podkit/switch/Switch";
15+
import { useOrgSettingsQuery } from "../../data/organizations/org-settings-query";
16+
import {
17+
UpdateOrganizationSettingsArgs,
18+
useUpdateOrgSettingsMutation,
19+
} from "../../data/organizations/update-org-settings-mutation";
20+
import { ConfigurationSettingsField } from "../../repositories/detail/ConfigurationSettingsField";
21+
import { UpdateTeamSettingsOptions } from "../TeamOnboarding";
1522
import { WelcomeMessageEditorModal } from "./WelcomeMessageEditor";
1623
import { WelcomeMessagePreview } from "./WelcomeMessagePreview";
17-
import { useCallback, useState } from "react";
18-
import type {
19-
OnboardingSettings_WelcomeMessage,
20-
OrganizationSettings,
21-
} from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
22-
import { PlainMessage } from "@bufbuild/protobuf";
23-
import { UpdateTeamSettingsOptions } from "../TeamOnboarding";
2424

2525
export const gitpodWelcomeSubheading =
2626
`Gitpod’s sandboxed, ephemeral development environments enable you to use your existing tools without worrying about vulnerabilities impacting their local machines.` as const;
2727

2828
type Props = {
2929
handleUpdateTeamSettings: (
30-
newSettings: Partial<PlainMessage<OrganizationSettings>>,
30+
newSettings: UpdateOrganizationSettingsArgs,
3131
options?: UpdateTeamSettingsOptions,
3232
) => Promise<void>;
3333
};
@@ -48,17 +48,12 @@ export const WelcomeMessageConfigurationField = ({ handleUpdateTeamSettings }: P
4848
...settings?.onboardingSettings?.welcomeMessage,
4949
...newSettings,
5050
},
51-
recommendedRepositories: settings?.onboardingSettings?.recommendedRepositories ?? [],
5251
},
5352
},
5453
options,
5554
);
5655
},
57-
[
58-
handleUpdateTeamSettings,
59-
settings?.onboardingSettings?.recommendedRepositories,
60-
settings?.onboardingSettings?.welcomeMessage,
61-
],
56+
[handleUpdateTeamSettings, settings?.onboardingSettings?.welcomeMessage],
6257
);
6358

6459
return (

components/dashboard/src/teams/onboarding/WelcomeMessageEditor.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ import { Button } from "@podkit/buttons/Button";
1010
import { LoadingButton } from "@podkit/buttons/LoadingButton";
1111
import { Textarea } from "@podkit/forms/TextArea";
1212
import { FormEvent, useCallback, useState } from "react";
13+
import Alert from "../../components/Alert";
1314
import { Modal, ModalBody, ModalFooter, ModalHeader } from "../../components/Modal";
1415
import { InputField } from "../../components/forms/InputField";
1516
import { TextInput } from "../../components/forms/TextInputField";
17+
import { UpdateTeamSettingsOptions } from "../TeamOnboarding";
1618
import { OrgMemberAvatarInput } from "./OrgMemberAvatarInput";
1719
import { gitpodWelcomeSubheading } from "./WelcomeMessageConfigurationField";
18-
import { UpdateTeamSettingsOptions } from "../TeamOnboarding";
19-
import Alert from "../../components/Alert";
2020

2121
type Props = {
2222
settings: OnboardingSettings_WelcomeMessage | undefined;

components/dashboard/src/teams/onboarding/WelcomeMessagePreview.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@
44
* See License.AGPL.txt in the project root for license information.
55
*/
66

7-
import { Subheading } from "@podkit/typography/Headings";
8-
import { Heading2 } from "@podkit/typography/Headings";
97
import { Button } from "@podkit/buttons/Button";
10-
import { useOrgSettingsQuery } from "../../data/organizations/org-settings-query";
11-
import { gitpodWelcomeSubheading } from "../TeamOnboarding";
8+
import { Heading2, Subheading } from "@podkit/typography/Headings";
129
import Markdown from "react-markdown";
10+
import { useOrgSettingsQuery } from "../../data/organizations/org-settings-query";
11+
import { gitpodWelcomeSubheading } from "./WelcomeMessageConfigurationField";
1312

1413
type Props = {
1514
disabled?: boolean;

components/public-api/gitpod/v1/organization.proto

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ message OnboardingSettings {
5959
// featured_member_id is the ID of the member to show in the welcome message
6060
optional string featured_member_id = 4;
6161

62-
// featured_member_resolved_avatar_url is the avatar URL that is resolved from the featured_member_id by the server. Do not set this field manually.
62+
// featured_member_resolved_avatar_url is the avatar URL that is resolved from the featured_member_id by the server
6363
optional string featured_member_resolved_avatar_url = 5;
6464
}
6565

@@ -169,6 +169,23 @@ message TimeoutSettings {
169169
}
170170

171171
message UpdateOrganizationSettingsRequest {
172+
message OnboardingSettings {
173+
message WelcomeMessage {
174+
optional bool enabled = 1;
175+
optional string message = 2;
176+
optional string featured_member_id = 3;
177+
}
178+
179+
optional string internal_link = 1;
180+
181+
// update_recommended_repositories specifies whether recommended_repositories should be updated
182+
// this is necessary because proto 3 doesn't support optional repeated fields. Will not be specified in server responses.
183+
optional bool update_recommended_repositories = 2;
184+
repeated string recommended_repositories = 3;
185+
186+
optional WelcomeMessage welcome_message = 4;
187+
}
188+
172189
// organization_id is the ID of the organization to update the settings for
173190
string organization_id = 1;
174191

0 commit comments

Comments
 (0)