@@ -23,7 +23,7 @@ posthog.init(process.env.POSTHOG_KEY!, {
|
|||||||
const HomePage = lazy(() => import("./pages/HomePage"));
|
const HomePage = lazy(() => import("./pages/HomePage"));
|
||||||
const NotFoundPage = lazy(() => import("./pages/NotFoundPage"));
|
const NotFoundPage = lazy(() => import("./pages/NotFoundPage"));
|
||||||
const PeoplesPage = lazy(() => import("./pages/PeoplesPage"));
|
const PeoplesPage = lazy(() => import("./pages/PeoplesPage"));
|
||||||
const VendorsPage = lazy(() => import("./pages/VendorsPage"));
|
const VendorList = lazy(() => import("./pages/VendorList"));
|
||||||
const FrameworksPage = lazy(() => import("./pages/FrameworksPage"));
|
const FrameworksPage = lazy(() => import("./pages/FrameworksPage"));
|
||||||
const FrameworkOverviewPage = lazy(() => import("./pages/FrameworkOverviewPage"));
|
const FrameworkOverviewPage = lazy(() => import("./pages/FrameworkOverviewPage"));
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ function App() {
|
|||||||
<Route path="/" element={<ConsoleLayout />}>
|
<Route path="/" element={<ConsoleLayout />}>
|
||||||
<Route index element={<HomePage />} />
|
<Route index element={<HomePage />} />
|
||||||
<Route path="/peoples" element={<PeoplesPage />} />
|
<Route path="/peoples" element={<PeoplesPage />} />
|
||||||
<Route path="/vendors" element={<VendorsPage />} />
|
<Route path="/vendors" element={<VendorList />} />
|
||||||
<Route path="/frameworks" element={<FrameworksPage />} />
|
<Route path="/frameworks" element={<FrameworksPage />} />
|
||||||
<Route path="/frameworks/:frameworkId" element={<FrameworkOverviewPage />} />
|
<Route path="/frameworks/:frameworkId" element={<FrameworkOverviewPage />} />
|
||||||
</Route>
|
</Route>
|
||||||
|
|||||||
@@ -7,11 +7,13 @@ import {
|
|||||||
} from "react-relay";
|
} from "react-relay";
|
||||||
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
|
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
|
||||||
import { Badge } from "@/components/ui/badge";
|
import { Badge } from "@/components/ui/badge";
|
||||||
import { CircleUser, Globe, Shield } from "lucide-react";
|
import { CircleUser, Globe, Shield, Store } from "lucide-react";
|
||||||
|
import { Input } from "@/components/ui/input";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
import type { VendorsPageQuery as VendorsPageQueryType } from "./__generated__/VendorsPageQuery.graphql";
|
import type { VendorsPageQuery as VendorsPageQueryType } from "./__generated__/VendorsPageQuery.graphql";
|
||||||
|
|
||||||
const VendorsPageQuery = graphql`
|
const VendorListQuery = graphql`
|
||||||
query VendorsPageQuery {
|
query VendorListQuery {
|
||||||
node(id: "AZSfP_xAcAC5IAAAAAAltA") {
|
node(id: "AZSfP_xAcAC5IAAAAAAltA") {
|
||||||
id
|
id
|
||||||
... on Organization {
|
... on Organization {
|
||||||
@@ -30,12 +32,12 @@ const VendorsPageQuery = graphql`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
function VendorsPageContent({
|
function VendorListContent({
|
||||||
queryRef,
|
queryRef,
|
||||||
}: {
|
}: {
|
||||||
queryRef: PreloadedQuery<VendorsPageQueryType>;
|
queryRef: PreloadedQuery<VendorsPageQueryType>;
|
||||||
}) {
|
}) {
|
||||||
const data = usePreloadedQuery(VendorsPageQuery, queryRef);
|
const data = usePreloadedQuery(VendorListQuery, queryRef);
|
||||||
const vendors = data.node.vendors?.edges.map(edge => edge?.node) ?? [];
|
const vendors = data.node.vendors?.edges.map(edge => edge?.node) ?? [];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -46,6 +48,34 @@ function VendorsPageContent({
|
|||||||
Keep track of your company's vendors and their compliance status.
|
Keep track of your company's vendors and their compliance status.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="rounded-lg border p-4 shadow-sm bg-card text-card-foreground">
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<div className="flex items-center gap-4">
|
||||||
|
<Avatar className="h-10 w-10">
|
||||||
|
<AvatarFallback>+</AvatarFallback>
|
||||||
|
</Avatar>
|
||||||
|
<div className="space-y-1">
|
||||||
|
<p className="text-sm font-medium leading-none">Add a vendor</p>
|
||||||
|
<p className="text-sm text-muted-foreground">Search and add new vendors</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center gap-4">
|
||||||
|
<div className="flex gap-3">
|
||||||
|
<Input
|
||||||
|
type="text"
|
||||||
|
placeholder="Type vendor's name"
|
||||||
|
className="w-64"
|
||||||
|
/>
|
||||||
|
<Button variant="secondary">
|
||||||
|
Search
|
||||||
|
<span className="ml-2">→</span>
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
{vendors.map((vendor) => (
|
{vendors.map((vendor) => (
|
||||||
<div
|
<div
|
||||||
@@ -81,7 +111,7 @@ function VendorsPageContent({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function VendorsPageFallback() {
|
function VendorListFallback() {
|
||||||
return (
|
return (
|
||||||
<div className="p-6 space-y-6">
|
<div className="p-6 space-y-6">
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
@@ -97,20 +127,20 @@ function VendorsPageFallback() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function VendorsPage() {
|
export default function VendorList() {
|
||||||
const [queryRef, loadQuery] = useQueryLoader<VendorsPageQueryType>(VendorsPageQuery);
|
const [queryRef, loadQuery] = useQueryLoader<VendorsPageQueryType>(VendorListQuery);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
loadQuery({});
|
loadQuery({});
|
||||||
}, [loadQuery]);
|
}, [loadQuery]);
|
||||||
|
|
||||||
if (!queryRef) {
|
if (!queryRef) {
|
||||||
return <VendorsPageFallback />;
|
return <VendorListFallback />;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Suspense fallback={<VendorsPageFallback />}>
|
<Suspense fallback={<VendorListFallback />}>
|
||||||
<VendorsPageContent queryRef={queryRef} />
|
<VendorListContent queryRef={queryRef} />
|
||||||
</Suspense>
|
</Suspense>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @generated SignedSource<<76613a71949a43eb69fb9dfd0a4c1694>>
|
* @generated SignedSource<<825817de2398615779403c0817995f9f>>
|
||||||
* @lightSyntaxTransform
|
* @lightSyntaxTransform
|
||||||
* @nogrep
|
* @nogrep
|
||||||
*/
|
*/
|
||||||
@@ -9,8 +9,8 @@
|
|||||||
// @ts-nocheck
|
// @ts-nocheck
|
||||||
|
|
||||||
import { ConcreteRequest } from 'relay-runtime';
|
import { ConcreteRequest } from 'relay-runtime';
|
||||||
export type VendorsPageQuery$variables = Record<PropertyKey, never>;
|
export type VendorListQuery$variables = Record<PropertyKey, never>;
|
||||||
export type VendorsPageQuery$data = {
|
export type VendorListQuery$data = {
|
||||||
readonly node: {
|
readonly node: {
|
||||||
readonly id: string;
|
readonly id: string;
|
||||||
readonly vendors?: {
|
readonly vendors?: {
|
||||||
@@ -25,9 +25,9 @@ export type VendorsPageQuery$data = {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
export type VendorsPageQuery = {
|
export type VendorListQuery = {
|
||||||
response: VendorsPageQuery$data;
|
response: VendorListQuery$data;
|
||||||
variables: VendorsPageQuery$variables;
|
variables: VendorListQuery$variables;
|
||||||
};
|
};
|
||||||
|
|
||||||
const node: ConcreteRequest = (function(){
|
const node: ConcreteRequest = (function(){
|
||||||
@@ -112,7 +112,7 @@ return {
|
|||||||
"argumentDefinitions": [],
|
"argumentDefinitions": [],
|
||||||
"kind": "Fragment",
|
"kind": "Fragment",
|
||||||
"metadata": null,
|
"metadata": null,
|
||||||
"name": "VendorsPageQuery",
|
"name": "VendorListQuery",
|
||||||
"selections": [
|
"selections": [
|
||||||
{
|
{
|
||||||
"alias": null,
|
"alias": null,
|
||||||
@@ -135,7 +135,7 @@ return {
|
|||||||
"operation": {
|
"operation": {
|
||||||
"argumentDefinitions": [],
|
"argumentDefinitions": [],
|
||||||
"kind": "Operation",
|
"kind": "Operation",
|
||||||
"name": "VendorsPageQuery",
|
"name": "VendorListQuery",
|
||||||
"selections": [
|
"selections": [
|
||||||
{
|
{
|
||||||
"alias": null,
|
"alias": null,
|
||||||
@@ -160,16 +160,16 @@ return {
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
"cacheID": "6e90edfb4e2117a046157785647169c7",
|
"cacheID": "ced04a7cfd00f4525d09d6bf5303167b",
|
||||||
"id": null,
|
"id": null,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"name": "VendorsPageQuery",
|
"name": "VendorListQuery",
|
||||||
"operationKind": "query",
|
"operationKind": "query",
|
||||||
"text": "query VendorsPageQuery {\n node(id: \"AZSfP_xAcAC5IAAAAAAltA\") {\n __typename\n id\n ... on Organization {\n vendors {\n edges {\n node {\n id\n name\n createdAt\n updatedAt\n }\n }\n }\n }\n }\n}\n"
|
"text": "query VendorListQuery {\n node(id: \"AZSfP_xAcAC5IAAAAAAltA\") {\n __typename\n id\n ... on Organization {\n vendors {\n edges {\n node {\n id\n name\n createdAt\n updatedAt\n }\n }\n }\n }\n }\n}\n"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
(node as any).hash = "22ce46326b87e66442cdb832085dfe60";
|
(node as any).hash = "4f125111c515f868693b33e5209d05fd";
|
||||||
|
|
||||||
export default node;
|
export default node;
|
||||||
Reference in New Issue
Block a user