Skip to content

Commit 8758cf1

Browse files
authored
Merge pull request #399 from auth0/feat/sso-hide-prop
feat(react): add props to hide SSO provider actions
2 parents 876097c + 8c7e626 commit 8758cf1

9 files changed

Lines changed: 244 additions & 12 deletions

File tree

packages/react/src/components/auth0/my-organization/__tests__/sso-provider-edit.test.tsx

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,100 @@ describe('SsoProviderEdit', () => {
379379
});
380380
});
381381

382+
describe('hideProvisioningTab', () => {
383+
describe('when is true', () => {
384+
it('should not display provisioning tab', async () => {
385+
renderWithProviders(
386+
<SsoProviderEdit {...createMockSsoProviderEditProps({ hideProvisioningTab: true })} />,
387+
);
388+
389+
await waitForComponentToLoad();
390+
391+
expect(screen.queryByText(/tabs.provisioning.name/i)).not.toBeInTheDocument();
392+
});
393+
});
394+
395+
describe('when is false', () => {
396+
it('should display provisioning tab when enabled for strategy', async () => {
397+
renderWithProviders(
398+
<SsoProviderEdit {...createMockSsoProviderEditProps({ hideProvisioningTab: false })} />,
399+
);
400+
401+
await waitForComponentToLoad();
402+
403+
expect(screen.queryByText(/tabs.provisioning.name/i)).toBeInTheDocument();
404+
});
405+
});
406+
});
407+
408+
describe('hideDeleteProvider', () => {
409+
describe('when is true', () => {
410+
it('should not display delete provider button', async () => {
411+
renderWithProviders(
412+
<SsoProviderEdit {...createMockSsoProviderEditProps({ hideDeleteProvider: true })} />,
413+
);
414+
415+
await waitForComponentToLoad();
416+
417+
const deleteButtons = screen.queryAllByRole('button', {
418+
name: /delete_button_label/i,
419+
});
420+
expect(deleteButtons.length).toBe(0);
421+
});
422+
});
423+
424+
describe('when is false', () => {
425+
it('should display delete provider button', async () => {
426+
renderWithProviders(
427+
<SsoProviderEdit {...createMockSsoProviderEditProps({ hideDeleteProvider: false })} />,
428+
);
429+
430+
await waitForComponentToLoad();
431+
432+
const deleteButtons = screen.queryAllByRole('button', {
433+
name: /delete_button_label/i,
434+
});
435+
expect(deleteButtons.length).toBeGreaterThan(0);
436+
});
437+
});
438+
});
439+
440+
describe('hideRemoveFromOrganization', () => {
441+
describe('when is true', () => {
442+
it('should not display remove from organization button', async () => {
443+
renderWithProviders(
444+
<SsoProviderEdit
445+
{...createMockSsoProviderEditProps({ hideRemoveFromOrganization: true })}
446+
/>,
447+
);
448+
449+
await waitForComponentToLoad();
450+
451+
const removeButtons = screen.queryAllByRole('button', {
452+
name: /remove_button_label/i,
453+
});
454+
expect(removeButtons.length).toBe(0);
455+
});
456+
});
457+
458+
describe('when is false', () => {
459+
it('should display remove from organization button', async () => {
460+
renderWithProviders(
461+
<SsoProviderEdit
462+
{...createMockSsoProviderEditProps({ hideRemoveFromOrganization: false })}
463+
/>,
464+
);
465+
466+
await waitForComponentToLoad();
467+
468+
const removeButtons = screen.queryAllByRole('button', {
469+
name: /remove_button_label/i,
470+
});
471+
expect(removeButtons.length).toBeGreaterThan(0);
472+
});
473+
});
474+
});
475+
382476
describe('sso action props', () => {
383477
describe('when sso.updateAction is provided', () => {
384478
it('should call onBefore when toggling provider', async () => {

packages/react/src/components/auth0/my-organization/__tests__/sso-provider-table.test.tsx

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -809,6 +809,102 @@ describe('SsoProviderTable', () => {
809809
});
810810
});
811811
});
812+
813+
describe('hideDeleteProvider', () => {
814+
describe('when is true', () => {
815+
it('should not render delete action in dropdown menu', async () => {
816+
const user = userEvent.setup();
817+
818+
renderTable({ hideDeleteProvider: true });
819+
820+
await waitForComponentToLoad();
821+
await screen.findByText(mockProvider.name!);
822+
823+
const actionButtons = screen.getAllByRole('button');
824+
const rowActionButton = actionButtons.find(
825+
(btn) =>
826+
btn.querySelector('svg.lucide-more-horizontal') || btn.className.includes('rounded-xl'),
827+
);
828+
expect(rowActionButton).toBeDefined();
829+
await user.click(rowActionButton!);
830+
831+
expect(
832+
screen.queryByRole('menuitem', { name: /table.actions.delete_button_text/i }),
833+
).not.toBeInTheDocument();
834+
});
835+
});
836+
837+
describe('when is false', () => {
838+
it('should render delete action in dropdown menu', async () => {
839+
const user = userEvent.setup();
840+
841+
renderTable({ hideDeleteProvider: false });
842+
843+
await waitForComponentToLoad();
844+
await screen.findByText(mockProvider.name!);
845+
846+
const actionButtons = screen.getAllByRole('button');
847+
const rowActionButton = actionButtons.find(
848+
(btn) =>
849+
btn.querySelector('svg.lucide-more-horizontal') || btn.className.includes('rounded-xl'),
850+
);
851+
expect(rowActionButton).toBeDefined();
852+
await user.click(rowActionButton!);
853+
854+
expect(
855+
screen.queryByRole('menuitem', { name: /table.actions.delete_button_text/i }),
856+
).toBeInTheDocument();
857+
});
858+
});
859+
});
860+
861+
describe('hideRemoveFromOrganization', () => {
862+
describe('when is true', () => {
863+
it('should not render remove from organization action in dropdown menu', async () => {
864+
const user = userEvent.setup();
865+
866+
renderTable({ hideRemoveFromOrganization: true });
867+
868+
await waitForComponentToLoad();
869+
await screen.findByText(mockProvider.name!);
870+
871+
const actionButtons = screen.getAllByRole('button');
872+
const rowActionButton = actionButtons.find(
873+
(btn) =>
874+
btn.querySelector('svg.lucide-more-horizontal') || btn.className.includes('rounded-xl'),
875+
);
876+
expect(rowActionButton).toBeDefined();
877+
await user.click(rowActionButton!);
878+
879+
expect(
880+
screen.queryByRole('menuitem', { name: /table.actions.remove_button_text/i }),
881+
).not.toBeInTheDocument();
882+
});
883+
});
884+
885+
describe('when is false', () => {
886+
it('should render remove from organization action in dropdown menu', async () => {
887+
const user = userEvent.setup();
888+
889+
renderTable({ hideRemoveFromOrganization: false });
890+
891+
await waitForComponentToLoad();
892+
await screen.findByText(mockProvider.name!);
893+
894+
const actionButtons = screen.getAllByRole('button');
895+
const rowActionButton = actionButtons.find(
896+
(btn) =>
897+
btn.querySelector('svg.lucide-more-horizontal') || btn.className.includes('rounded-xl'),
898+
);
899+
expect(rowActionButton).toBeDefined();
900+
await user.click(rowActionButton!);
901+
902+
expect(
903+
screen.queryByRole('menuitem', { name: /table.actions.remove_button_text/i }),
904+
).toBeInTheDocument();
905+
});
906+
});
907+
});
812908
});
813909

814910
describe('SsoProviderTableView', () => {

packages/react/src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-tab.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ export function SsoProviderTab({
5353
isRemoving,
5454
idpConfig,
5555
shouldAllowDeletion,
56+
hideDeleteProvider = false,
57+
hideRemoveFromOrganization = false,
5658
formActions,
5759
hasSsoAttributeSyncWarning,
5860
onAttributeSync,
@@ -102,7 +104,7 @@ export function SsoProviderTab({
102104
</Card>
103105

104106
<div className="space-y-4">
105-
{provider && organization && (
107+
{provider && organization && !hideRemoveFromOrganization && (
106108
<SsoProviderRemoveFromOrganization
107109
provider={provider}
108110
organizationName={organization?.name}
@@ -113,7 +115,7 @@ export function SsoProviderTab({
113115
/>
114116
)}
115117

116-
{provider && shouldAllowDeletion && (
118+
{provider && shouldAllowDeletion && !hideDeleteProvider && (
117119
<SsoProviderDelete
118120
provider={provider}
119121
onDelete={onDelete}

packages/react/src/components/auth0/my-organization/shared/idp-management/sso-provider-table/sso-provider-table-action.tsx

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ import type { SsoProviderTableActionsColumnProps } from '@/types/my-organization
3939
export function SsoProviderTableActionsColumn({
4040
provider,
4141
shouldAllowDeletion,
42+
hideDeleteProvider = false,
43+
hideRemoveFromOrganization = false,
4244
readOnly = false,
4345
isUpdating = false,
4446
isUpdatingId,
@@ -99,7 +101,7 @@ export function SsoProviderTableActionsColumn({
99101
<Edit className="mr-2 h-4 w-4" />
100102
{t('table.actions.edit_button_text')}
101103
</DropdownMenuItem>
102-
{shouldAllowDeletion && (
104+
{shouldAllowDeletion && !hideDeleteProvider && (
103105
<DropdownMenuItem
104106
onClick={handleDelete}
105107
className="text-destructive-foreground focus:text-destructive-foreground"
@@ -109,14 +111,16 @@ export function SsoProviderTableActionsColumn({
109111
{t('table.actions.delete_button_text')}
110112
</DropdownMenuItem>
111113
)}
112-
<DropdownMenuItem
113-
onClick={handleRemoveFromOrganization}
114-
className="text-destructive-foreground focus:text-destructive-foreground"
115-
disabled={readOnly}
116-
>
117-
<Trash2 className="mr-2 h-4 w-4" />
118-
{t('table.actions.remove_button_text')}
119-
</DropdownMenuItem>
114+
{!hideRemoveFromOrganization && (
115+
<DropdownMenuItem
116+
onClick={handleRemoveFromOrganization}
117+
className="text-destructive-foreground focus:text-destructive-foreground"
118+
disabled={readOnly}
119+
>
120+
<Trash2 className="mr-2 h-4 w-4" />
121+
{t('table.actions.remove_button_text')}
122+
</DropdownMenuItem>
123+
)}
120124
</DropdownMenuContent>
121125
</DropdownMenuPortal>
122126
</DropdownMenu>

packages/react/src/components/auth0/my-organization/sso-provider-edit.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ import type {
3333
* @param props.provisioning - Provisioning configuration
3434
* @param props.domains - Array of domains
3535
* @param props.hideHeader - Whether to hide the header
36+
* @param props.hideProvisioningTab - Whether to hide the provisioning tab
37+
* @param props.hideDeleteProvider - Whether to hide the delete provider action
38+
* @param props.hideRemoveFromOrganization - Whether to hide the remove from organization action
3639
* @param props.customMessages - Custom translation messages to override defaults
3740
* @param props.styling - Custom styling configuration with variables and classes
3841
* @param props.schema - Zod validation schema
@@ -50,6 +53,9 @@ function SsoProviderEdit(props: SsoProviderEditProps) {
5053
provisioning,
5154
domains,
5255
hideHeader = false,
56+
hideProvisioningTab = false,
57+
hideDeleteProvider = false,
58+
hideRemoveFromOrganization = false,
5359
customMessages = {},
5460
styling = {
5561
variables: { common: {}, light: {}, dark: {} },
@@ -70,7 +76,7 @@ function SsoProviderEdit(props: SsoProviderEditProps) {
7076
...ssoProviderEdit,
7177
shouldAllowDeletion: ssoProviderEdit.shouldAllowDeletion,
7278
idpConfig: ssoProviderEdit.idpConfig,
73-
showProvisioningTab: ssoProviderEdit.showProvisioningTab,
79+
showProvisioningTab: ssoProviderEdit.showProvisioningTab && !hideProvisioningTab,
7480
styling,
7581
customMessages,
7682
backButton,
@@ -79,6 +85,9 @@ function SsoProviderEdit(props: SsoProviderEditProps) {
7985
providerId,
8086
domains,
8187
hideHeader,
88+
hideProvisioningTab,
89+
hideDeleteProvider,
90+
hideRemoveFromOrganization,
8291
};
8392

8493
const ssoProviderCreateHandlerProps: SsoProviderEditHandlerProps = {
@@ -126,6 +135,8 @@ function SsoProviderEditView({ logic, handlers }: SsoProviderEditViewProps) {
126135
providerId,
127136
domains,
128137
hideHeader,
138+
hideDeleteProvider,
139+
hideRemoveFromOrganization,
129140
provider,
130141
organization,
131142
isLoading,
@@ -231,6 +242,8 @@ function SsoProviderEditView({ logic, handlers }: SsoProviderEditViewProps) {
231242
isRemoving={isRemoving}
232243
idpConfig={idpConfig}
233244
shouldAllowDeletion={shouldAllowDeletion}
245+
hideDeleteProvider={hideDeleteProvider}
246+
hideRemoveFromOrganization={hideRemoveFromOrganization}
234247
hasSsoAttributeSyncWarning={hasSsoAttributeSyncWarning}
235248
onAttributeSync={syncSsoAttributes}
236249
isSyncingAttributes={isSsoAttributesSyncing}

packages/react/src/components/auth0/my-organization/sso-provider-table.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ import type {
3030
* @param props.customMessages - Custom translation messages to override defaults
3131
* @param props.styling - Custom styling configuration with variables and classes
3232
* @param props.readOnly - Whether the component is in read-only mode
33+
* @param props.hideDeleteProvider - Whether to hide the delete provider action
34+
* @param props.hideRemoveFromOrganization - Whether to hide the remove from organization action
3335
* @param props.createAction - Configuration for the create action
3436
* @param props.editAction - Configuration for the edit action
3537
* @param props.deleteAction - Configuration for the delete action
@@ -46,6 +48,8 @@ function SsoProviderTable(props: SsoProviderTableProps) {
4648
styling = { variables: { common: {}, light: {}, dark: {} }, classes: {} },
4749
readOnly = false,
4850
hideHeader = false,
51+
hideDeleteProvider = false,
52+
hideRemoveFromOrganization = false,
4953
createAction,
5054
editAction,
5155
deleteAction,
@@ -71,6 +75,8 @@ function SsoProviderTable(props: SsoProviderTableProps) {
7175
customMessages={customMessages}
7276
readOnly={readOnly}
7377
hideHeader={hideHeader}
78+
hideDeleteProvider={hideDeleteProvider}
79+
hideRemoveFromOrganization={hideRemoveFromOrganization}
7480
createAction={createAction}
7581
editAction={editAction}
7682
/>
@@ -89,6 +95,8 @@ function SsoProviderTableView({
8995
customMessages,
9096
readOnly,
9197
hideHeader,
98+
hideDeleteProvider,
99+
hideRemoveFromOrganization,
92100
providers,
93101
shouldHideCreate,
94102
isViewLoading,
@@ -153,6 +161,8 @@ function SsoProviderTableView({
153161
<SsoProviderTableActionsColumn
154162
provider={idp}
155163
shouldAllowDeletion={shouldAllowDeletion}
164+
hideDeleteProvider={hideDeleteProvider}
165+
hideRemoveFromOrganization={hideRemoveFromOrganization}
156166
readOnly={readOnly}
157167
isUpdating={isUpdating}
158168
isUpdatingId={isUpdatingId}
@@ -171,6 +181,8 @@ function SsoProviderTableView({
171181
readOnly,
172182
editAction,
173183
isUpdating,
184+
hideDeleteProvider,
185+
hideRemoveFromOrganization,
174186
handleEdit,
175187
handleDelete,
176188
handleDeleteFromOrganization,

packages/react/src/types/my-organization/idp-management/sso-provider/sso-provider-edit-types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ export interface SsoProviderEditProps
7878
SsoProviderEditSchema
7979
> {
8080
hideHeader?: boolean;
81+
hideProvisioningTab?: boolean;
82+
hideDeleteProvider?: boolean;
83+
hideRemoveFromOrganization?: boolean;
8184
providerId: IdpId;
8285
sso?: SsoProviderTabEditProps;
8386
provisioning?: SsoProvisioningTabEditProps;

0 commit comments

Comments
 (0)