Skip to content

Commit 29223e6

Browse files
authored
Housekeeping on GraphqlQueryDetailsPage component (#5871)
1 parent c9584a4 commit 29223e6

File tree

3 files changed

+55
-69
lines changed

3 files changed

+55
-69
lines changed

frontend/app/src/pages/objects/CoreGraphQLQuery/graphql-query-details.tsx

Lines changed: 39 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,79 +2,69 @@ import { GRAPHQL_QUERY_OBJECT } from "@/config/constants";
22
import GraphqlQueryDetailsCard from "@/entities/graphql/ui/graphql-query-details-card";
33
import GraphQLQueryDetailsPageSkeleton from "@/entities/graphql/ui/graphql-query-details-page-skeleton";
44
import GraphqlQueryViewerCard from "@/entities/graphql/ui/graphql-query-viewer-card";
5-
import { getObjectDetailsPaginated } from "@/entities/nodes/api/getObjectDetails";
6-
import { getSchemaObjectColumns } from "@/entities/nodes/object-items/getSchemaObjectColumns";
5+
import { useObjectDetails } from "@/entities/nodes/hooks/useObjectDetails";
6+
import { useGetObjectPermissions } from "@/entities/permission/domain/get-object-permissions.query";
77
import { Permission } from "@/entities/permission/types";
8-
import { getPermission } from "@/entities/permission/utils";
9-
import { nodeSchemasAtom } from "@/entities/schema/stores/schema.atom";
10-
import { NodeSchema } from "@/entities/schema/types";
8+
import { ModelSchema, NodeSchema } from "@/entities/schema/types";
119
import { CoreGraphQlQuery } from "@/shared/api/graphql/generated/graphql";
12-
import useQuery from "@/shared/api/graphql/useQuery";
10+
import ErrorScreen from "@/shared/components/errors/error-screen";
1311
import NoDataFound from "@/shared/components/errors/no-data-found";
1412
import UnauthorizedScreen from "@/shared/components/errors/unauthorized-screen";
13+
import { LoadingIndicator } from "@/shared/components/loading/loading-indicator";
1514
import { useTitle } from "@/shared/hooks/useTitle";
16-
import { gql } from "@apollo/client";
17-
import { useAtomValue } from "jotai/index";
1815

19-
export default function GraphqlQueryDetailsPage({ graphqlQueryId }: { graphqlQueryId: string }) {
20-
useTitle("GraphQL Query details");
21-
22-
const objectid = graphqlQueryId;
23-
24-
const nodes = useAtomValue(nodeSchemasAtom);
25-
const graphqlQuerySchema = nodes.find((s) => s.kind === GRAPHQL_QUERY_OBJECT);
26-
27-
const columns = getSchemaObjectColumns({ schema: graphqlQuerySchema });
28-
29-
const query = gql(
30-
getObjectDetailsPaginated({
31-
objectid,
32-
kind: GRAPHQL_QUERY_OBJECT,
33-
columns,
34-
hasPermissions: true,
35-
})
36-
);
37-
38-
const { loading, data, refetch } = useQuery(query, {
39-
skip: !graphqlQuerySchema,
40-
});
16+
export interface GraphqlQueryDetailsPageProps {
17+
graphqlQuerySchema: ModelSchema;
18+
graphqlQueryId: string;
19+
}
4120

42-
if (!graphqlQuerySchema || loading) return <GraphQLQueryDetailsPageSkeleton />;
21+
export default function GraphqlQueryDetailsPage({
22+
graphqlQuerySchema,
23+
graphqlQueryId,
24+
}: GraphqlQueryDetailsPageProps) {
25+
useTitle("GraphQL Query details");
4326

44-
const graphqlQueries = data && data.CoreGraphQLQuery.edges;
45-
if (graphqlQueries.length === 0) return <NoDataFound />;
27+
const { isPending, error, data: permission } = useGetObjectPermissions(GRAPHQL_QUERY_OBJECT);
4628

47-
const graphqlQuery: CoreGraphQlQuery = graphqlQueries[0].node;
29+
if (isPending) {
30+
return <LoadingIndicator className="h-[calc(100vh-10rem)]" />;
31+
}
4832

49-
const permission = getPermission(data?.[GRAPHQL_QUERY_OBJECT]?.permissions?.edges);
33+
if (error) {
34+
return <ErrorScreen message="Something went wrong when fetching permissions." />;
35+
}
5036

5137
if (!permission.view.isAllowed) {
5238
return <UnauthorizedScreen message={permission.view.message} />;
5339
}
5440

5541
return (
56-
graphqlQuery && (
57-
<GraphqlQueryDetailsContent
58-
graphqlQuerySchema={graphqlQuerySchema}
59-
graphqlQuery={graphqlQuery}
60-
refetch={refetch}
61-
permission={permission}
62-
/>
63-
)
42+
<GraphqlQueryDetails
43+
graphqlQueryId={graphqlQueryId}
44+
graphqlQuerySchema={graphqlQuerySchema as NodeSchema}
45+
permission={permission}
46+
/>
6447
);
6548
}
6649

67-
const GraphqlQueryDetailsContent = ({
68-
graphqlQuery,
50+
const GraphqlQueryDetails = ({
51+
graphqlQueryId,
6952
graphqlQuerySchema,
70-
refetch,
7153
permission,
7254
}: {
73-
graphqlQuery: CoreGraphQlQuery;
55+
graphqlQueryId: string;
7456
graphqlQuerySchema: NodeSchema;
75-
refetch: () => Promise<unknown>;
7657
permission: Permission;
7758
}) => {
59+
const { loading, data, refetch } = useObjectDetails(graphqlQuerySchema, graphqlQueryId);
60+
61+
if (loading) return <GraphQLQueryDetailsPageSkeleton />;
62+
63+
const graphqlQueries = data && data.CoreGraphQLQuery.edges;
64+
if (graphqlQueries.length === 0) return <NoDataFound />;
65+
66+
const graphqlQuery: CoreGraphQlQuery = graphqlQueries[0].node;
67+
7868
return (
7969
<section className="flex flex-wrap lg:flex-nowrap items-start gap-2 p-2">
8070
<GraphqlQueryDetailsCard
@@ -84,7 +74,7 @@ const GraphqlQueryDetailsContent = ({
8474
permission={permission}
8575
/>
8676

87-
<GraphqlQueryViewerCard query={graphqlQuery.query.value ?? ""} permission={permission} />
77+
<GraphqlQueryViewerCard query={graphqlQuery.query.value ?? ""} />
8878
</section>
8979
);
9080
};

frontend/app/src/pages/objects/object-details.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { GRAPHQL_QUERY_OBJECT, TASK_OBJECT } from "@/config/constants";
22
import { useObjectDetails } from "@/entities/nodes/hooks/useObjectDetails";
33
import ObjectItemDetails from "@/entities/nodes/object-item-details/object-item-details-paginated";
4+
import { ModelSchema } from "@/entities/schema/types";
45
import { useSchema } from "@/entities/schema/ui/hooks/useSchema";
56
import { constructPath } from "@/shared/api/rest/fetch";
67
import ErrorScreen from "@/shared/components/errors/error-screen";
@@ -11,11 +12,8 @@ import { NetworkStatus } from "@apollo/client";
1112
import { Navigate, useParams } from "react-router";
1213
import GraphqlQueryDetailsPage from "./CoreGraphQLQuery/graphql-query-details";
1314

14-
export function ObjectDetailsPage() {
15-
const { objectKind, objectid } = useParams();
16-
const { schema } = useSchema(objectKind);
17-
18-
if (!schema) return <ErrorScreen message={`Object ${objectKind} not found.`} />;
15+
export function ObjectDetailsPage({ schema }: { schema: ModelSchema }) {
16+
const { objectid } = useParams();
1917

2018
const { data, networkStatus, error, permission } = useObjectDetails(schema, objectid as string);
2119

@@ -59,14 +57,19 @@ export function ObjectDetailsPage() {
5957

6058
export const Component = () => {
6159
const { objectKind, objectid } = useParams();
60+
const { schema } = useSchema(objectKind);
61+
62+
if (!schema) {
63+
return <ErrorScreen message={`Schema ${objectKind} not found.`} />;
64+
}
6265

6366
if (!objectid) {
6467
return <Navigate to={constructPath(`/objects/${objectKind}`)} />;
6568
}
6669

6770
if (objectKind === GRAPHQL_QUERY_OBJECT) {
68-
return <GraphqlQueryDetailsPage graphqlQueryId={objectid} />;
71+
return <GraphqlQueryDetailsPage graphqlQuerySchema={schema} graphqlQueryId={objectid} />;
6972
}
7073

71-
return <ObjectDetailsPage />;
74+
return <ObjectDetailsPage schema={schema} />;
7275
};

frontend/app/tests/integrations/screens/object-details.cy.tsx

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import { MockedProvider } from "@apollo/client/testing";
55
import { ErrorBoundary } from "react-error-boundary";
66
import { Route, Routes } from "react-router";
77
import { BranchContext } from "../../../src/entities/branches/ui/branches-provider";
8-
import { nodeSchemasAtom } from "../../../src/entities/schema/stores/schema.atom";
98
import { ObjectDetailsPage } from "../../../src/pages/objects/object-details";
109
import ErrorFallback from "../../../src/shared/components/errors/error-fallback";
10+
import { generateBranch } from "../../fake/branch";
1111
import {
1212
deviceDetailsMocksASNName,
1313
deviceDetailsMocksData,
@@ -19,7 +19,6 @@ import {
1919
getPermissionsData,
2020
getPermissionsQuery,
2121
} from "../../mocks/data/devices";
22-
import { TestProvider } from "../../mocks/jotai/atom";
2322

2423
// URL for the current view
2524
const graphqlQueryItemsUrl = `/objects/InfraDevice/${deviceDetailsMocksId}`;
@@ -65,15 +64,6 @@ const mocks: any[] = [
6564
},
6665
];
6766

68-
// Provide the initial value for jotai
69-
const ObjectDetailsProvider = () => {
70-
return (
71-
<TestProvider initialValues={[[nodeSchemasAtom, deviceDetailsMocksSchema]]}>
72-
<ObjectDetailsPage />
73-
</TestProvider>
74-
);
75-
};
76-
7767
describe("List screen", () => {
7868
it("should fetch object details and render a list of details", () => {
7969
cy.viewport(1920, 1080);
@@ -83,11 +73,14 @@ describe("List screen", () => {
8373

8474
// Mount the view with the default route and the mocked data
8575
cy.mount(
86-
<BranchContext value={{ currentBranch: { name: "main" } }}>
76+
<BranchContext value={{ currentBranch: generateBranch(), setCurrentBranch: () => {} }}>
8777
<MockedProvider mocks={mocks} addTypename={false}>
8878
<ErrorBoundary FallbackComponent={ErrorFallback}>
8979
<Routes>
90-
<Route element={<ObjectDetailsProvider />} path={graphqlQueryItemsPath} />
80+
<Route
81+
element={<ObjectDetailsPage schema={deviceDetailsMocksSchema[0]} />}
82+
path={graphqlQueryItemsPath}
83+
/>
9184
</Routes>
9285
</ErrorBoundary>
9386
</MockedProvider>

0 commit comments

Comments
 (0)