Skip to content

Commit 0d80147

Browse files
authored
fix: UI issues in table and text inputs; add ThemeAwareFormGroupWrapper (#696)
fix action cell and useWorkspaceRowActions test bump to latest shared library versions Signed-off-by: Jenny <[email protected]>
1 parent 4bd7dfe commit 0d80147

File tree

10 files changed

+162
-74
lines changed

10 files changed

+162
-74
lines changed

workspaces/frontend/package-lock.json

Lines changed: 14 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

workspaces/frontend/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@
121121
"dompurify": "^3.2.4",
122122
"js-yaml": "^4.1.0",
123123
"lodash-es": "^4.17.15",
124-
"mod-arch-core": "^1.1.5",
125-
"mod-arch-kubeflow": "^1.1.5",
126-
"mod-arch-shared": "^1.1.5",
124+
"mod-arch-core": "^1.2.0",
125+
"mod-arch-kubeflow": "^1.2.0",
126+
"mod-arch-shared": "^1.2.0",
127127
"react": "^18",
128128
"react-dom": "^18",
129129
"react-router": "^7.5.2",

workspaces/frontend/src/app/components/WorkspaceTable.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import {
6262
import { ExpandedWorkspaceRow } from '~/app/pages/Workspaces/ExpandedWorkspaceRow';
6363
import CustomEmptyState from '~/shared/components/CustomEmptyState';
6464
import { WorkspacesWorkspace, WorkspacesWorkspaceState } from '~/generated/data-contracts';
65+
import { useWorkspaceActionsContext } from '~/app/context/WorkspaceActionsContext';
6566

6667
const {
6768
fields: wsTableColumns,
@@ -128,6 +129,7 @@ const WorkspaceTable = React.forwardRef<WorkspaceTableRef, WorkspaceTableProps>(
128129
},
129130
ref,
130131
) => {
132+
const { isDrawerExpanded } = useWorkspaceActionsContext();
131133
const [workspaceKinds] = useWorkspaceKinds();
132134
const [expandedWorkspacesNames, setExpandedWorkspacesNames] = useState<string[]>([]);
133135
const [filters, setFilters] = useState<Record<FilterKey, string>>({
@@ -518,6 +520,8 @@ const WorkspaceTable = React.forwardRef<WorkspaceTableRef, WorkspaceTableProps>(
518520
data-testid="workspaces-table"
519521
aria-label="Sortable table"
520522
ouiaId="SortableTable"
523+
variant="compact"
524+
gridBreakPoint={isDrawerExpanded ? 'grid' : 'grid-lg'}
521525
style={{ tableLayout: 'fixed' }}
522526
>
523527
<Thead>
@@ -570,15 +574,15 @@ const WorkspaceTable = React.forwardRef<WorkspaceTableRef, WorkspaceTableProps>(
570574
{visibleColumnKeys.map((columnKey) => {
571575
if (columnKey === 'connect') {
572576
return (
573-
<Td key="connect" isActionCell>
577+
<Td key="connect" dataLabel={wsTableColumns[columnKey].label}>
574578
<WorkspaceConnectAction workspace={workspace} />
575579
</Td>
576580
);
577581
}
578582

579583
if (columnKey === 'actions') {
580584
return (
581-
<Td key="actions" isActionCell data-testid="action-column">
585+
<Td key="actions" data-testid="action-column">
582586
<ActionsColumn
583587
items={rowActions(workspace).map((action) => ({
584588
...action,
@@ -638,9 +642,11 @@ const WorkspaceTable = React.forwardRef<WorkspaceTableRef, WorkspaceTableProps>(
638642
)}
639643
{columnKey === 'namespace' && workspace.namespace}
640644
{columnKey === 'state' && (
641-
<Label color={extractStateColor(workspace.state)}>
642-
{workspace.state}
643-
</Label>
645+
<div className="pf-v6-u-display-inline-block">
646+
<Label color={extractStateColor(workspace.state)}>
647+
{workspace.state}
648+
</Label>
649+
</div>
644650
)}
645651
{columnKey === 'gpu' && formatResourceFromWorkspace(workspace, 'gpu')}
646652
{columnKey === 'idleGpu' && formatWorkspaceIdleState(workspace)}

workspaces/frontend/src/app/context/WorkspaceActionsContext.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export type WorkspaceActionsContextType = {
3939
requestStartAction: RequestAction;
4040
requestRestartAction: RequestAction;
4141
requestStopAction: RequestAction;
42+
isDrawerExpanded: boolean;
4243
};
4344

4445
export const WorkspaceActionsContext = React.createContext<WorkspaceActionsContextType | undefined>(
@@ -148,6 +149,8 @@ export const WorkspaceActionsContextProvider: React.FC<WorkspaceActionsContextPr
148149
}
149150
}, [activeWsAction, executeEditAction]);
150151

152+
const isDrawerExpanded = activeWsAction?.action === ActionType.ViewDetails;
153+
151154
const contextValue = useMemo(
152155
() => ({
153156
requestViewDetailsAction,
@@ -156,6 +159,7 @@ export const WorkspaceActionsContextProvider: React.FC<WorkspaceActionsContextPr
156159
requestStartAction,
157160
requestRestartAction,
158161
requestStopAction,
162+
isDrawerExpanded,
159163
}),
160164
[
161165
requestViewDetailsAction,
@@ -164,12 +168,19 @@ export const WorkspaceActionsContextProvider: React.FC<WorkspaceActionsContextPr
164168
requestStartAction,
165169
requestRestartAction,
166170
requestStopAction,
171+
isDrawerExpanded,
167172
],
168173
);
169174

170175
return (
171176
<WorkspaceActionsContext.Provider value={contextValue}>
172-
<Drawer isInline isExpanded={activeWsAction?.action === ActionType.ViewDetails}>
177+
<Drawer
178+
isInline
179+
isExpanded={isDrawerExpanded}
180+
onExpand={() => {
181+
/* drawer expanded */
182+
}}
183+
>
173184
<DrawerContent panelContent={drawerContent}>
174185
<DrawerContentBody>
175186
{children}

workspaces/frontend/src/app/hooks/__tests__/useWorkspaceRowActions.spec.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ describe('useWorkspaceRowActions', () => {
2727
requestStartAction: (args: RequestActionArgs) => void;
2828
requestRestartAction: (args: RequestActionArgs) => void;
2929
requestStopAction: (args: RequestActionArgs) => void;
30+
isDrawerExpanded: boolean;
3031
};
3132

3233
const contextValue: WorkspaceActionsContextLike = {
@@ -36,6 +37,7 @@ describe('useWorkspaceRowActions', () => {
3637
requestStartAction: jest.fn(),
3738
requestRestartAction: jest.fn(),
3839
requestStopAction: jest.fn(),
40+
isDrawerExpanded: false,
3941
};
4042

4143
const wrapper: React.FC<React.PropsWithChildren> = ({ children }) => (

workspaces/frontend/src/app/pages/Workspaces/Details/WorkspaceDetailsActions.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export const WorkspaceDetailsActions: React.FC<WorkspaceDetailsActionsProps> = (
3030
toggle={(toggleRef) => (
3131
<MenuToggle
3232
variant="primary"
33+
className="workspace-details-action-toggle"
3334
ref={toggleRef}
3435
onClick={() => setOpen(!isOpen)}
3536
isExpanded={isOpen}

workspaces/frontend/src/app/pages/Workspaces/Form/properties/WorkspaceFormPropertiesSelection.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { WorkspaceFormImageDetails } from '~/app/pages/Workspaces/Form/image/Wor
1010
import { WorkspaceFormPropertiesVolumes } from '~/app/pages/Workspaces/Form/properties/WorkspaceFormPropertiesVolumes';
1111
import { WorkspacekindsImageConfigValue } from '~/generated/data-contracts';
1212
import { WorkspaceFormProperties } from '~/app/types';
13+
import ThemeAwareFormGroupWrapper from '~/shared/components/ThemeAwareFormGroupWrapper';
1314
import { WorkspaceFormPropertiesSecrets } from './WorkspaceFormPropertiesSecrets';
1415

1516
interface WorkspaceFormPropertiesSelectionProps {
@@ -36,11 +37,11 @@ const WorkspaceFormPropertiesSelection: React.FunctionComponent<
3637
<SplitItem isFilled>
3738
<div className="pf-u-p-lg pf-u-max-width-xl">
3839
<Form>
39-
<FormGroup
40+
<ThemeAwareFormGroupWrapper
4041
label="Workspace Name"
4142
isRequired
4243
fieldId="workspace-name"
43-
style={{ width: 520 }}
44+
className="pf-u-width-520"
4445
>
4546
<TextInput
4647
isRequired
@@ -49,7 +50,7 @@ const WorkspaceFormPropertiesSelection: React.FunctionComponent<
4950
onChange={(_, value) => onSelect({ ...selectedProperties, workspaceName: value })}
5051
id="workspace-name"
5152
/>
52-
</FormGroup>
53+
</ThemeAwareFormGroupWrapper>
5354
<FormGroup fieldId="defer-updates">
5455
<Checkbox
5556
label="Defer Updates"
@@ -73,10 +74,10 @@ const WorkspaceFormPropertiesSelection: React.FunctionComponent<
7374
>
7475
{isVolumesExpanded && (
7576
<>
76-
<FormGroup
77+
<ThemeAwareFormGroupWrapper
7778
label="Home Directory"
7879
fieldId="home-directory"
79-
style={{ width: 500 }}
80+
className="pf-u-width-500"
8081
>
8182
<TextInput
8283
value={selectedProperties.homeDirectory}
@@ -87,8 +88,10 @@ const WorkspaceFormPropertiesSelection: React.FunctionComponent<
8788
});
8889
}}
8990
id="home-directory"
91+
type="text"
92+
name="home-directory"
9093
/>
91-
</FormGroup>
94+
</ThemeAwareFormGroupWrapper>
9295

9396
<FormGroup fieldId="volumes-table" style={{ marginTop: '1rem' }}>
9497
<WorkspaceFormPropertiesVolumes

workspaces/frontend/src/app/pages/Workspaces/Form/properties/WorkspaceFormPropertiesVolumes.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
} from '@patternfly/react-table/dist/esm/components/Table';
2525
import { PlusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';
2626
import { WorkspacesPodVolumeMount } from '~/generated/data-contracts';
27+
import ThemeAwareFormGroupWrapper from '~/shared/components/ThemeAwareFormGroupWrapper';
2728

2829
interface WorkspaceFormPropertiesVolumesProps {
2930
volumes: WorkspacesPodVolumeMount[];
@@ -149,7 +150,7 @@ export const WorkspaceFormPropertiesVolumes: React.FC<WorkspaceFormPropertiesVol
149150
/>
150151
<ModalBody>
151152
<Form>
152-
<FormGroup label="PVC Name" isRequired fieldId="pvc-name">
153+
<ThemeAwareFormGroupWrapper label="PVC Name" isRequired fieldId="pvc-name">
153154
<TextInput
154155
name="pvcName"
155156
isRequired
@@ -158,8 +159,8 @@ export const WorkspaceFormPropertiesVolumes: React.FC<WorkspaceFormPropertiesVol
158159
onChange={(_, val) => setFormData({ ...formData, pvcName: val })}
159160
id="pvc-name"
160161
/>
161-
</FormGroup>
162-
<FormGroup label="Mount Path" isRequired fieldId="mount-path">
162+
</ThemeAwareFormGroupWrapper>
163+
<ThemeAwareFormGroupWrapper label="Mount Path" isRequired fieldId="mount-path">
163164
<TextInput
164165
name="mountPath"
165166
isRequired
@@ -168,7 +169,7 @@ export const WorkspaceFormPropertiesVolumes: React.FC<WorkspaceFormPropertiesVol
168169
onChange={(_, val) => setFormData({ ...formData, mountPath: val })}
169170
id="mount-path"
170171
/>
171-
</FormGroup>
172+
</ThemeAwareFormGroupWrapper>
172173
<FormGroup fieldId="readonly-access">
173174
<Switch
174175
id="readonly-access-switch"

workspaces/frontend/src/app/pages/Workspaces/WorkspaceConnectAction.tsx

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -47,47 +47,49 @@ export const WorkspaceConnectAction: React.FunctionComponent<WorkspaceConnectAct
4747
};
4848

4949
return (
50-
<Dropdown
51-
isOpen={open}
52-
onSelect={onSelect}
53-
onOpenChange={(isOpen: boolean) => setIsOpen(isOpen)}
54-
toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
55-
<MenuToggle
56-
ref={toggleRef}
57-
variant="secondary"
58-
onClick={onToggleClick}
59-
isExpanded={open}
60-
isDisabled={workspace.state !== WorkspacesWorkspaceState.WorkspaceStateRunning}
61-
splitButtonItems={[
62-
<MenuToggleAction
63-
id="connect-endpoint-button"
64-
key="connect-endpoint-button"
65-
onClick={onClickConnect}
66-
className="connect-button-no-wrap"
67-
>
68-
Connect
69-
</MenuToggleAction>,
70-
]}
71-
/>
72-
)}
73-
ouiaId="BasicDropdown"
74-
shouldFocusToggleOnSelect
75-
>
76-
<DropdownList>
77-
{workspace.services.map((service) => {
78-
if (!service.httpService) {
79-
return null;
80-
}
81-
return (
82-
<DropdownItem
83-
value={service.httpService.httpPath}
84-
key={`${workspace.name}-${service.httpService.displayName}`}
85-
>
86-
{service.httpService.displayName}
87-
</DropdownItem>
88-
);
89-
})}
90-
</DropdownList>
91-
</Dropdown>
50+
<div className="workspace-connect-wrapper pf-v6-u-display-inline-block">
51+
<Dropdown
52+
isOpen={open}
53+
onSelect={onSelect}
54+
onOpenChange={(isOpen: boolean) => setIsOpen(isOpen)}
55+
toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
56+
<MenuToggle
57+
ref={toggleRef}
58+
variant="secondary"
59+
onClick={onToggleClick}
60+
isExpanded={open}
61+
isDisabled={workspace.state !== WorkspacesWorkspaceState.WorkspaceStateRunning}
62+
splitButtonItems={[
63+
<MenuToggleAction
64+
id="connect-endpoint-button"
65+
key="connect-endpoint-button"
66+
onClick={onClickConnect}
67+
className="connect-button-no-wrap"
68+
>
69+
Connect
70+
</MenuToggleAction>,
71+
]}
72+
/>
73+
)}
74+
ouiaId="BasicDropdown"
75+
shouldFocusToggleOnSelect
76+
>
77+
<DropdownList>
78+
{workspace.services.map((service) => {
79+
if (!service.httpService) {
80+
return null;
81+
}
82+
return (
83+
<DropdownItem
84+
value={service.httpService.httpPath}
85+
key={`${workspace.name}-${service.httpService.displayName}`}
86+
>
87+
{service.httpService.displayName}
88+
</DropdownItem>
89+
);
90+
})}
91+
</DropdownList>
92+
</Dropdown>
93+
</div>
9294
);
9395
};

0 commit comments

Comments
 (0)