Skip to content

Commit 33e439c

Browse files
chore: avoid declaring group form twice (#958)
Signed-off-by: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com>
1 parent 1017c0f commit 33e439c

File tree

4 files changed

+74
-61
lines changed

4 files changed

+74
-61
lines changed

client/src/app/pages/sbom-groups/sbom-groups-context.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import React from "react";
2+
23
import type { AxiosError } from "axios";
4+
35
import {
46
FILTER_NULL_VALUE,
57
FILTER_TEXT_CATEGORY_KEY,
68
TablePersistenceKeyPrefixes,
79
} from "@app/Constants";
10+
import type { Group, PaginatedResultsGroupDetails } from "@app/client";
811
import { FilterType } from "@app/components/FilterToolbar";
912
import {
1013
getHubRequestParams,
@@ -13,12 +16,11 @@ import {
1316
useTableControlState,
1417
} from "@app/hooks/table-controls";
1518
import { useSelectionState } from "@app/hooks/useSelectionState";
16-
17-
import type { PaginatedResultsGroupDetails } from "@app/client";
1819
import {
1920
useFetchSbomGroupChildren,
2021
useFetchSBOMGroups,
2122
} from "@app/queries/sbom-groups";
23+
2224
import { buildSbomGroupTree } from "./utils";
2325

2426
export type SbomGroupItem = PaginatedResultsGroupDetails["items"][number];
@@ -66,6 +68,10 @@ interface ISbomGroupsContext {
6668
treeExpansion: ITreeExpansionState;
6769
treeSelection: ITreeSelectionState;
6870
treeData: SbomGroupTreeNode[];
71+
72+
// Group Form Modal
73+
groupCreateUpdateModalState: "create" | Group | null;
74+
setGroupCreateUpdateModalState: (value: "create" | Group | null) => void;
6975
}
7076

7177
const contextDefaultValue = {} as ISbomGroupsContext;
@@ -161,6 +167,10 @@ export const SbomGroupsProvider: React.FunctionComponent<
161167
hasActionsColumn: true,
162168
});
163169

170+
// Create/Edit states
171+
const [groupCreateUpdateModalState, setGroupCreateUpdateModalState] =
172+
React.useState<"create" | Group | null>(null);
173+
164174
return (
165175
<SbomGroupsContext.Provider
166176
value={{
@@ -182,6 +192,8 @@ export const SbomGroupsProvider: React.FunctionComponent<
182192
selectAllNodes,
183193
},
184194
treeData: roots,
195+
groupCreateUpdateModalState,
196+
setGroupCreateUpdateModalState,
185197
}}
186198
>
187199
{children}

client/src/app/pages/sbom-groups/sbom-groups-table.tsx

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,45 @@
11
import React from "react";
2-
import { ButtonVariant, Skeleton } from "@patternfly/react-core";
32

3+
import type { AxiosError } from "axios";
4+
5+
import { ButtonVariant, Skeleton } from "@patternfly/react-core";
46
import {
57
ActionsColumn,
68
Table,
79
Tbody,
810
Td,
9-
type TdProps,
1011
TreeRowWrapper,
1112
type IAction,
13+
type TdProps,
1214
} from "@patternfly/react-table";
15+
16+
import type { Group } from "@app/client";
1317
import { ConfirmDialog } from "@app/components/ConfirmDialog.tsx";
1418
import { LoadingWrapper } from "@app/components/LoadingWrapper";
1519
import { NotificationsContext } from "@app/components/NotificationsContext.tsx";
1620
import { SimplePagination } from "@app/components/SimplePagination";
1721
import { TableCellError } from "@app/components/TableCellError";
1822
import { ConditionalTableBody } from "@app/components/TableControls";
19-
import type { Group } from "@app/client";
23+
import { childGroupDeleteDialogProps } from "@app/Constants";
24+
import { useDeleteSbomGroupMutation } from "@app/queries/sbom-groups";
25+
26+
import { SbomGroupTableData } from "./sbom-group-table-data";
2027
import {
2128
SbomGroupsContext,
2229
type SbomGroupTreeNode,
2330
} from "./sbom-groups-context";
24-
import { SbomGroupTableData } from "./sbom-group-table-data";
25-
import type { AxiosError } from "axios";
26-
import { useDeleteSbomGroupMutation } from "@app/queries/sbom-groups";
27-
import { childGroupDeleteDialogProps } from "@app/Constants";
28-
import { GroupFormModal } from "../sbom-list/components/group-form";
2931

3032
export const SbomGroupsTable: React.FC = () => {
3133
const { pushNotification } = React.useContext(NotificationsContext);
32-
const [saveGroupModalState, setSaveGroupModalState] = React.useState<
33-
"create" | Group | null
34-
>(null);
35-
const isCreateUpdateGroupModalOpen = saveGroupModalState !== null;
36-
const createUpdateGroup =
37-
saveGroupModalState !== "create" ? saveGroupModalState : null;
34+
3835
const {
3936
isFetching,
4037
fetchError,
4138
totalItemCount,
4239
tableControls,
4340
treeExpansion: { expandedNodeIds, setExpandedNodeIds, childrenNodeStatus },
4441
treeData,
42+
setGroupCreateUpdateModalState,
4543
} = React.useContext(SbomGroupsContext);
4644

4745
const {
@@ -161,7 +159,7 @@ export const SbomGroupsTable: React.FC = () => {
161159
const lastRowActions = (node: SbomGroupTreeNode): IAction[] => [
162160
{
163161
title: "Edit",
164-
onClick: () => setSaveGroupModalState(node),
162+
onClick: () => setGroupCreateUpdateModalState(node),
165163
},
166164
{
167165
title: "Delete",
@@ -218,11 +216,7 @@ export const SbomGroupsTable: React.FC = () => {
218216
isTop={false}
219217
paginationProps={paginationProps}
220218
/>
221-
<GroupFormModal
222-
isOpen={isCreateUpdateGroupModalOpen}
223-
group={createUpdateGroup}
224-
onClose={() => setSaveGroupModalState(null)}
225-
/>
219+
226220
<ConfirmDialog
227221
{...childGroupDeleteDialogProps(childGroupToDelete)}
228222
inProgress={isDeletingChildGroup}

client/src/app/pages/sbom-groups/sbom-groups-toolbar.tsx

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,10 @@ import { FilterToolbar } from "@app/components/FilterToolbar";
1111
import { SimplePagination } from "@app/components/SimplePagination";
1212

1313
import { SbomGroupsContext } from "./sbom-groups-context";
14-
import type { Group } from "@app/client";
15-
import { GroupFormModal } from "../sbom-list/components/group-form";
1614

1715
export const SbomGroupsToolbar: React.FC = () => {
18-
const { tableControls } = React.useContext(SbomGroupsContext);
19-
const [saveGroupModalState, setSaveGroupModalState] = React.useState<
20-
"create" | Group | null
21-
>(null);
22-
const isCreateUpdateGroupModalOpen = saveGroupModalState !== null;
23-
const createUpdateGroup =
24-
saveGroupModalState !== "create" ? saveGroupModalState : null;
16+
const { tableControls, setGroupCreateUpdateModalState } =
17+
React.useContext(SbomGroupsContext);
2518

2619
const {
2720
propHelpers: {
@@ -33,32 +26,25 @@ export const SbomGroupsToolbar: React.FC = () => {
3326
} = tableControls;
3427

3528
return (
36-
<>
37-
<Toolbar {...toolbarProps} aria-label="sbom-groups-toolbar">
38-
<ToolbarContent>
39-
<FilterToolbar {...filterToolbarProps} />
40-
<ToolbarItem>
41-
<Button
42-
variant="primary"
43-
onClick={() => setSaveGroupModalState("create")}
44-
>
45-
Create group
46-
</Button>
47-
</ToolbarItem>
48-
<ToolbarItem {...paginationToolbarItemProps}>
49-
<SimplePagination
50-
idPrefix="sbom-groups-table"
51-
isTop
52-
paginationProps={paginationProps}
53-
/>
54-
</ToolbarItem>
55-
</ToolbarContent>
56-
</Toolbar>
57-
<GroupFormModal
58-
isOpen={isCreateUpdateGroupModalOpen}
59-
group={createUpdateGroup}
60-
onClose={() => setSaveGroupModalState(null)}
61-
/>
62-
</>
29+
<Toolbar {...toolbarProps} aria-label="sbom-groups-toolbar">
30+
<ToolbarContent>
31+
<FilterToolbar {...filterToolbarProps} />
32+
<ToolbarItem>
33+
<Button
34+
variant="primary"
35+
onClick={() => setGroupCreateUpdateModalState("create")}
36+
>
37+
Create group
38+
</Button>
39+
</ToolbarItem>
40+
<ToolbarItem {...paginationToolbarItemProps}>
41+
<SimplePagination
42+
idPrefix="sbom-groups-table"
43+
isTop
44+
paginationProps={paginationProps}
45+
/>
46+
</ToolbarItem>
47+
</ToolbarContent>
48+
</Toolbar>
6349
);
6450
};

client/src/app/pages/sbom-groups/sbom-groups.tsx

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import type React from "react";
1+
import React from "react";
22

33
import { Content, PageSection } from "@patternfly/react-core";
44

55
import { DocumentMetadata } from "@app/components/DocumentMetadata";
66

7-
import { SbomGroupsProvider } from "./sbom-groups-context";
8-
import { SbomGroupsToolbar } from "./sbom-groups-toolbar";
7+
import { GroupFormModal } from "../sbom-list/components/group-form";
8+
import { SbomGroupsContext, SbomGroupsProvider } from "./sbom-groups-context";
99
import { SbomGroupsTable } from "./sbom-groups-table";
10+
import { SbomGroupsToolbar } from "./sbom-groups-toolbar";
1011

1112
export const SbomGroups: React.FC = () => {
1213
return (
@@ -22,9 +23,29 @@ export const SbomGroups: React.FC = () => {
2223
<SbomGroupsProvider>
2324
<SbomGroupsToolbar />
2425
<SbomGroupsTable />
26+
<SbomGroupsActions />
2527
</SbomGroupsProvider>
2628
</div>
2729
</PageSection>
2830
</>
2931
);
3032
};
33+
34+
const SbomGroupsActions: React.FC = () => {
35+
const { groupCreateUpdateModalState, setGroupCreateUpdateModalState } =
36+
React.useContext(SbomGroupsContext);
37+
38+
const isCreateUpdateGroupModalOpen = groupCreateUpdateModalState !== null;
39+
const createUpdateGroup =
40+
groupCreateUpdateModalState !== "create"
41+
? groupCreateUpdateModalState
42+
: null;
43+
44+
return (
45+
<GroupFormModal
46+
isOpen={isCreateUpdateGroupModalOpen}
47+
group={createUpdateGroup}
48+
onClose={() => setGroupCreateUpdateModalState(null)}
49+
/>
50+
);
51+
};

0 commit comments

Comments
 (0)