Skip to content

Commit ac446fa

Browse files
committed
Events UI #3309 User events refactoring after review
1 parent 7a48d71 commit ac446fa

12 files changed

Lines changed: 112 additions & 102 deletions

File tree

frontend/src/components/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ export { default as ExpandableSection } from '@cloudscape-design/components/expa
6666
export { default as KeyValuePairs } from '@cloudscape-design/components/key-value-pairs';
6767
export { I18nProvider } from '@cloudscape-design/components/i18n';
6868
export { default as Wizard } from '@cloudscape-design/components/wizard';
69+
export { default as SegmentedControl } from '@cloudscape-design/components/segmented-control';
70+
export type { SegmentedControlProps } from '@cloudscape-design/components/segmented-control';
6971

7072
// custom components
7173
export { NavigateLink } from './NavigateLink';

frontend/src/locale/en.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -696,8 +696,7 @@
696696
"account_settings": "User settings",
697697
"settings": "Settings",
698698
"projects": "Projects",
699-
"events": "User events",
700-
"activity": "User activity",
699+
"events": "Events",
701700
"create": {
702701
"page_title": "Create user",
703702
"error_notification": "Create user error",

frontend/src/pages/Events/List/hooks/useFilters.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,6 @@ export const useFilters = ({
236236
const permanentFiltersKeysMap = new Map<string, string>();
237237

238238
for (const prefix of onlyOneFilterGroupPrefixes) {
239-
console.log({ prefix });
240239
const permanentFilterKey = Object.keys(permanentFilters ?? {}).find((filterKey) => filterKey.startsWith(prefix));
241240

242241
if (permanentFilterKey) {

frontend/src/pages/Events/List/index.tsx

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,16 @@ type EventListProps = Pick<TableProps, 'variant'> & {
2424
withSearchParams?: boolean;
2525
renderHeader?: (args: RenderHeaderArgs) => React.ReactNode;
2626
permanentFilters?: Partial<TEventListFilters>;
27+
showFilters?: boolean;
2728
};
2829

29-
export const EventList: React.FC<EventListProps> = ({ withSearchParams, permanentFilters, renderHeader, ...props }) => {
30+
export const EventList: React.FC<EventListProps> = ({
31+
withSearchParams,
32+
permanentFilters,
33+
renderHeader,
34+
showFilters = true,
35+
...props
36+
}) => {
3037
const { t } = useTranslation();
3138

3239
useBreadcrumbs([
@@ -79,24 +86,26 @@ export const EventList: React.FC<EventListProps> = ({ withSearchParams, permanen
7986
stickyHeader={true}
8087
header={renderHeader?.({ refreshAction: refreshList, disabledRefresh: loading })}
8188
filter={
82-
<div className={styles.selectFilters}>
83-
<div className={styles.propertyFilter}>
84-
<PropertyFilter
85-
query={propertyFilterQuery}
86-
onChange={onChangePropertyFilter}
87-
expandToViewport
88-
hideOperations
89-
i18nStrings={{
90-
clearFiltersText: t('common.clearFilter'),
91-
filteringAriaLabel: t('projects.run.filter_property_placeholder'),
92-
filteringPlaceholder: t('projects.run.filter_property_placeholder'),
93-
operationAndText: 'and',
94-
}}
95-
filteringOptions={filteringOptions}
96-
filteringProperties={filteringProperties}
97-
/>
89+
showFilters && (
90+
<div className={styles.selectFilters}>
91+
<div className={styles.propertyFilter}>
92+
<PropertyFilter
93+
query={propertyFilterQuery}
94+
onChange={onChangePropertyFilter}
95+
expandToViewport
96+
hideOperations
97+
i18nStrings={{
98+
clearFiltersText: t('common.clearFilter'),
99+
filteringAriaLabel: t('projects.run.filter_property_placeholder'),
100+
filteringPlaceholder: t('projects.run.filter_property_placeholder'),
101+
operationAndText: 'and',
102+
}}
103+
filteringOptions={filteringOptions}
104+
filteringProperties={filteringProperties}
105+
/>
106+
</div>
98107
</div>
99-
</div>
108+
)
100109
}
101110
footer={<Loader show={isLoadingMore} padding={{ vertical: 'm' }} />}
102111
/>

frontend/src/pages/User/Details/Activity/index.tsx

Lines changed: 0 additions & 31 deletions
This file was deleted.

frontend/src/pages/User/Details/Events/index.tsx

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import React from 'react';
1+
import React, { useState } from 'react';
22
import { useTranslation } from 'react-i18next';
3-
import { useParams } from 'react-router-dom';
3+
import { useNavigate, useParams } from 'react-router-dom';
4+
5+
import { Button, Header, SegmentedControl, SpaceBetween } from 'components';
46

57
import { useBreadcrumbs } from 'hooks';
68
import { ROUTES } from 'routes';
@@ -11,6 +13,8 @@ export const Events: React.FC = () => {
1113
const { t } = useTranslation();
1214
const params = useParams();
1315
const paramUserName = params.userName ?? '';
16+
const navigate = useNavigate();
17+
const [filterParamName, setFilterParamName] = useState<keyof TEventListFilters>('target_users');
1418

1519
useBreadcrumbs([
1620
{
@@ -27,5 +31,36 @@ export const Events: React.FC = () => {
2731
},
2832
]);
2933

30-
return <EventList variant="borderless" permanentFilters={{ target_users: [paramUserName] }} />;
34+
const goToEventsPage = () => {
35+
navigate(ROUTES.EVENTS.LIST + `?${filterParamName}=${paramUserName}`);
36+
};
37+
38+
return (
39+
<EventList
40+
renderHeader={() => {
41+
return (
42+
<Header
43+
variant="awsui-h1-sticky"
44+
actions={
45+
<SpaceBetween size="xs" direction="horizontal">
46+
<SegmentedControl
47+
selectedId={filterParamName}
48+
onChange={({ detail }) => setFilterParamName(detail.selectedId as keyof TEventListFilters)}
49+
options={[
50+
{ text: 'Target user', id: 'target_users' },
51+
{ text: 'Actor', id: 'actors' },
52+
]}
53+
/>
54+
<Button onClick={goToEventsPage}>{t('common.full_view')}</Button>
55+
</SpaceBetween>
56+
}
57+
>
58+
{/*{t('navigation.events')}*/}
59+
</Header>
60+
);
61+
}}
62+
permanentFilters={{ [filterParamName]: [paramUserName] }}
63+
showFilters={false}
64+
/>
65+
);
3166
};

frontend/src/pages/User/Details/Projects/index.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,7 @@ export const UserProjectList: React.FC = () => {
3636
]);
3737

3838
const renderEmptyMessage = (): React.ReactNode => {
39-
return (
40-
<ListEmptyMessage
41-
title={t('projects.empty_message_title')}
42-
message={t('projects.empty_message_text')}
43-
></ListEmptyMessage>
44-
);
39+
return <ListEmptyMessage title={t('projects.empty_message_title')} message={t('projects.empty_message_text')} />;
4540
};
4641

4742
const filteredData = useMemo<IProject[]>(() => {
@@ -78,7 +73,6 @@ export const UserProjectList: React.FC = () => {
7873
return (
7974
<Table
8075
{...collectionProps}
81-
variant="borderless"
8276
columnDefinitions={columns}
8377
items={items}
8478
loading={isLoading || isFetching}

frontend/src/pages/User/Details/Settings/index.tsx

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react';
22
import { useTranslation } from 'react-i18next';
33
import { useNavigate, useParams } from 'react-router-dom';
44

5-
import { Box, Button, ColumnLayout, Header, Link, Loader, Popover, SpaceBetween, StatusIndicator } from 'components';
5+
import { Box, Button, ColumnLayout, Container, Header, Link, Loader, Popover, SpaceBetween, StatusIndicator } from 'components';
66
import { PermissionGuard } from 'components/PermissionGuard';
77

88
import { useAppSelector, useBreadcrumbs, usePermissionGuard } from 'hooks';
@@ -51,18 +51,20 @@ export const Settings: React.FC = () => {
5151
};
5252

5353
return (
54-
<div>
55-
<Header
56-
variant="h2"
57-
actions={
58-
<Button onClick={editUserHandler} disabled={isDisabledUserEditing()}>
59-
{t('common.edit')}
60-
</Button>
61-
}
62-
>
63-
{t('users.account_settings')}
64-
</Header>
65-
54+
<Container
55+
header={
56+
<Header
57+
variant="h2"
58+
actions={
59+
<Button onClick={editUserHandler} disabled={isDisabledUserEditing()}>
60+
{t('common.edit')}
61+
</Button>
62+
}
63+
>
64+
{t('users.account_settings')}
65+
</Header>
66+
}
67+
>
6668
{isLoading && <Loader />}
6769

6870
{data && (
@@ -105,6 +107,6 @@ export const Settings: React.FC = () => {
105107
</SpaceBetween>
106108
</ColumnLayout>
107109
)}
108-
</div>
110+
</Container>
109111
);
110112
};

frontend/src/pages/User/Details/index.tsx

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react';
22
import { useTranslation } from 'react-i18next';
33
import { Outlet, useNavigate, useParams } from 'react-router-dom';
44

5-
import { Box, ConfirmationDialog, ContentLayout, SpaceBetween, Tabs } from 'components';
5+
import { Box, ConfirmationDialog, ContentLayout, Tabs } from 'components';
66
import { DetailsHeader } from 'components';
77

88
import { useNotifications /* usePermissionGuard*/ } from 'hooks';
@@ -13,10 +13,11 @@ import { useDeleteUsersMutation, useGetUserQuery } from 'services/user';
1313
// import { GlobalUserRole } from '../../../types';
1414
import { UserDetailsTabTypeEnum } from './types';
1515

16+
import styles from './styles.module.scss';
17+
1618
export { Settings as UserSettings } from './Settings';
1719
export { Billing as UserBilling } from './Billing';
1820
export { Events as UserEvents } from './Events';
19-
export { Activity as UserActivity } from './Activity';
2021
export { UserProjectList as UserProjects } from './Projects';
2122

2223
export const UserDetails: React.FC = () => {
@@ -65,36 +66,26 @@ export const UserDetails: React.FC = () => {
6566
label: t('users.settings'),
6667
id: UserDetailsTabTypeEnum.SETTINGS,
6768
href: ROUTES.USER.DETAILS.FORMAT(paramUserName),
68-
content: <Outlet />,
6969
},
7070
{
7171
label: t('users.projects'),
7272
id: UserDetailsTabTypeEnum.PROJECTS,
7373
href: ROUTES.USER.PROJECTS.FORMAT(paramUserName),
74-
content: <Outlet />,
7574
},
7675
{
7776
label: t('users.events'),
7877
id: UserDetailsTabTypeEnum.EVENTS,
7978
href: ROUTES.USER.EVENTS.FORMAT(paramUserName),
80-
content: <Outlet />,
81-
},
82-
{
83-
label: t('users.activity'),
84-
id: UserDetailsTabTypeEnum.ACTIVITY,
85-
href: ROUTES.USER.ACTIVITY.FORMAT(paramUserName),
86-
content: <Outlet />,
8779
},
8880
process.env.UI_VERSION === 'sky' && {
8981
label: t('billing.title'),
9082
id: UserDetailsTabTypeEnum.BILLING,
9183
href: ROUTES.USER.BILLING.LIST.FORMAT(paramUserName),
92-
content: <Outlet />,
9384
},
9485
].filter(Boolean);
9586

9687
return (
97-
<>
88+
<div className={styles.page}>
9889
<ContentLayout
9990
header={
10091
<DetailsHeader
@@ -104,9 +95,9 @@ export const UserDetails: React.FC = () => {
10495
/>
10596
}
10697
>
107-
<SpaceBetween size="l">
108-
<Tabs variant="container" withNavigation tabs={tabs} />
109-
</SpaceBetween>
98+
<Tabs withNavigation tabs={tabs} />
99+
100+
<Outlet />
110101
</ContentLayout>
111102

112103
<ConfirmationDialog
@@ -116,6 +107,6 @@ export const UserDetails: React.FC = () => {
116107
onConfirm={deleteUserHandler}
117108
confirmButtonLabel={t('common.delete')}
118109
/>
119-
</>
110+
</div>
120111
);
121112
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
.page {
2+
height: 100%;
3+
4+
& [class^="awsui_tabs-content"] {
5+
display: none;
6+
}
7+
8+
& > [class^="awsui_layout"] {
9+
height: 100%;
10+
11+
& > [class^="awsui_content"] {
12+
display: flex;
13+
flex-direction: column;
14+
gap: 20px;
15+
height: 100%;
16+
}
17+
}
18+
}

0 commit comments

Comments
 (0)