Skip to content

Commit 0df31a8

Browse files
resolve: merge conflict
2 parents 34db14b + f1d87b3 commit 0df31a8

File tree

6 files changed

+157
-65
lines changed

6 files changed

+157
-65
lines changed

apps/admin/app/(all)/(dashboard)/authentication/gitea/form.tsx

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { CodeBlock } from "@/components/common/code-block";
1212
import { ConfirmDiscardModal } from "@/components/common/confirm-discard-modal";
1313
import type { TControllerInputFormField } from "@/components/common/controller-input";
1414
import { ControllerInput } from "@/components/common/controller-input";
15+
import type { TControllerSwitchFormField } from "@/components/common/controller-switch";
16+
import { ControllerSwitch } from "@/components/common/controller-switch";
1517
import type { TCopyField } from "@/components/common/copy-field";
1618
import { CopyField } from "@/components/common/copy-field";
1719
// hooks
@@ -40,6 +42,7 @@ export function InstanceGiteaConfigForm(props: Props) {
4042
GITEA_HOST: config["GITEA_HOST"] || "https://gitea.com",
4143
GITEA_CLIENT_ID: config["GITEA_CLIENT_ID"],
4244
GITEA_CLIENT_SECRET: config["GITEA_CLIENT_SECRET"],
45+
ENABLE_GITEA_SYNC: config["ENABLE_GITEA_SYNC"],
4346
},
4447
});
4548

@@ -103,6 +106,11 @@ export function InstanceGiteaConfigForm(props: Props) {
103106
},
104107
];
105108

109+
const GITEA_FORM_SWITCH_FIELD: TControllerSwitchFormField<GiteaConfigFormValues> = {
110+
name: "ENABLE_GITEA_SYNC",
111+
label: "Gitea",
112+
};
113+
106114
const GITEA_SERVICE_FIELD: TCopyField[] = [
107115
{
108116
key: "Callback_URI",
@@ -129,20 +137,22 @@ export function InstanceGiteaConfigForm(props: Props) {
129137
const onSubmit = async (formData: GiteaConfigFormValues) => {
130138
const payload: Partial<GiteaConfigFormValues> = { ...formData };
131139

132-
await updateInstanceConfigurations(payload)
133-
.then((response = []) => {
134-
setToast({
135-
type: TOAST_TYPE.SUCCESS,
136-
title: "Done!",
137-
message: "Your Gitea authentication is configured. You should test it now.",
138-
});
139-
reset({
140-
GITEA_HOST: response.find((item) => item.key === "GITEA_HOST")?.value,
141-
GITEA_CLIENT_ID: response.find((item) => item.key === "GITEA_CLIENT_ID")?.value,
142-
GITEA_CLIENT_SECRET: response.find((item) => item.key === "GITEA_CLIENT_SECRET")?.value,
143-
});
144-
})
145-
.catch((err) => console.error(err));
140+
try {
141+
const response = await updateInstanceConfigurations(payload);
142+
setToast({
143+
type: TOAST_TYPE.SUCCESS,
144+
title: "Done!",
145+
message: "Your Gitea authentication is configured. You should test it now.",
146+
});
147+
reset({
148+
GITEA_HOST: response.find((item) => item.key === "GITEA_HOST")?.value,
149+
GITEA_CLIENT_ID: response.find((item) => item.key === "GITEA_CLIENT_ID")?.value,
150+
GITEA_CLIENT_SECRET: response.find((item) => item.key === "GITEA_CLIENT_SECRET")?.value,
151+
ENABLE_GITEA_SYNC: response.find((item) => item.key === "ENABLE_GITEA_SYNC")?.value,
152+
});
153+
} catch (err) {
154+
console.error(err);
155+
}
146156
};
147157

148158
const handleGoBack = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {
@@ -176,12 +186,12 @@ export function InstanceGiteaConfigForm(props: Props) {
176186
required={field.required}
177187
/>
178188
))}
189+
<ControllerSwitch control={control} field={GITEA_FORM_SWITCH_FIELD} />
179190
<div className="flex flex-col gap-1 pt-4">
180191
<div className="flex items-center gap-4">
181192
<Button
182193
variant="primary"
183-
size="lg"
184-
onClick={handleSubmit(onSubmit)}
194+
onClick={(e) => void handleSubmit(onSubmit)(e)}
185195
loading={isSubmitting}
186196
disabled={!isDirty}
187197
>

apps/admin/app/(all)/(dashboard)/authentication/github/form.tsx

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import { cn } from "@plane/utils";
1414
import { CodeBlock } from "@/components/common/code-block";
1515
import { ConfirmDiscardModal } from "@/components/common/confirm-discard-modal";
1616
import type { TControllerInputFormField } from "@/components/common/controller-input";
17+
import type { TControllerSwitchFormField } from "@/components/common/controller-switch";
18+
import { ControllerSwitch } from "@/components/common/controller-switch";
1719
import { ControllerInput } from "@/components/common/controller-input";
1820
import type { TCopyField } from "@/components/common/copy-field";
1921
import { CopyField } from "@/components/common/copy-field";
@@ -43,6 +45,7 @@ export function InstanceGithubConfigForm(props: Props) {
4345
GITHUB_CLIENT_ID: config["GITHUB_CLIENT_ID"],
4446
GITHUB_CLIENT_SECRET: config["GITHUB_CLIENT_SECRET"],
4547
GITHUB_ORGANIZATION_ID: config["GITHUB_ORGANIZATION_ID"],
48+
ENABLE_GITHUB_SYNC: config["ENABLE_GITHUB_SYNC"],
4649
},
4750
});
4851

@@ -104,6 +107,11 @@ export function InstanceGithubConfigForm(props: Props) {
104107
},
105108
];
106109

110+
const GITHUB_FORM_SWITCH_FIELD: TControllerSwitchFormField<GithubConfigFormValues> = {
111+
name: "ENABLE_GITHUB_SYNC",
112+
label: "GitHub",
113+
};
114+
107115
const GITHUB_COMMON_SERVICE_DETAILS: TCopyField[] = [
108116
{
109117
key: "Origin_URL",
@@ -152,20 +160,22 @@ export function InstanceGithubConfigForm(props: Props) {
152160
const onSubmit = async (formData: GithubConfigFormValues) => {
153161
const payload: Partial<GithubConfigFormValues> = { ...formData };
154162

155-
await updateInstanceConfigurations(payload)
156-
.then((response = []) => {
157-
setToast({
158-
type: TOAST_TYPE.SUCCESS,
159-
title: "Done!",
160-
message: "Your GitHub authentication is configured. You should test it now.",
161-
});
162-
reset({
163-
GITHUB_CLIENT_ID: response.find((item) => item.key === "GITHUB_CLIENT_ID")?.value,
164-
GITHUB_CLIENT_SECRET: response.find((item) => item.key === "GITHUB_CLIENT_SECRET")?.value,
165-
GITHUB_ORGANIZATION_ID: response.find((item) => item.key === "GITHUB_ORGANIZATION_ID")?.value,
166-
});
167-
})
168-
.catch((err) => console.error(err));
163+
try {
164+
const response = await updateInstanceConfigurations(payload);
165+
setToast({
166+
type: TOAST_TYPE.SUCCESS,
167+
title: "Done!",
168+
message: "Your GitHub authentication is configured. You should test it now.",
169+
});
170+
reset({
171+
GITHUB_CLIENT_ID: response.find((item) => item.key === "GITHUB_CLIENT_ID")?.value,
172+
GITHUB_CLIENT_SECRET: response.find((item) => item.key === "GITHUB_CLIENT_SECRET")?.value,
173+
GITHUB_ORGANIZATION_ID: response.find((item) => item.key === "GITHUB_ORGANIZATION_ID")?.value,
174+
ENABLE_GITHUB_SYNC: response.find((item) => item.key === "ENABLE_GITHUB_SYNC")?.value,
175+
});
176+
} catch (err) {
177+
console.error(err);
178+
}
169179
};
170180

171181
const handleGoBack = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {
@@ -199,12 +209,13 @@ export function InstanceGithubConfigForm(props: Props) {
199209
required={field.required}
200210
/>
201211
))}
212+
<ControllerSwitch control={control} field={GITHUB_FORM_SWITCH_FIELD} />
202213
<div className="flex flex-col gap-1 pt-4">
203214
<div className="flex items-center gap-4">
204215
<Button
205216
variant="primary"
206217
size="lg"
207-
onClick={handleSubmit(onSubmit)}
218+
onClick={(e) => void handleSubmit(onSubmit)(e)}
208219
loading={isSubmitting}
209220
disabled={!isDirty}
210221
>

apps/admin/app/(all)/(dashboard)/authentication/gitlab/form.tsx

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { cn } from "@plane/utils";
1212
import { CodeBlock } from "@/components/common/code-block";
1313
import { ConfirmDiscardModal } from "@/components/common/confirm-discard-modal";
1414
import type { TControllerInputFormField } from "@/components/common/controller-input";
15+
import type { TControllerSwitchFormField } from "@/components/common/controller-switch";
16+
import { ControllerSwitch } from "@/components/common/controller-switch";
1517
import { ControllerInput } from "@/components/common/controller-input";
1618
import type { TCopyField } from "@/components/common/copy-field";
1719
import { CopyField } from "@/components/common/copy-field";
@@ -41,6 +43,7 @@ export function InstanceGitlabConfigForm(props: Props) {
4143
GITLAB_HOST: config["GITLAB_HOST"],
4244
GITLAB_CLIENT_ID: config["GITLAB_CLIENT_ID"],
4345
GITLAB_CLIENT_SECRET: config["GITLAB_CLIENT_SECRET"],
46+
ENABLE_GITLAB_SYNC: config["ENABLE_GITLAB_SYNC"],
4447
},
4548
});
4649

@@ -108,6 +111,11 @@ export function InstanceGitlabConfigForm(props: Props) {
108111
},
109112
];
110113

114+
const GITLAB_FORM_SWITCH_FIELD: TControllerSwitchFormField<GitlabConfigFormValues> = {
115+
name: "ENABLE_GITLAB_SYNC",
116+
label: "GitLab",
117+
};
118+
111119
const GITLAB_SERVICE_FIELD: TCopyField[] = [
112120
{
113121
key: "Callback_URL",
@@ -134,20 +142,22 @@ export function InstanceGitlabConfigForm(props: Props) {
134142
const onSubmit = async (formData: GitlabConfigFormValues) => {
135143
const payload: Partial<GitlabConfigFormValues> = { ...formData };
136144

137-
await updateInstanceConfigurations(payload)
138-
.then((response = []) => {
139-
setToast({
140-
type: TOAST_TYPE.SUCCESS,
141-
title: "Done!",
142-
message: "Your GitLab authentication is configured. You should test it now.",
143-
});
144-
reset({
145-
GITLAB_HOST: response.find((item) => item.key === "GITLAB_HOST")?.value,
146-
GITLAB_CLIENT_ID: response.find((item) => item.key === "GITLAB_CLIENT_ID")?.value,
147-
GITLAB_CLIENT_SECRET: response.find((item) => item.key === "GITLAB_CLIENT_SECRET")?.value,
148-
});
149-
})
150-
.catch((err) => console.error(err));
145+
try {
146+
const response = await updateInstanceConfigurations(payload);
147+
setToast({
148+
type: TOAST_TYPE.SUCCESS,
149+
title: "Done!",
150+
message: "Your GitLab authentication is configured. You should test it now.",
151+
});
152+
reset({
153+
GITLAB_HOST: response.find((item) => item.key === "GITLAB_HOST")?.value,
154+
GITLAB_CLIENT_ID: response.find((item) => item.key === "GITLAB_CLIENT_ID")?.value,
155+
GITLAB_CLIENT_SECRET: response.find((item) => item.key === "GITLAB_CLIENT_SECRET")?.value,
156+
ENABLE_GITLAB_SYNC: response.find((item) => item.key === "ENABLE_GITLAB_SYNC")?.value,
157+
});
158+
} catch (err) {
159+
console.error(err);
160+
}
151161
};
152162

153163
const handleGoBack = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {
@@ -181,12 +191,13 @@ export function InstanceGitlabConfigForm(props: Props) {
181191
required={field.required}
182192
/>
183193
))}
194+
<ControllerSwitch control={control} field={GITLAB_FORM_SWITCH_FIELD} />
184195
<div className="flex flex-col gap-1 pt-4">
185196
<div className="flex items-center gap-4">
186197
<Button
187198
variant="primary"
188199
size="lg"
189-
onClick={handleSubmit(onSubmit)}
200+
onClick={(e) => void handleSubmit(onSubmit)(e)}
190201
loading={isSubmitting}
191202
disabled={!isDirty}
192203
>

apps/admin/app/(all)/(dashboard)/authentication/google/form.tsx

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import { cn } from "@plane/utils";
1313
import { CodeBlock } from "@/components/common/code-block";
1414
import { ConfirmDiscardModal } from "@/components/common/confirm-discard-modal";
1515
import type { TControllerInputFormField } from "@/components/common/controller-input";
16+
import type { TControllerSwitchFormField } from "@/components/common/controller-switch";
17+
import { ControllerSwitch } from "@/components/common/controller-switch";
1618
import { ControllerInput } from "@/components/common/controller-input";
1719
import type { TCopyField } from "@/components/common/copy-field";
1820
import { CopyField } from "@/components/common/copy-field";
@@ -41,6 +43,7 @@ export function InstanceGoogleConfigForm(props: Props) {
4143
defaultValues: {
4244
GOOGLE_CLIENT_ID: config["GOOGLE_CLIENT_ID"],
4345
GOOGLE_CLIENT_SECRET: config["GOOGLE_CLIENT_SECRET"],
46+
ENABLE_GOOGLE_SYNC: config["ENABLE_GOOGLE_SYNC"],
4447
},
4548
});
4649

@@ -93,6 +96,11 @@ export function InstanceGoogleConfigForm(props: Props) {
9396
},
9497
];
9598

99+
const GOOGLE_FORM_SWITCH_FIELD: TControllerSwitchFormField<GoogleConfigFormValues> = {
100+
name: "ENABLE_GOOGLE_SYNC",
101+
label: "Google",
102+
};
103+
96104
const GOOGLE_COMMON_SERVICE_DETAILS: TCopyField[] = [
97105
{
98106
key: "Origin_URL",
@@ -140,19 +148,21 @@ export function InstanceGoogleConfigForm(props: Props) {
140148
const onSubmit = async (formData: GoogleConfigFormValues) => {
141149
const payload: Partial<GoogleConfigFormValues> = { ...formData };
142150

143-
await updateInstanceConfigurations(payload)
144-
.then((response = []) => {
145-
setToast({
146-
type: TOAST_TYPE.SUCCESS,
147-
title: "Done!",
148-
message: "Your Google authentication is configured. You should test it now.",
149-
});
150-
reset({
151-
GOOGLE_CLIENT_ID: response.find((item) => item.key === "GOOGLE_CLIENT_ID")?.value,
152-
GOOGLE_CLIENT_SECRET: response.find((item) => item.key === "GOOGLE_CLIENT_SECRET")?.value,
153-
});
154-
})
155-
.catch((err) => console.error(err));
151+
try {
152+
const response = await updateInstanceConfigurations(payload);
153+
setToast({
154+
type: TOAST_TYPE.SUCCESS,
155+
title: "Done!",
156+
message: "Your Google authentication is configured. You should test it now.",
157+
});
158+
reset({
159+
GOOGLE_CLIENT_ID: response.find((item) => item.key === "GOOGLE_CLIENT_ID")?.value,
160+
GOOGLE_CLIENT_SECRET: response.find((item) => item.key === "GOOGLE_CLIENT_SECRET")?.value,
161+
ENABLE_GOOGLE_SYNC: response.find((item) => item.key === "ENABLE_GOOGLE_SYNC")?.value,
162+
});
163+
} catch (err) {
164+
console.error(err);
165+
}
156166
};
157167

158168
const handleGoBack = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {
@@ -186,12 +196,13 @@ export function InstanceGoogleConfigForm(props: Props) {
186196
required={field.required}
187197
/>
188198
))}
199+
<ControllerSwitch control={control} field={GOOGLE_FORM_SWITCH_FIELD} />
189200
<div className="flex flex-col gap-1 pt-4">
190201
<div className="flex items-center gap-4">
191202
<Button
192203
variant="primary"
193204
size="lg"
194-
onClick={handleSubmit(onSubmit)}
205+
onClick={(e) => void handleSubmit(onSubmit)(e)}
195206
loading={isSubmitting}
196207
disabled={!isDirty}
197208
>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import type { Control, FieldPath, FieldValues } from "react-hook-form";
2+
import { Controller } from "react-hook-form";
3+
// plane internal packages
4+
import { ToggleSwitch } from "@plane/ui";
5+
6+
type Props<T extends FieldValues = FieldValues> = {
7+
control: Control<T>;
8+
field: TControllerSwitchFormField<T>;
9+
};
10+
11+
export type TControllerSwitchFormField<T extends FieldValues = FieldValues> = {
12+
name: FieldPath<T>;
13+
label: string;
14+
};
15+
16+
export function ControllerSwitch<T extends FieldValues>(props: Props<T>) {
17+
const {
18+
control,
19+
field: { name, label },
20+
} = props;
21+
22+
return (
23+
<div className="flex items-center justify-between gap-1">
24+
<h4 className="text-sm text-custom-text-300">Refresh user attributes from {label} during sign in</h4>
25+
<div className="relative">
26+
<Controller
27+
control={control}
28+
name={name as FieldPath<T>}
29+
render={({ field: { value, onChange } }) => (
30+
<ToggleSwitch
31+
value={Boolean(parseInt(value))}
32+
onChange={() => (Boolean(parseInt(value)) === true ? onChange("0") : onChange("1"))}
33+
size="sm"
34+
/>
35+
)}
36+
/>
37+
</div>
38+
</div>
39+
);
40+
}

packages/types/src/instance/auth.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,28 @@ export type TInstanceAuthenticationMethodKeys =
1616
| "IS_GITLAB_ENABLED"
1717
| "IS_GITEA_ENABLED";
1818

19-
export type TInstanceGoogleAuthenticationConfigurationKeys = "GOOGLE_CLIENT_ID" | "GOOGLE_CLIENT_SECRET";
19+
export type TInstanceGoogleAuthenticationConfigurationKeys =
20+
| "GOOGLE_CLIENT_ID"
21+
| "GOOGLE_CLIENT_SECRET"
22+
| "ENABLE_GOOGLE_SYNC";
2023

2124
export type TInstanceGithubAuthenticationConfigurationKeys =
2225
| "GITHUB_CLIENT_ID"
2326
| "GITHUB_CLIENT_SECRET"
24-
| "GITHUB_ORGANIZATION_ID";
27+
| "GITHUB_ORGANIZATION_ID"
28+
| "ENABLE_GITHUB_SYNC";
2529

2630
export type TInstanceGitlabAuthenticationConfigurationKeys =
2731
| "GITLAB_HOST"
2832
| "GITLAB_CLIENT_ID"
29-
| "GITLAB_CLIENT_SECRET";
30-
31-
export type TInstanceGiteaAuthenticationConfigurationKeys = "GITEA_HOST" | "GITEA_CLIENT_ID" | "GITEA_CLIENT_SECRET";
33+
| "GITLAB_CLIENT_SECRET"
34+
| "ENABLE_GITLAB_SYNC";
35+
36+
export type TInstanceGiteaAuthenticationConfigurationKeys =
37+
| "GITEA_HOST"
38+
| "GITEA_CLIENT_ID"
39+
| "GITEA_CLIENT_SECRET"
40+
| "ENABLE_GITEA_SYNC";
3241

3342
export type TInstanceAuthenticationConfigurationKeys =
3443
| TInstanceGoogleAuthenticationConfigurationKeys

0 commit comments

Comments
 (0)