diff --git a/.changeset/directory-sync-in-progress-state.md b/.changeset/directory-sync-in-progress-state.md
new file mode 100644
index 00000000000..7e9f2ca9054
--- /dev/null
+++ b/.changeset/directory-sync-in-progress-state.md
@@ -0,0 +1,7 @@
+---
+'@clerk/ui': patch
+'@clerk/localizations': patch
+'@clerk/shared': patch
+---
+
+Show a Google Workspace directory that still needs its service account credentials as **In Progress** in the `` Security tab, with a **Continue configuration** button that reopens the wizard at the credentials step. It used to read **Inactive** and offer **Activate**, which the server refuses until the credentials are stored. The wizard stepper also stops ticking the configure step before the credentials exist.
diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts
index c707911a13b..cc6bcb24875 100644
--- a/packages/localizations/src/ar-SA.ts
+++ b/packages/localizations/src/ar-SA.ts
@@ -1435,6 +1435,7 @@ export const arSA: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1444,6 +1445,7 @@ export const arSA: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts
index db7b9ca5650..db35590aee3 100644
--- a/packages/localizations/src/be-BY.ts
+++ b/packages/localizations/src/be-BY.ts
@@ -1438,6 +1438,7 @@ export const beBY: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1447,6 +1448,7 @@ export const beBY: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts
index fc88d5a762e..03c161688a1 100644
--- a/packages/localizations/src/bg-BG.ts
+++ b/packages/localizations/src/bg-BG.ts
@@ -1438,6 +1438,7 @@ export const bgBG: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1447,6 +1448,7 @@ export const bgBG: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts
index 7385f976b99..06a27fbffed 100644
--- a/packages/localizations/src/bn-IN.ts
+++ b/packages/localizations/src/bn-IN.ts
@@ -1445,6 +1445,7 @@ export const bnIN: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1454,6 +1455,7 @@ export const bnIN: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts
index 9225a3c42c5..dbb91553248 100644
--- a/packages/localizations/src/ca-ES.ts
+++ b/packages/localizations/src/ca-ES.ts
@@ -1445,6 +1445,7 @@ export const caES: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1454,6 +1455,7 @@ export const caES: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts
index cc16a2a3d70..6ef53a24654 100644
--- a/packages/localizations/src/cs-CZ.ts
+++ b/packages/localizations/src/cs-CZ.ts
@@ -1443,6 +1443,7 @@ export const csCZ: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1452,6 +1453,7 @@ export const csCZ: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts
index 362723d2869..5197353fed7 100644
--- a/packages/localizations/src/da-DK.ts
+++ b/packages/localizations/src/da-DK.ts
@@ -1436,6 +1436,7 @@ export const daDK: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1445,6 +1446,7 @@ export const daDK: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts
index 52ecf5ecb8b..87c49bf2c1f 100644
--- a/packages/localizations/src/de-DE.ts
+++ b/packages/localizations/src/de-DE.ts
@@ -1451,6 +1451,7 @@ export const deDE: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1460,6 +1461,7 @@ export const deDE: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts
index 5013b35ca5b..a7199a68e71 100644
--- a/packages/localizations/src/el-GR.ts
+++ b/packages/localizations/src/el-GR.ts
@@ -1441,6 +1441,7 @@ export const elGR: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1450,6 +1451,7 @@ export const elGR: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts
index a038681c897..34e69a1adf8 100644
--- a/packages/localizations/src/en-GB.ts
+++ b/packages/localizations/src/en-GB.ts
@@ -1437,6 +1437,7 @@ export const enGB: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1446,6 +1447,7 @@ export const enGB: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts
index b307ffe16d6..d61dafe03c3 100644
--- a/packages/localizations/src/en-US.ts
+++ b/packages/localizations/src/en-US.ts
@@ -1478,6 +1478,7 @@ export const enUS: LocalizationResource = {
},
directorySyncSection: {
badge__active: 'Active',
+ badge__inProgress: 'In Progress',
badge__inactive: 'Inactive',
badge__ssoRequired: 'SSO required',
description: 'Keep organization members synced with your identity provider. Requires an SSO connection.',
@@ -1487,6 +1488,7 @@ export const enUS: LocalizationResource = {
menuAction__edit: 'Edit',
menuAction__remove: 'Remove',
primaryButton__configure: 'Configure',
+ primaryButton__continueConfiguration: 'Continue configuration',
removeDialog: {
confirmButton: 'Remove Directory Sync',
subtitle:
diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts
index ed06e9d92f1..04a386cf958 100644
--- a/packages/localizations/src/es-CR.ts
+++ b/packages/localizations/src/es-CR.ts
@@ -1441,6 +1441,7 @@ export const esCR: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1450,6 +1451,7 @@ export const esCR: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts
index cff65d2b6a5..8b1a24379e1 100644
--- a/packages/localizations/src/es-ES.ts
+++ b/packages/localizations/src/es-ES.ts
@@ -1446,6 +1446,7 @@ export const esES: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1455,6 +1456,7 @@ export const esES: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts
index 2e6d7e4256d..8fb003e5d1d 100644
--- a/packages/localizations/src/es-MX.ts
+++ b/packages/localizations/src/es-MX.ts
@@ -1442,6 +1442,7 @@ export const esMX: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1451,6 +1452,7 @@ export const esMX: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts
index 395d82d04e4..e18ff1e9f95 100644
--- a/packages/localizations/src/es-UY.ts
+++ b/packages/localizations/src/es-UY.ts
@@ -1440,6 +1440,7 @@ export const esUY: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1449,6 +1450,7 @@ export const esUY: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts
index 38ce6f62bba..4da9da82d5a 100644
--- a/packages/localizations/src/fa-IR.ts
+++ b/packages/localizations/src/fa-IR.ts
@@ -1445,6 +1445,7 @@ export const faIR: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1454,6 +1455,7 @@ export const faIR: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts
index 5e68744f92e..7fa50bbf739 100644
--- a/packages/localizations/src/fi-FI.ts
+++ b/packages/localizations/src/fi-FI.ts
@@ -1446,6 +1446,7 @@ export const fiFI: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1455,6 +1456,7 @@ export const fiFI: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts
index b10aa5e3a60..241d4413dc8 100644
--- a/packages/localizations/src/fr-FR.ts
+++ b/packages/localizations/src/fr-FR.ts
@@ -1451,6 +1451,7 @@ export const frFR: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1460,6 +1461,7 @@ export const frFR: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts
index 76d4e71749c..50c500777c2 100644
--- a/packages/localizations/src/he-IL.ts
+++ b/packages/localizations/src/he-IL.ts
@@ -1432,6 +1432,7 @@ export const heIL: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1441,6 +1442,7 @@ export const heIL: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts
index a15280fb922..5a6e641ca32 100644
--- a/packages/localizations/src/hi-IN.ts
+++ b/packages/localizations/src/hi-IN.ts
@@ -1445,6 +1445,7 @@ export const hiIN: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1454,6 +1455,7 @@ export const hiIN: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts
index 898e1668daf..4c68a68b662 100644
--- a/packages/localizations/src/hr-HR.ts
+++ b/packages/localizations/src/hr-HR.ts
@@ -1446,6 +1446,7 @@ export const hrHR: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1455,6 +1456,7 @@ export const hrHR: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts
index ba75bd80414..07c29c97027 100644
--- a/packages/localizations/src/hu-HU.ts
+++ b/packages/localizations/src/hu-HU.ts
@@ -1447,6 +1447,7 @@ export const huHU: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1456,6 +1457,7 @@ export const huHU: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts
index 7b35077a8b8..c88cc1899d8 100644
--- a/packages/localizations/src/id-ID.ts
+++ b/packages/localizations/src/id-ID.ts
@@ -1439,6 +1439,7 @@ export const idID: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1448,6 +1449,7 @@ export const idID: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts
index f015eed4f00..853bd1405a7 100644
--- a/packages/localizations/src/is-IS.ts
+++ b/packages/localizations/src/is-IS.ts
@@ -1446,6 +1446,7 @@ export const isIS: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1455,6 +1456,7 @@ export const isIS: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts
index 4044db1665a..ede4430afa3 100644
--- a/packages/localizations/src/it-IT.ts
+++ b/packages/localizations/src/it-IT.ts
@@ -1446,6 +1446,7 @@ export const itIT: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1455,6 +1456,7 @@ export const itIT: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts
index e0298371964..df4a6d30f41 100644
--- a/packages/localizations/src/ja-JP.ts
+++ b/packages/localizations/src/ja-JP.ts
@@ -1445,6 +1445,7 @@ export const jaJP: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1454,6 +1455,7 @@ export const jaJP: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts
index 8a51cb18eca..250070598f8 100644
--- a/packages/localizations/src/kk-KZ.ts
+++ b/packages/localizations/src/kk-KZ.ts
@@ -1432,6 +1432,7 @@ export const kkKZ: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1441,6 +1442,7 @@ export const kkKZ: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts
index abec99a1dff..81462f5cf1d 100644
--- a/packages/localizations/src/ko-KR.ts
+++ b/packages/localizations/src/ko-KR.ts
@@ -1437,6 +1437,7 @@ export const koKR: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1446,6 +1447,7 @@ export const koKR: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts
index 64c73cef2a1..72ce4e86f0f 100644
--- a/packages/localizations/src/mn-MN.ts
+++ b/packages/localizations/src/mn-MN.ts
@@ -1439,6 +1439,7 @@ export const mnMN: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1448,6 +1449,7 @@ export const mnMN: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts
index 99c926f3155..36474eb7264 100644
--- a/packages/localizations/src/ms-MY.ts
+++ b/packages/localizations/src/ms-MY.ts
@@ -1448,6 +1448,7 @@ export const msMY: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1457,6 +1458,7 @@ export const msMY: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts
index 0ebbf9b3315..0cc7d8dc0f8 100644
--- a/packages/localizations/src/nb-NO.ts
+++ b/packages/localizations/src/nb-NO.ts
@@ -1447,6 +1447,7 @@ export const nbNO: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1456,6 +1457,7 @@ export const nbNO: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts
index a82b79edd58..be1ec57368a 100644
--- a/packages/localizations/src/nl-BE.ts
+++ b/packages/localizations/src/nl-BE.ts
@@ -1439,6 +1439,7 @@ export const nlBE: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1448,6 +1449,7 @@ export const nlBE: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts
index cf305556832..7467461927b 100644
--- a/packages/localizations/src/nl-NL.ts
+++ b/packages/localizations/src/nl-NL.ts
@@ -1439,6 +1439,7 @@ export const nlNL: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1448,6 +1449,7 @@ export const nlNL: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts
index 19eed5d20d3..e4d197108ee 100644
--- a/packages/localizations/src/pl-PL.ts
+++ b/packages/localizations/src/pl-PL.ts
@@ -1437,6 +1437,7 @@ export const plPL: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1446,6 +1447,7 @@ export const plPL: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts
index 0b265682603..2400dbca93f 100644
--- a/packages/localizations/src/pt-BR.ts
+++ b/packages/localizations/src/pt-BR.ts
@@ -1447,6 +1447,7 @@ export const ptBR: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1456,6 +1457,7 @@ export const ptBR: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts
index 72e81ceabb0..2e0177ff852 100644
--- a/packages/localizations/src/pt-PT.ts
+++ b/packages/localizations/src/pt-PT.ts
@@ -1447,6 +1447,7 @@ export const ptPT: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1456,6 +1457,7 @@ export const ptPT: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts
index d8515f1b2ae..29bc66a9dfb 100644
--- a/packages/localizations/src/ro-RO.ts
+++ b/packages/localizations/src/ro-RO.ts
@@ -1447,6 +1447,7 @@ export const roRO: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1456,6 +1457,7 @@ export const roRO: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts
index 3af75fb03eb..ec9ad272576 100644
--- a/packages/localizations/src/ru-RU.ts
+++ b/packages/localizations/src/ru-RU.ts
@@ -1441,6 +1441,7 @@ export const ruRU: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1450,6 +1451,7 @@ export const ruRU: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts
index 1dcc2f679d6..f0199e5ed22 100644
--- a/packages/localizations/src/sk-SK.ts
+++ b/packages/localizations/src/sk-SK.ts
@@ -1437,6 +1437,7 @@ export const skSK: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1446,6 +1447,7 @@ export const skSK: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts
index 77c45b2f883..0a7325260c1 100644
--- a/packages/localizations/src/sr-RS.ts
+++ b/packages/localizations/src/sr-RS.ts
@@ -1437,6 +1437,7 @@ export const srRS: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1446,6 +1447,7 @@ export const srRS: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts
index cec06c14be5..81d650821fe 100644
--- a/packages/localizations/src/sv-SE.ts
+++ b/packages/localizations/src/sv-SE.ts
@@ -1437,6 +1437,7 @@ export const svSE: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1446,6 +1447,7 @@ export const svSE: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts
index 5dbb4287d9c..f7971dff8eb 100644
--- a/packages/localizations/src/ta-IN.ts
+++ b/packages/localizations/src/ta-IN.ts
@@ -1450,6 +1450,7 @@ export const taIN: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1459,6 +1460,7 @@ export const taIN: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts
index 341a072a8c1..d6a2ba18690 100644
--- a/packages/localizations/src/te-IN.ts
+++ b/packages/localizations/src/te-IN.ts
@@ -1447,6 +1447,7 @@ export const teIN: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1456,6 +1457,7 @@ export const teIN: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts
index 51dcfa5b0e9..08816e8eade 100644
--- a/packages/localizations/src/th-TH.ts
+++ b/packages/localizations/src/th-TH.ts
@@ -1438,6 +1438,7 @@ export const thTH: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1447,6 +1448,7 @@ export const thTH: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts
index 50d01c57240..dd65bb3f036 100644
--- a/packages/localizations/src/tr-TR.ts
+++ b/packages/localizations/src/tr-TR.ts
@@ -1437,6 +1437,7 @@ export const trTR: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1446,6 +1447,7 @@ export const trTR: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts
index 9125e2b878c..6f3de557fb1 100644
--- a/packages/localizations/src/uk-UA.ts
+++ b/packages/localizations/src/uk-UA.ts
@@ -1437,6 +1437,7 @@ export const ukUA: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1446,6 +1447,7 @@ export const ukUA: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts
index 1b5a87abe44..47f0d45ce9e 100644
--- a/packages/localizations/src/vi-VN.ts
+++ b/packages/localizations/src/vi-VN.ts
@@ -1445,6 +1445,7 @@ export const viVN: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1454,6 +1455,7 @@ export const viVN: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts
index 3e65172457b..bb8708b609b 100644
--- a/packages/localizations/src/zh-CN.ts
+++ b/packages/localizations/src/zh-CN.ts
@@ -1430,6 +1430,7 @@ export const zhCN: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1439,6 +1440,7 @@ export const zhCN: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts
index 3d905a96077..b3c0bad7e4a 100644
--- a/packages/localizations/src/zh-TW.ts
+++ b/packages/localizations/src/zh-TW.ts
@@ -1433,6 +1433,7 @@ export const zhTW: LocalizationResource = {
},
directorySyncSection: {
badge__active: undefined,
+ badge__inProgress: undefined,
badge__inactive: undefined,
badge__ssoRequired: undefined,
description: undefined,
@@ -1442,6 +1443,7 @@ export const zhTW: LocalizationResource = {
menuAction__edit: undefined,
menuAction__remove: undefined,
primaryButton__configure: undefined,
+ primaryButton__continueConfiguration: undefined,
removeDialog: {
confirmButton: undefined,
subtitle: undefined,
diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts
index 446d328a8e5..b4f1be6a9b8 100644
--- a/packages/shared/src/types/localization.ts
+++ b/packages/shared/src/types/localization.ts
@@ -1351,10 +1351,12 @@ export type __internal_LocalizationResource = {
title: LocalizationValue;
badge__ssoRequired: LocalizationValue;
badge__active: LocalizationValue;
+ badge__inProgress: LocalizationValue;
badge__inactive: LocalizationValue;
description: LocalizationValue;
error__load: LocalizationValue;
primaryButton__configure: LocalizationValue;
+ primaryButton__continueConfiguration: LocalizationValue;
menuAction__edit: LocalizationValue;
menuAction__activate: LocalizationValue;
menuAction__deactivate: LocalizationValue;
diff --git a/packages/ui/src/components/ConfigureDirectorySync/ConfigureDirectorySyncWizard.tsx b/packages/ui/src/components/ConfigureDirectorySync/ConfigureDirectorySyncWizard.tsx
index 61b2cf7cfa5..ab277d3263a 100644
--- a/packages/ui/src/components/ConfigureDirectorySync/ConfigureDirectorySyncWizard.tsx
+++ b/packages/ui/src/components/ConfigureDirectorySync/ConfigureDirectorySyncWizard.tsx
@@ -34,16 +34,19 @@ export const ConfigureDirectorySyncWizard = (props: ConfigureDirectorySyncWizard
);
const WizardInternal = ({ title }: ConfigureDirectorySyncWizardProps): JSX.Element => {
- const { connection, directory, isLoading } = useConfigureDirectorySync();
+ const { connection, directory, providerMeta, isLoading } = useConfigureDirectorySync();
const hasSsoConnection = Boolean(connection);
const hasDirectory = Boolean(directory);
+ // A pull directory exists before its credentials do, and the configure step
+ // is where they are collected, so it is not done until they are stored.
+ const hasCredentials = providerMeta?.mode !== 'pull' || Boolean(directory?.credentialsConfigured);
const steps = React.useMemo(
() => [
{
id: 'configure',
label: localizationKeys('configureDirectorySync.stepper.configure'),
- isComplete: () => hasSsoConnection && hasDirectory,
+ isComplete: () => hasSsoConnection && hasDirectory && hasCredentials,
},
{
id: 'attributes',
@@ -61,7 +64,7 @@ const WizardInternal = ({ title }: ConfigureDirectorySyncWizardProps): JSX.Eleme
isReachable: () => hasSsoConnection && hasDirectory,
},
],
- [hasSsoConnection, hasDirectory],
+ [hasSsoConnection, hasDirectory, hasCredentials],
);
if (isLoading) {
diff --git a/packages/ui/src/components/ConfigureDirectorySync/SecurityDirectorySyncSection.tsx b/packages/ui/src/components/ConfigureDirectorySync/SecurityDirectorySyncSection.tsx
index 60871ff550f..4af1cf9c7b0 100644
--- a/packages/ui/src/components/ConfigureDirectorySync/SecurityDirectorySyncSection.tsx
+++ b/packages/ui/src/components/ConfigureDirectorySync/SecurityDirectorySyncSection.tsx
@@ -23,12 +23,17 @@ type SecurityDirectorySyncSectionProps = {
onConfigure: () => void;
};
-type DirectorySyncStatus = 'unconfigured' | 'active' | 'inactive';
+type DirectorySyncStatus = 'unconfigured' | 'in_progress' | 'active' | 'inactive';
+type ConfiguredDirectorySyncStatus = Exclude;
const STATUS_BADGES: Record<
- Exclude,
+ ConfiguredDirectorySyncStatus,
{ colorScheme: 'primary' | 'success' | 'warning'; label: LocalizationKey }
> = {
+ in_progress: {
+ colorScheme: 'primary',
+ label: localizationKeys('organizationProfile.securityPage.directorySyncSection.badge__inProgress'),
+ },
active: {
colorScheme: 'primary',
label: localizationKeys('organizationProfile.securityPage.directorySyncSection.badge__active'),
@@ -69,7 +74,16 @@ export const SecurityDirectorySyncSection = ({
const isLoading = isLoadingConnections || (Boolean(connection) && isLoadingDirectory);
const error = connectionsError ?? directoryError;
- const status: DirectorySyncStatus = directory ? (directory.enabled ? 'active' : 'inactive') : 'unconfigured';
+ // A pull directory (Google Workspace) exists before its credentials do and
+ // cannot be enabled until they are stored, so that outranks the enabled flag,
+ // as in the SSO section. Push providers get `null` here: not applicable.
+ const status: DirectorySyncStatus = !directory
+ ? 'unconfigured'
+ : directory.credentialsConfigured === false
+ ? 'in_progress'
+ : directory.enabled
+ ? 'active'
+ : 'inactive';
return (
updateDirectorySync({ enabled })}
onDelete={deleteDirectorySync}
organizationName={organizationName}
@@ -137,7 +151,7 @@ export const SecurityDirectorySyncSection = ({
};
type ConfiguredContentProps = {
- isActive: boolean;
+ status: ConfiguredDirectorySyncStatus;
updateEnabled: (enabled: boolean) => Promise;
onDelete: () => Promise;
organizationName: string;
@@ -146,7 +160,7 @@ type ConfiguredContentProps = {
};
const ConfiguredContent = ({
- isActive,
+ status,
updateEnabled,
onDelete,
organizationName,
@@ -173,7 +187,7 @@ const ConfiguredContent = ({
}
};
- const badge = STATUS_BADGES[isActive ? 'active' : 'inactive'];
+ const badge = STATUS_BADGES[status];
return (
@@ -194,19 +208,30 @@ const ConfiguredContent = ({
label: localizationKeys('organizationProfile.securityPage.directorySyncSection.menuAction__edit'),
onClick: onConfigure,
},
- isActive
- ? {
- label: localizationKeys(
- 'organizationProfile.securityPage.directorySyncSection.menuAction__deactivate',
- ),
- isDisabled: card.isLoading,
- onClick: () => void handleUpdateEnabled(false),
- }
- : {
- label: localizationKeys('organizationProfile.securityPage.directorySyncSection.menuAction__activate'),
- isDisabled: card.isLoading,
- onClick: () => void handleUpdateEnabled(true),
- },
+ // Activate is only offered where it can succeed: the server refuses
+ // it for an in-progress directory until the credentials are stored.
+ ...(status === 'active'
+ ? [
+ {
+ label: localizationKeys(
+ 'organizationProfile.securityPage.directorySyncSection.menuAction__deactivate',
+ ),
+ isDisabled: card.isLoading,
+ onClick: () => void handleUpdateEnabled(false),
+ },
+ ]
+ : []),
+ ...(status === 'inactive'
+ ? [
+ {
+ label: localizationKeys(
+ 'organizationProfile.securityPage.directorySyncSection.menuAction__activate',
+ ),
+ isDisabled: card.isLoading,
+ onClick: () => void handleUpdateEnabled(true),
+ },
+ ]
+ : []),
{
label: localizationKeys('organizationProfile.securityPage.directorySyncSection.menuAction__remove'),
isDestructive: true,
@@ -216,6 +241,19 @@ const ConfiguredContent = ({
/>
+ {status === 'in_progress' && (
+
+
+ ({ paddingInlineStart: `calc(${t.space.$2x5} + ${t.sizes.$4} + ${t.space.$2})` })} />
+
+ )}
+
{card.error}
{
expect(screen.getByText('Not configured')).toBeInTheDocument();
});
+ it.each([
+ { credentialsConfigured: false, ticked: 0, outcome: 'leaves the configure step unticked' },
+ { credentialsConfigured: true, ticked: 1, outcome: 'ticks the configure step' },
+ ])(
+ 'for a Google Workspace directory with credentialsConfigured=$credentialsConfigured, $outcome',
+ async ({ credentialsConfigured, ticked }) => {
+ const { wrapper, fixtures } = await createFixtures(withDirectorySyncFixtures);
+ fixtures.clerk.organization?.getEnterpriseConnections.mockResolvedValue([googleConnection]);
+ fixtures.clerk.organization?.getDirectorySync.mockResolvedValue(googleDirectory({ credentialsConfigured }));
+
+ const { container } = render(, { wrapper });
+
+ await screen.findByRole('button', { name: 'Upload JSON key' });
+
+ // The stepper used to tick step 1 as soon as the directory row existed,
+ // which for Google is before the credentials it collects are stored. A
+ // completed bullet renders a checkmark instead of its digit.
+ const bullets = Array.from(container.querySelectorAll('.cl-configureSSOStepperItemBullet'));
+ expect(bullets).toHaveLength(4);
+ expect(bullets.filter(el => !/\d/.test(el.textContent ?? ''))).toHaveLength(ticked);
+ },
+ );
+
it('sends the uploaded key and admin email, and does not keep the key afterwards', async () => {
const { wrapper, fixtures } = await createFixtures(withDirectorySyncFixtures);
fixtures.clerk.organization?.getEnterpriseConnections.mockResolvedValue([googleConnection]);
diff --git a/packages/ui/src/components/OrganizationProfile/__tests__/OrganizationSecurityPage.test.tsx b/packages/ui/src/components/OrganizationProfile/__tests__/OrganizationSecurityPage.test.tsx
index 81f9ca5f8db..a6a24441c66 100644
--- a/packages/ui/src/components/OrganizationProfile/__tests__/OrganizationSecurityPage.test.tsx
+++ b/packages/ui/src/components/OrganizationProfile/__tests__/OrganizationSecurityPage.test.tsx
@@ -631,6 +631,69 @@ describe('OrganizationSecurityPage', () => {
).not.toBeInTheDocument();
});
+ it('shows a Google Workspace directory without credentials as In Progress with Continue configuration', async () => {
+ const { wrapper, fixtures } = await createFixtures(withDirectorySyncFixtures);
+ withActiveConnection(fixtures);
+ fixtures.clerk.organization?.getEnterpriseConnections.mockResolvedValue([
+ configuredConnection({ active: true, provider: 'saml_google' }),
+ ]);
+ fixtures.clerk.organization?.getDirectorySync.mockResolvedValue(
+ directory({ provider: 'google', enabled: false, credentialsConfigured: false }),
+ );
+
+ const { userEvent } = renderPage(wrapper);
+
+ // The row used to read "Inactive" and offer Activate, which the server
+ // refuses until the service account key is stored, so the admin saw a
+ // dead switch instead of the step still to do.
+ expect(await screen.findByText('In Progress')).toBeInTheDocument();
+ expect(section('directorySync').queryByText('Inactive')).not.toBeInTheDocument();
+ expect(section('directorySync').getByRole('button', { name: 'Continue configuration' })).toBeEnabled();
+
+ await openDirectorySyncMenu(userEvent);
+
+ expect(screen.getByRole('menuitem', { name: 'Edit' })).toBeInTheDocument();
+ expect(screen.getByRole('menuitem', { name: 'Remove' })).toBeInTheDocument();
+ expect(screen.queryByRole('menuitem', { name: 'Activate' })).not.toBeInTheDocument();
+ expect(screen.queryByRole('menuitem', { name: 'Deactivate' })).not.toBeInTheDocument();
+ });
+
+ it('opens the Directory Sync wizard from Continue configuration', async () => {
+ const { wrapper, fixtures } = await createFixtures(withDirectorySyncFixtures);
+ withActiveConnection(fixtures);
+ fixtures.clerk.organization?.getEnterpriseConnections.mockResolvedValue([
+ configuredConnection({ active: true, provider: 'saml_google' }),
+ ]);
+ fixtures.clerk.organization?.getDirectorySync.mockResolvedValue(
+ directory({ provider: 'google', enabled: false, credentialsConfigured: false }),
+ );
+
+ const { userEvent } = renderPage(wrapper);
+
+ await userEvent.click(await screen.findByRole('button', { name: 'Continue configuration' }));
+
+ // The wizard replaces the overview, so the row menu goes away.
+ await waitFor(() => expect(screen.queryByRole('button', { name: /open menu/i })).not.toBeInTheDocument());
+ });
+
+ it('keeps Activate for a disabled push directory, whose credentials do not apply', async () => {
+ const { wrapper, fixtures } = await createFixtures(withDirectorySyncFixtures);
+ withActiveConnection(fixtures);
+ fixtures.clerk.organization?.getDirectorySync.mockResolvedValue(
+ directory({ enabled: false, credentialsConfigured: null }),
+ );
+
+ const { userEvent } = renderPage(wrapper);
+
+ // The SSO connection above is active, so "Inactive" can only be the directory badge.
+ expect(await screen.findByText('Inactive')).toBeInTheDocument();
+ expect(screen.queryByRole('button', { name: 'Continue configuration' })).not.toBeInTheDocument();
+
+ await openDirectorySyncMenu(userEvent);
+
+ expect(screen.getByRole('menuitem', { name: 'Activate' })).toBeInTheDocument();
+ });
+
it('lists Edit and Deactivate for an active directory', async () => {
const { wrapper, fixtures } = await createFixtures(withDirectorySyncFixtures);
withActiveConnection(fixtures);