Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
ffe7b3e
RPC and cache
nicholasmarais1158 Jul 15, 2025
e2b8277
API
nicholasmarais1158 Jul 16, 2025
ba0cc5e
Update rfc0217
nicholasmarais1158 Jul 16, 2025
3382643
Remove unnecessary copy
nicholasmarais1158 Jul 16, 2025
fd81804
Fix import ordering
nicholasmarais1158 Jul 16, 2025
ee1d5e9
Fix cache bypass issue
nicholasmarais1158 Jul 17, 2025
3f22dfe
Merge branch 'master' into nicholasmarais1158/feat/bot-tokens-api
nicholasmarais1158 Jul 17, 2025
34841a6
Add context to unmarshal error
nicholasmarais1158 Jul 17, 2025
e6aedff
Wrap page_size parse error
nicholasmarais1158 Jul 17, 2025
fe5ad69
Keep backend range logic consistent
nicholasmarais1158 Jul 17, 2025
b50542d
feat(web): Add Join Tokens panel to Bot Details
nicholasmarais1158 Jul 17, 2025
6412069
Copy correction
nicholasmarais1158 Jul 18, 2025
93fd018
Remove unneeded alert action
nicholasmarais1158 Jul 18, 2025
fe7b24f
Handle outdated proxy error
nicholasmarais1158 Jul 18, 2025
e5e57fc
Extend tests
nicholasmarais1158 Jul 18, 2025
e336f84
Rename
nicholasmarais1158 Jul 22, 2025
5063cbb
Use `tokens.list` for access to tokens page (instead of `tokens.create`)
nicholasmarais1158 Jul 22, 2025
b28b66a
Add outline label variants
nicholasmarais1158 Jul 22, 2025
eda80bd
Add `semver` dep to teleport package
nicholasmarais1158 Jul 22, 2025
4597088
Add `useClusterVersion` hook
nicholasmarais1158 Jul 22, 2025
93c35df
Expose heartbeat OS
nicholasmarais1158 Jul 22, 2025
3faf420
Add sorting icons
nicholasmarais1158 Jul 22, 2025
a66c869
Add `JoinMethodIcon` component
nicholasmarais1158 Jul 22, 2025
81eaee2
Add bot instances to Bot Details
nicholasmarais1158 Jul 22, 2025
0a208ef
Merge branch 'master' into nicholasmarais1158/feat/bot-instances-web
nicholasmarais1158 Jul 22, 2025
4fac800
Missing lock content
nicholasmarais1158 Jul 22, 2025
a0ed511
Fix scroll container
nicholasmarais1158 Jul 22, 2025
957d2cf
Scroll to top on sort
nicholasmarais1158 Jul 22, 2025
6129d4e
Remove unused import
nicholasmarais1158 Jul 22, 2025
0b5695d
Extract join method icons to component
nicholasmarais1158 Jul 22, 2025
646adf2
Merge branch 'nicholasmarais1158/feat/bot-tokens-web' into nicholasma…
nicholasmarais1158 Jul 22, 2025
f440849
Merge branch 'master' into nicholasmarais1158/feat/bot-tokens-web
nicholasmarais1158 Jul 22, 2025
9fd1148
Merge branch 'nicholasmarais1158/feat/bot-tokens-web' into nicholasma…
nicholasmarais1158 Jul 22, 2025
c37a828
Add mission join token icons/logos
nicholasmarais1158 Jul 23, 2025
0009fdd
Merge branch 'nicholasmarais1158/feat/bot-tokens-web' into nicholasma…
nicholasmarais1158 Jul 23, 2025
115b4fc
Use OS logos (update windows)
nicholasmarais1158 Jul 23, 2025
8d85073
Save some lines 😮‍💨
nicholasmarais1158 Jul 23, 2025
4ec6ff6
Unused imports
nicholasmarais1158 Jul 23, 2025
7c89744
Merge branch 'master' into nicholasmarais1158/feat/bot-tokens-web
nicholasmarais1158 Jul 23, 2025
ddd134e
Merge branch 'nicholasmarais1158/feat/bot-tokens-web' into nicholasma…
nicholasmarais1158 Jul 23, 2025
6dc93a0
Use shared semver
nicholasmarais1158 Jul 23, 2025
cfd57f1
Fix exhaustive check
nicholasmarais1158 Jul 23, 2025
e97d59b
Merge branch 'master' into nicholasmarais1158/feat/bot-tokens-web
nicholasmarais1158 Jul 23, 2025
dbf8da8
Re-export new Label variants
nicholasmarais1158 Jul 24, 2025
1779035
Correct version compatibility logic and messaging
nicholasmarais1158 Jul 24, 2025
5b79741
Improve error state UX
nicholasmarais1158 Jul 24, 2025
d679fc4
Use `H2`
nicholasmarais1158 Jul 24, 2025
89c7840
Reduce lines
nicholasmarais1158 Jul 24, 2025
ecb3471
Reduce lines (more)
nicholasmarais1158 Jul 24, 2025
b165bd9
Fix tests and lint
nicholasmarais1158 Jul 24, 2025
09c71a2
Fix grid alignment
nicholasmarais1158 Jul 25, 2025
d8f20d4
Remove unnecessary margin 0
nicholasmarais1158 Jul 25, 2025
2d72d7a
Clarify roles container
nicholasmarais1158 Jul 25, 2025
a0a09a9
Improve type safety of sort state
nicholasmarais1158 Jul 25, 2025
99cddc0
Remove unnecessary wrappers
nicholasmarais1158 Jul 25, 2025
cd4bf69
Improve `useClusterVersion`
nicholasmarais1158 Jul 25, 2025
834fb86
Add sorting icons (used later)
nicholasmarais1158 Jul 25, 2025
8c69299
Merge branch 'master' into nicholasmarais1158/feat/bot-tokens-web
nicholasmarais1158 Jul 25, 2025
24dc82f
Merge branch 'nicholasmarais1158/feat/bot-tokens-web' into nicholasma…
nicholasmarais1158 Jul 25, 2025
06b66a4
Bot details nav and edit from list
nicholasmarais1158 Jul 24, 2025
e85299b
Add up/back navigation
nicholasmarais1158 Jul 24, 2025
1eebbc7
Make icons bigger
nicholasmarais1158 Jul 25, 2025
403f0d6
Make label text bigger
nicholasmarais1158 Jul 25, 2025
30f5992
Add "No heartbeat data" state
nicholasmarais1158 Jul 25, 2025
ea38edb
Rename `check()`
nicholasmarais1158 Jul 28, 2025
8b88e2e
Correct newer version messaging
nicholasmarais1158 Jul 28, 2025
7275c18
Merge branch 'nicholasmarais1158/feat/bot-instances-web' into nichola…
nicholasmarais1158 Jul 28, 2025
aaef25a
Tweak Label component border radius
nicholasmarais1158 Jul 28, 2025
d647a7a
Spacing, sizing and overflow handling
nicholasmarais1158 Jul 28, 2025
6e1b29e
Add overflow stories
nicholasmarais1158 Jul 28, 2025
6994e8c
Fix typing
nicholasmarais1158 Jul 28, 2025
17c40fc
Remove old edit form
nicholasmarais1158 Jul 28, 2025
1ff044b
Remove fixme comment
nicholasmarais1158 Jul 28, 2025
34fb788
Merge branch 'master' into nicholasmarais1158/feat/bot-detail-nav
nicholasmarais1158 Jul 30, 2025
3efb63f
Fix lint
nicholasmarais1158 Jul 31, 2025
f49194b
Remove redundant memoization
nicholasmarais1158 Jul 31, 2025
5d41eda
Tidy text styles
nicholasmarais1158 Jul 31, 2025
b8d7eab
Add `style` prop to ResourceIcon
nicholasmarais1158 Aug 1, 2025
ccfcc08
Merge branch 'master' into nicholasmarais1158/feat/bot-detail-nav
nicholasmarais1158 Aug 1, 2025
85a585f
Merge branch 'master' into nicholasmarais1158/feat/bot-detail-nav
nicholasmarais1158 Aug 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions web/packages/design/src/Label/Label.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import React from 'react';
import styled from 'styled-components';

import { space, SpaceProps } from '../system';
import { border, BorderProps, space, SpaceProps } from '../system';
import { Theme } from '../theme';

const kind = ({ kind, theme }: { kind?: LabelKind; theme: Theme }) => {
Expand Down Expand Up @@ -102,23 +102,26 @@ export type LabelKind =
| 'outline-warning'
| 'outline-danger';

interface LabelProps extends SpaceProps {
type LabelProps = {
kind?: LabelKind;
children?: React.ReactNode;
}
} & SpaceProps &
BorderProps;

const Label = styled.div<LabelProps>`
box-sizing: border-box;
border-radius: 10px;
border-radius: 999px;
display: inline-block;
font-size: 10px;
font-weight: 500;
padding: 0 8px;
margin: 1px 0;
vertical-align: middle;
overflow: hidden;

${kind}
${space}
${border}
`;

export default Label;
Expand Down
17 changes: 16 additions & 1 deletion web/packages/design/src/ResourceIcon/ResourceIcon.story.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import React, { PropsWithChildren } from 'react';
import { useTheme } from 'styled-components';

import { Flex, Text } from 'design';
import { Flex, Stack, Text } from 'design';
import { ResourceIcon } from 'design/ResourceIcon';

import { iconNames } from './resourceIconSpecs';
Expand All @@ -43,6 +43,21 @@ export const Icons = () => {
);
};

export const StandardSizes = () => {
return (
<Stack flexWrap="wrap" gap={2}>
<ResourceIcon name={'1password'} size="small" />
Small
<ResourceIcon name={'1password'} size="medium" />
Medium
<ResourceIcon name={'1password'} size="large" />
Large
<ResourceIcon name={'1password'} size="extra-large" />
Extra Large
</Stack>
);
};

const IconBox: React.FC<PropsWithChildren<{ text: string }>> = ({
children,
text,
Expand Down
33 changes: 32 additions & 1 deletion web/packages/design/src/ResourceIcon/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { ComponentProps } from 'react';
import { useTheme } from 'styled-components';

import { Image } from 'design';
import { IconProps } from 'design/Icon/Icon';

import {
iconNames,
Expand All @@ -33,6 +34,11 @@ interface ResourceIconProps extends ComponentProps<typeof Image> {
* available names.
*/
name: ResourceIconName;

/**
* Use a standard size. Otherwise, use `width` and `height` props.
*/
size?: IconProps['size'];
}

/**
Expand All @@ -45,7 +51,32 @@ export const ResourceIcon = ({ name, ...props }: ResourceIconProps) => {
if (!icon) {
return null;
}
return <Image src={icon} data-testid={`res-icon-${name}`} {...props} />;
const width = props.size ? sizetoPx(props.size) : props.width;
const height = props.size ? sizetoPx(props.size) : props.height;
return (
<Image
src={icon}
data-testid={`res-icon-${name}`}
{...props}
width={width}
height={height}
/>
);
};

/**
* Convert a standard size to a pixel width/height. This is different to the
* conversion done for Icons as they include in-asset padding.
*
* @param size the standard size to convert.
* @returns the pixel size
*/
function sizetoPx(size: IconProps['size']) {
if (size === 'small') return '14px';
if (size === 'medium') return '16px';
if (size === 'large') return '20px';
if (size === 'extra-large') return '24px';
return '24px';
}

export { type ResourceIconName, resourceIconSpecs, iconNames };
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/

import { MouseEventHandler, useCallback } from 'react';
import { useHistory, useParams } from 'react-router';
import { useHistory, useLocation, useParams } from 'react-router';
import styled from 'styled-components';

import { Alert } from 'design/Alert/Alert';
Expand All @@ -37,6 +37,7 @@ import {
FeatureHeader,
FeatureHeaderTitle,
} from 'teleport/components/Layout/Layout';
import cfg from 'teleport/config';

import { useGetBotInstance } from '../hooks';

Expand All @@ -47,6 +48,7 @@ export function BotInstanceDetails(props: {
onDocsLinkClickedForTesting?: MouseEventHandler<HTMLAnchorElement>;
}) {
const history = useHistory();
const location = useLocation();
const params = useParams<{
botName: string;
instanceId: string;
Expand All @@ -60,8 +62,13 @@ export function BotInstanceDetails(props: {
);

const handleBackPress = useCallback(() => {
history.goBack();
}, [history]);
// If location.key is unset, or 'default', this is the first history entry in-app in the session.
if (!location.key || location.key === 'default') {
history.push(cfg.getBotInstancesRoute());
} else {
history.goBack();
}
}, [history, location.key]);

return (
<FeatureBox>
Expand Down
14 changes: 4 additions & 10 deletions web/packages/teleport/src/BotInstances/List/BotInstancesList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import format from 'date-fns/format';
import formatDistanceToNowStrict from 'date-fns/formatDistanceToNowStrict';
import parseISO from 'date-fns/parseISO';
import { useMemo } from 'react';
import styled from 'styled-components';

import { Info } from 'design/Alert/Alert';
Expand Down Expand Up @@ -69,14 +68,6 @@ export function BotInstancesList({
: '-',
}));

const rowConfig = useMemo(
() => ({
onClick: onItemSelected,
getStyle: () => ({ cursor: 'pointer' }),
}),
[onItemSelected]
);

return (
<Table<(typeof tableData)[number]>
data={tableData}
Expand All @@ -99,7 +90,10 @@ export function BotInstancesList({
/>
),
}}
row={rowConfig}
row={{
onClick: onItemSelected,
getStyle: () => ({ cursor: 'pointer' }),
}}
columns={[
{
key: 'bot_name',
Expand Down
65 changes: 64 additions & 1 deletion web/packages/teleport/src/Bots/Details/BotDetails.story.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -118,13 +118,76 @@ export const HappyWithEmpty: Story = {
},
}),
listV2TokensSuccess({
isEmpty: true,
tokens: [],
}),
mfaAuthnChallengeSuccess(),
listBotInstancesSuccess({
bot_instances: [],
next_page_token: '',
}),
successGetRoles({
startKey: '',
items: Array.from({ length: 10 }, (_, k) => k).map(r => ({
content: `role-${r}`,
id: `role-${r}`,
name: `role-${r}`,
kind: 'role',
})),
}),
editBotSuccess(),
],
},
},
};

export const HappyWithLongValues: Story = {
parameters: {
msw: {
handlers: [
getBotSuccess({
name: 'ansibleworkeransibleworkeransibleworkeransibleworkeransibleworkeransibleworker',
roles: [
'rolerolerolerolerolerolerolerolerolerolerolerolerolerolerolerolerolerolerolerolerole',
],
traits: [
{
name: 'traittraittraittraittraittraittraittraittraittraittraittraittraittraittrait',
values: ['value'],
},
{
name: 'name',
values: [
'valuevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevalue',
],
},
],
max_session_ttl: {
seconds: 43200,
},
}),
listV2TokensSuccess({
tokens: [
'tokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentoken',
],
}),
mfaAuthnChallengeSuccess(),
listBotInstancesSuccess({
bot_instances: [
{
bot_name: '',
instance_id:
'04241a2a66b904241a2a66b904241a2a66b904241a2a66b904241a2a66b9',
host_name_latest:
'hotnamehotnamehotnamehotnamehotnamehotnamehotnamehotnamehotname',
active_at_latest: '2025-01-01T00:00:00Z',
join_method_latest: 'github',
os_latest: 'linux',
version_latest:
'17.2.6-04241a2a66b904241a2a66b904241a2a66b904241a2a66b9',
},
],
next_page_token: '',
}),
successGetRoles({
startKey: '',
items: ['access', 'editor', 'terraform-provider'].map(r => ({
Expand Down
Loading
Loading