Skip to content

Web UI: Integrations Enroll redesign#58421

Merged
alexhemard merged 16 commits intomasterfrom
alexhemard/integration-redesign
Sep 10, 2025
Merged

Web UI: Integrations Enroll redesign#58421
alexhemard merged 16 commits intomasterfrom
alexhemard/integration-redesign

Conversation

@alexhemard
Copy link
Copy Markdown
Contributor

@alexhemard alexhemard commented Aug 27, 2025

Description

Resolves: #57612
e PR: https://github.com/gravitational/teleport.e/pull/7144

Implements new Integration Enrollment design

  • New tile design
  • Adds Sorting, Filtering by search string, tags
  • 'Add New Bot' redirects to Integration page with Bots filter applied
  • New AWS Icons

Demo

enroll.mp4

Notes

Will need a followup PR to clean up 'old design' Components after e update is merged

Changelog: Updated Enroll Integration page design

@github-actions github-actions bot requested review from gzdunek and kimlisa August 27, 2025 22:25
@alexhemard alexhemard force-pushed the alexhemard/integration-redesign branch from 8f18f4a to 9862b13 Compare August 28, 2025 19:29
@kimlisa
Copy link
Copy Markdown
Contributor

kimlisa commented Aug 28, 2025

haven't looked at the code yet, i just did some QA testing:

  1. In community edition the filter types for device trust, notification, and scim gives me empty result. These are enterprise features. Do we want to render these tiles and have requires upgrading to enterprise CTA like others? Or should we not render these types in the dropdown? I'd lean towards rendering with CTA to stay consistent... but i'd double check with UX folks

  2. When i click on filters, my URL includes pinnedOnly=false which doesn't make sense since we don't support pinning

  3. A guided plugin tile once enrolled converts to self-hosted tile. We have like 4 different types of tiles: disabled requires upgrade or RBAC, self-hosted (click out to guide), guided + once enrolled prevent clicking tile to see guide (eg: slack), guided + once enroll retain click behavior (eg: okta)

  4. Stories inside teleport > integrations > enroll > picker and teleporte > integrations > picker are broken

  5. If you enter a invalid kind in the URL, it is silently ignored with no results (at least in the unified resources page it errors out saying what's wrong b/c there is a validation in the backend). in session recording page, invalid types are just removed from the URL since it's client filtering (i'd lean towards this behavior)

  6. if you hover over a disabled tile, it loses its border:

image

Copy link
Copy Markdown
Contributor

@gzdunek gzdunek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First pass.

Comment thread web/packages/teleport/src/Bots/Add/AddBots.tsx Outdated
Comment thread web/packages/teleport/src/Integrations/Enroll/Shared/FilterPanel.tsx Outdated
Comment thread web/packages/teleport/src/Integrations/Enroll/Shared/FilterPanel.tsx Outdated
Comment thread web/packages/teleport/src/Integrations/Enroll/Shared/FilterPanel.tsx Outdated
}}
>
<Icons.Magnifier size={16} color="text.slightlyMuted" />
<StyledInput
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The input is showing previously submitted values, I'd set autoComplete="off" on it.

Image

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about this comment? :)

Comment thread web/packages/teleport/src/Integrations/Enroll/Shared/FilterPanel.tsx Outdated
Comment thread web/packages/teleport/src/Integrations/Enroll/Shared/FilterPanel.tsx Outdated
Comment thread web/packages/teleport/src/Integrations/Enroll/Shared/IntegrationPicker.tsx Outdated
Comment thread web/packages/teleport/src/Integrations/Enroll/Shared/Tile.tsx Outdated
@alexhemard
Copy link
Copy Markdown
Contributor Author

When i click on filters, my URL includes pinnedOnly=false which doesn't make sense since we don't support pinning

@kimlisa This is leveraging the useUrlFiltering hook and it's appending the isPinned param. There's a check to add the URL param if it's defined, but there's a default parameter of false, so always gets added.

This also pops up in Access Lists search

pinnedonly

Seems like removing the default false option would prevent this behavior or should I roll my own url query filtering if useUrlFiltering is not appropriate here 🤔

@public-teleport-github-review-bot
Copy link
Copy Markdown

@alexhemard - this PR will require admin approval to merge due to its size. Consider breaking it up into a series smaller changes.

@alexhemard alexhemard force-pushed the alexhemard/integration-redesign branch from 6b3d816 to c90f1b2 Compare September 2, 2025 16:14
@alexhemard
Copy link
Copy Markdown
Contributor Author

Pushed changes:

  • Replaced DebouncedSearchInput with DataTable.Input
  • Replaced useUrlFiltering with invalid tag filtering
  • Enrolled plugin no longer displays as self-hosted
  • misc feedback, cleanup

@alexhemard alexhemard requested a review from gzdunek September 2, 2025 16:28
);
}

export function useIntegrationPickerState(): [
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Callout: This is mostly repurposed from https://github.com/gravitational/teleport/blob/master/web/packages/teleport/src/SessionRecordings/list/state.ts but this hook feels like it could be generic 🤔

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be a good idea to try this if it’s not too much work. But I'd do this outside this PR, since it's already quite large.

hasAccess={true}
icon={integration.icon}
link={{ url: integration.link, onClick: onBotClick }}
renderBadge={renderBadge}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this could a regular component, not a function returning component, since we don't pass any arguments to it.

Comment thread web/packages/teleport/src/Integrations/Enroll/Shared/filters.ts Outdated
Comment thread web/packages/teleport/src/Integrations/Enroll/Shared/common.tsx Outdated
Comment thread web/packages/teleport/src/Integrations/Enroll/Shared/Tile.tsx Outdated
Comment thread web/packages/teleport/src/Integrations/Enroll/Shared/Tile.tsx Outdated
Comment thread web/packages/teleport/src/Integrations/Enroll/Shared/state.ts Outdated
);
}

export function useIntegrationPickerState(): [
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be a good idea to try this if it’s not too much work. But I'd do this outside this PR, since it's already quite large.

Copy link
Copy Markdown
Contributor

@kimlisa kimlisa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we're almost there

This is leveraging the useUrlFiltering hook and it's appending the isPinned param.

we make mistakes, this is one of those that got overlooked both by dev and code reviewers. i wouldn't rely on existing code and patterns to be always the best or accurate, i would always question it.

in fact, that access list isPinned got noticed by another dev who is working on something related and is in the process of fixing it. similarly if you notice anything odd (or notice any bug), ask in #dev-frontend or create an issue for it tagged with ui

Comment on lines +34 to +37
<Redirect
path={cfg.getBotsNewRoute()}
to={`${cfg.getIntegrationEnrollRoute()}?tags=bot`}
/>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

with this change, the bot nav section on click doesn't get highlighted like in the bottom image

image

before your changes:

image

Copy link
Copy Markdown
Contributor Author

@alexhemard alexhemard Sep 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kimlisa Should this have a link out icon since it redirects to the Integrations page?

image

Existing shortcut

image

Proposed

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think there are unused components and or functions in this file, can you double check?

i would put a // TODO(alexhemard): delete in a follow up PR to mark things for deletion later

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🙌

@alexhemard alexhemard force-pushed the alexhemard/integration-redesign branch from 1d22628 to a6bee7a Compare September 4, 2025 20:13
placeholder="Search for integrations..."
/>
</Box>
<Flex justifyContent="space-between" minWidth="419px">
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is rather a low level component, it probably shouldn't set the min width for the page.

Comment on lines +155 to +157
<BadgeSelfHosted>
Self-Hosted
<NewTab size={14} ml={1} color="text.slightlyMuted" />
</BadgeSelfHosted>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The text and the icon should be aligned.

}}
>
<Icons.Magnifier size={16} color="text.slightlyMuted" />
<StyledInput
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about this comment? :)

@alexhemard alexhemard force-pushed the alexhemard/integration-redesign branch from 9de9468 to 0aab927 Compare September 5, 2025 20:54
@alexhemard
Copy link
Copy Markdown
Contributor Author

Added filtering tags for enterprise features if they don't have a matching integration

Screenshot 2025-09-05 at 3 50 03 PM

OSS

Screenshot 2025-09-05 at 3 50 20 PM

Enterprise

@alexhemard alexhemard force-pushed the alexhemard/integration-redesign branch from 0aab927 to bb6186e Compare September 8, 2025 16:34
@alexhemard alexhemard force-pushed the alexhemard/integration-redesign branch from bb6186e to d5a557d Compare September 9, 2025 19:31
@alexhemard alexhemard requested a review from r0mant September 10, 2025 14:10
@alexhemard alexhemard added this pull request to the merge queue Sep 10, 2025
Merged via the queue into master with commit 44fbb00 Sep 10, 2025
43 checks passed
@alexhemard alexhemard deleted the alexhemard/integration-redesign branch September 10, 2025 18:00
@backport-bot-workflows
Copy link
Copy Markdown
Contributor

@alexhemard See the table below for backport results.

Branch Result
branch/v18 Create PR

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update integrations page to new design

4 participants