Enhance vendor management with extended data fields

Signed-off-by: gearnode <bryan@frimin.fr>
This commit is contained in:
gearnode
2025-04-10 17:19:35 -07:00
parent 25ca9e5d3b
commit 9fa33726e7
21 changed files with 2013 additions and 288 deletions

View File

@@ -24,6 +24,24 @@ import { VendorListViewDeleteVendorMutation } from "./__generated__/VendorListVi
import { VendorListViewPaginationQuery } from "./__generated__/VendorListViewPaginationQuery.graphql";
import { VendorListView_vendors$key } from "./__generated__/VendorListView_vendors.graphql";
interface VendorData {
name: string;
headquarterAddress: string;
legalName: string;
websiteUrl: string;
privacyPolicyUrl: string;
serviceLevelAgreementUrl?: string;
category: string;
dataProcessingAgreementUrl?: string;
description: string;
categories: string[];
certifications: string[];
securityPageUrl?: string;
trustPageUrl?: string;
statusPageUrl?: string;
termsOfServiceUrl?: string;
}
const ITEMS_PER_PAGE = 25;
const vendorListViewQuery = graphql`
@@ -111,38 +129,6 @@ const deleteVendorMutation = graphql`
}
`;
// Define a proper type for the vendor items
interface VendorItem {
id: string;
name: string;
createdAt: string;
}
// TODO: Remove this once we have a real list of vendors
const vendorsList: VendorItem[] = [
{ id: "1", name: "Amazon Web Services", createdAt: new Date().toISOString() },
{
id: "2",
name: "Google Cloud Platform",
createdAt: new Date().toISOString(),
},
{ id: "3", name: "Microsoft Azure", createdAt: new Date().toISOString() },
{ id: "4", name: "Salesforce", createdAt: new Date().toISOString() },
{ id: "5", name: "Slack", createdAt: new Date().toISOString() },
{ id: "6", name: "Zoom", createdAt: new Date().toISOString() },
{ id: "7", name: "Dropbox", createdAt: new Date().toISOString() },
{ id: "8", name: "Trello", createdAt: new Date().toISOString() },
{ id: "9", name: "Asana", createdAt: new Date().toISOString() },
{ id: "10", name: "Notion", createdAt: new Date().toISOString() },
{ id: "11", name: "GitHub", createdAt: new Date().toISOString() },
{ id: "12", name: "GitLab", createdAt: new Date().toISOString() },
{ id: "13", name: "Bitbucket", createdAt: new Date().toISOString() },
{ id: "14", name: "Docker", createdAt: new Date().toISOString() },
{ id: "15", name: "Kubernetes", createdAt: new Date().toISOString() },
{ id: "16", name: "Jenkins", createdAt: new Date().toISOString() },
{ id: "17", name: "CircleCI", createdAt: new Date().toISOString() },
];
function LoadAboveButton({
isLoading,
hasMore,
@@ -210,13 +196,40 @@ function VendorListContent({
const [, setSearchParams] = useSearchParams();
const [, startTransition] = useTransition();
const [searchTerm, setSearchTerm] = useState("");
const [filteredVendors, setFilteredVendors] = useState<VendorItem[]>([]);
const [filteredVendors, setFilteredVendors] = useState<VendorData[]>([]);
const [vendorsData, setVendorsData] = useState<VendorData[]>([]);
const [isLoadingVendors, setIsLoadingVendors] = useState(false);
const [createVendor] =
useMutation<VendorListViewCreateVendorMutation>(createVendorMutation);
const [deleteVendor] =
useMutation<VendorListViewDeleteVendorMutation>(deleteVendorMutation);
const { organizationId } = useParams();
useEffect(() => {
const loadVendorsData = async () => {
try {
setIsLoadingVendors(true);
const response = await fetch("/data/vendors/vendors.json");
if (!response.ok) {
throw new Error("Failed to load vendors data");
}
const data = await response.json();
setVendorsData(data);
} catch (error) {
console.error("Error loading vendors data:", error);
toast({
title: "Error",
description: "Failed to load vendors data",
variant: "destructive",
});
} finally {
setIsLoadingVendors(false);
}
};
loadVendorsData();
}, [toast]);
const {
data: vendorsConnection,
loadNext,
@@ -234,7 +247,7 @@ function VendorListContent({
vendorsConnection.vendors.edges.map((edge) => edge.node) ?? [];
const pageInfo = vendorsConnection.vendors.pageInfo;
const fuse = new Fuse(vendorsList, {
const fuse = new Fuse<VendorData>(vendorsData, {
keys: ["name"],
threshold: 0.3,
});
@@ -269,16 +282,22 @@ function VendorListContent({
setFilteredVendors(results);
}
}}
disabled={isLoadingVendors}
/>
{isLoadingVendors && (
<div className="absolute inset-0 flex items-center justify-center bg-background/50">
<div className="animate-spin rounded-full h-6 w-6 border-b-2 border-primary"></div>
</div>
)}
{searchTerm.trim() !== "" && (
<div
style={{ borderRadius: "0.3rem" }}
className="absolute top-full left-0 mt-1 w-[calc(100%-100px)] max-h-48 overflow-y-auto border bg-invert-bg shadow-md z-10"
>
{filteredVendors.map((vendor: VendorItem) => (
{filteredVendors.map((vendor) => (
<button
key={vendor.id}
key={vendor.name}
className="w-full px-3 py-2 text-left bg-invert-bg hover:bg-h-subtle-bg"
onClick={() => {
createVendor({
@@ -287,7 +306,21 @@ function VendorListContent({
input: {
organizationId: data.organization.id,
name: vendor.name,
description: "",
description: vendor.description,
headquarterAddress: vendor.headquarterAddress,
legalName: vendor.legalName,
websiteUrl: vendor.websiteUrl,
category: vendor.category,
privacyPolicyUrl: vendor.privacyPolicyUrl,
serviceLevelAgreementUrl:
vendor.serviceLevelAgreementUrl,
dataProcessingAgreementUrl:
vendor.dataProcessingAgreementUrl,
certifications: vendor.certifications,
securityPageUrl: vendor.securityPageUrl,
trustPageUrl: vendor.trustPageUrl,
statusPageUrl: vendor.statusPageUrl,
termsOfServiceUrl: vendor.termsOfServiceUrl,
serviceStartAt: new Date().toISOString(),
serviceCriticality: "LOW",
riskTier: "GENERAL",

View File

@@ -5,7 +5,7 @@ import { Label } from "@/components/ui/label";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import { useToast } from "@/hooks/use-toast";
import { HelpCircle } from "lucide-react";
import { HelpCircle, X } from "lucide-react";
import {
graphql,
PreloadedQuery,
@@ -18,6 +18,7 @@ import { Suspense, useEffect, useState, useCallback, useRef } from "react";
import type { VendorViewQuery as VendorViewQueryType } from "./__generated__/VendorViewQuery.graphql";
import type { VendorViewDeleteComplianceReportMutation as DeleteComplianceReportMutationType } from "./__generated__/VendorViewDeleteComplianceReportMutation.graphql";
import type { VendorViewUploadComplianceReportMutation as UploadComplianceReportMutationType } from "./__generated__/VendorViewUploadComplianceReportMutation.graphql";
import type { VendorViewUpdateVendorMutation } from "./__generated__/VendorViewUpdateVendorMutation.graphql";
import { useParams } from "react-router";
import { cn } from "@/lib/utils";
import { PageTemplate } from "@/components/PageTemplate";
@@ -37,6 +38,14 @@ const vendorViewQuery = graphql`
statusPageUrl
termsOfServiceUrl
privacyPolicyUrl
serviceLevelAgreementUrl
dataProcessingAgreementUrl
securityPageUrl
trustPageUrl
certifications
headquarterAddress
legalName
websiteUrl
createdAt
updatedAt
complianceReports(first: 100)
@@ -72,6 +81,14 @@ const updateVendorMutation = graphql`
statusPageUrl
termsOfServiceUrl
privacyPolicyUrl
serviceLevelAgreementUrl
dataProcessingAgreementUrl
securityPageUrl
trustPageUrl
certifications
headquarterAddress
legalName
websiteUrl
updatedAt
}
}
@@ -277,6 +294,55 @@ function ComplianceReportsTable({
);
}
function TagList({
tags,
onAdd,
onRemove,
}: {
tags: readonly string[];
onAdd: (tag: string) => void;
onRemove: (tag: string) => void;
}) {
const [newTag, setNewTag] = useState("");
const handleAddTag = (e: React.KeyboardEvent<HTMLInputElement>) => {
if (e.key === "Enter" && newTag.trim()) {
e.preventDefault();
onAdd(newTag.trim());
setNewTag("");
}
};
return (
<div className="space-y-2">
<div className="flex flex-wrap gap-2">
{tags.map((tag) => (
<div
key={tag}
className="flex items-center gap-1 rounded-full bg-primary/10 px-3 py-1 text-sm"
>
<span>{tag}</span>
<button
onClick={() => onRemove(tag)}
className="text-primary hover:text-primary/80"
>
<X className="h-3 w-3" />
</button>
</div>
))}
</div>
<Input
type="text"
value={newTag}
onChange={(e) => setNewTag(e.target.value)}
onKeyDown={handleAddTag}
placeholder="Type and press Enter to add a certification"
className="mt-2"
/>
</div>
);
}
function VendorViewContent({
queryRef,
}: {
@@ -294,8 +360,17 @@ function VendorViewContent({
statusPageUrl: data.node.statusPageUrl || "",
termsOfServiceUrl: data.node.termsOfServiceUrl || "",
privacyPolicyUrl: data.node.privacyPolicyUrl || "",
serviceLevelAgreementUrl: data.node.serviceLevelAgreementUrl || "",
dataProcessingAgreementUrl: data.node.dataProcessingAgreementUrl || "",
securityPageUrl: data.node.securityPageUrl || "",
trustPageUrl: data.node.trustPageUrl || "",
certifications: data.node.certifications || [],
headquarterAddress: data.node.headquarterAddress || "",
legalName: data.node.legalName || "",
websiteUrl: data.node.websiteUrl || "",
});
const [updateVendor] = useMutation(updateVendorMutation);
const [updateVendor] =
useMutation<VendorViewUpdateVendorMutation>(updateVendorMutation);
const [deleteVendorComplianceReport] =
useMutation<DeleteComplianceReportMutationType>(
deleteComplianceReportMutation
@@ -321,7 +396,7 @@ function VendorViewContent({
updateVendor({
variables: {
input: {
id: data.node.id,
id: data.node.id!,
...formattedData,
},
},
@@ -362,7 +437,6 @@ function VendorViewContent({
setEditedFields((prev) => new Set(prev).add(field));
};
// Update the cancel handler to also format dates
const handleCancel = () => {
setFormData({
name: data.node.name || "",
@@ -374,6 +448,14 @@ function VendorViewContent({
statusPageUrl: data.node.statusPageUrl || "",
termsOfServiceUrl: data.node.termsOfServiceUrl || "",
privacyPolicyUrl: data.node.privacyPolicyUrl || "",
serviceLevelAgreementUrl: data.node.serviceLevelAgreementUrl || "",
dataProcessingAgreementUrl: data.node.dataProcessingAgreementUrl || "",
securityPageUrl: data.node.securityPageUrl || "",
trustPageUrl: data.node.trustPageUrl || "",
certifications: data.node.certifications || [],
headquarterAddress: data.node.headquarterAddress || "",
legalName: data.node.legalName || "",
websiteUrl: data.node.websiteUrl || "",
});
setEditedFields(new Set());
};
@@ -497,6 +579,24 @@ function VendorViewContent({
onChange={(value) => handleFieldChange("description", value)}
/>
<EditableField
label="Legal Name"
value={formData.legalName}
onChange={(value) => handleFieldChange("legalName", value)}
/>
<EditableField
label="Headquarter Address"
value={formData.headquarterAddress}
onChange={(value) => handleFieldChange("headquarterAddress", value)}
/>
<EditableField
label="Website URL"
value={formData.websiteUrl}
onChange={(value) => handleFieldChange("websiteUrl", value)}
/>
<Card className="p-6">
<div className="space-y-4">
<div className="space-y-2">
@@ -628,16 +728,29 @@ function VendorViewContent({
"General vendor with minimal risk"}
</p>
</div>
</div>
</div>
</Card>
<Card className="p-6">
<div className="space-y-4">
<div className="space-y-2">
<h2 className="text-lg font-medium">URLs</h2>
<p className="text-sm text-secondary">
Important URLs related to the vendor
</p>
</div>
<div className="space-y-4">
<EditableField
label="Status Page URL"
value={formData.statusPageUrl || ""}
value={formData.statusPageUrl}
onChange={(value) => handleFieldChange("statusPageUrl", value)}
/>
<EditableField
label="Terms of Service URL"
value={formData.termsOfServiceUrl || ""}
value={formData.termsOfServiceUrl}
onChange={(value) =>
handleFieldChange("termsOfServiceUrl", value)
}
@@ -645,11 +758,76 @@ function VendorViewContent({
<EditableField
label="Privacy Policy URL"
value={formData.privacyPolicyUrl || ""}
value={formData.privacyPolicyUrl}
onChange={(value) =>
handleFieldChange("privacyPolicyUrl", value)
}
/>
<EditableField
label="Service Level Agreement URL"
value={formData.serviceLevelAgreementUrl}
onChange={(value) =>
handleFieldChange("serviceLevelAgreementUrl", value)
}
/>
<EditableField
label="Data Processing Agreement URL"
value={formData.dataProcessingAgreementUrl}
onChange={(value) =>
handleFieldChange("dataProcessingAgreementUrl", value)
}
/>
<EditableField
label="Security Page URL"
value={formData.securityPageUrl}
onChange={(value) =>
handleFieldChange("securityPageUrl", value)
}
/>
<EditableField
label="Trust Page URL"
value={formData.trustPageUrl}
onChange={(value) => handleFieldChange("trustPageUrl", value)}
/>
</div>
</div>
</Card>
<Card className="p-6">
<div className="space-y-4">
<div className="space-y-2">
<h2 className="text-lg font-medium">Certifications</h2>
<p className="text-sm text-secondary">
List of certifications held by the vendor
</p>
</div>
<div className="space-y-4">
<div className="space-y-2">
<div className="flex items-center gap-2">
<HelpCircle className="h-4 w-4 text-tertiary" />
<Label className="text-sm">Certifications</Label>
</div>
<TagList
tags={[...formData.certifications]}
onAdd={(tag) =>
handleFieldChange("certifications", [
...formData.certifications,
tag,
])
}
onRemove={(tag) =>
handleFieldChange(
"certifications",
formData.certifications.filter((t) => t !== tag)
)
}
/>
</div>
</div>
</div>
</Card>

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<38a771b621d1e813bc7dbdd6d5bcf323>>
* @generated SignedSource<<d8ebd7f4de7a9e2e314f93e5e6b61e25>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -12,16 +12,25 @@ import { ConcreteRequest } from 'relay-runtime';
export type RiskTier = "CRITICAL" | "GENERAL" | "SIGNIFICANT";
export type ServiceCriticality = "HIGH" | "LOW" | "MEDIUM";
export type CreateVendorInput = {
description: string;
category?: string | null | undefined;
certifications?: ReadonlyArray<string> | null | undefined;
dataProcessingAgreementUrl?: string | null | undefined;
description?: string | null | undefined;
headquarterAddress?: string | null | undefined;
legalName?: string | null | undefined;
name: string;
organizationId: string;
privacyPolicyUrl?: string | null | undefined;
riskTier: RiskTier;
securityPageUrl?: string | null | undefined;
serviceCriticality: ServiceCriticality;
serviceLevelAgreementUrl?: string | null | undefined;
serviceStartAt: string;
serviceTerminationAt?: string | null | undefined;
statusPageUrl?: string | null | undefined;
termsOfServiceUrl?: string | null | undefined;
trustPageUrl?: string | null | undefined;
websiteUrl?: string | null | undefined;
};
export type VendorListViewCreateVendorMutation$variables = {
connections: ReadonlyArray<string>;
@@ -32,7 +41,7 @@ export type VendorListViewCreateVendorMutation$data = {
readonly vendorEdge: {
readonly node: {
readonly createdAt: string;
readonly description: string;
readonly description: string | null | undefined;
readonly id: string;
readonly name: string;
readonly riskTier: RiskTier;

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<7b424e7690762d554e28421c32fdee78>>
* @generated SignedSource<<dce76b1271e95cbf0d70b18be492a389>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -18,7 +18,7 @@ export type VendorListView_vendors$data = {
readonly edges: ReadonlyArray<{
readonly node: {
readonly createdAt: string;
readonly description: string;
readonly description: string | null | undefined;
readonly id: string;
readonly name: string;
readonly riskTier: RiskTier;

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<e84da0f625c9ae5495a0cb0c99c88c81>>
* @generated SignedSource<<f69485d1f583f57e60850e2bc6428763>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -16,6 +16,7 @@ export type VendorViewQuery$variables = {
};
export type VendorViewQuery$data = {
readonly node: {
readonly certifications?: ReadonlyArray<string>;
readonly complianceReports?: {
readonly edges: ReadonlyArray<{
readonly node: {
@@ -30,17 +31,24 @@ export type VendorViewQuery$data = {
}>;
};
readonly createdAt?: string;
readonly description?: string;
readonly dataProcessingAgreementUrl?: string | null | undefined;
readonly description?: string | null | undefined;
readonly headquarterAddress?: string | null | undefined;
readonly id?: string;
readonly legalName?: string | null | undefined;
readonly name?: string;
readonly privacyPolicyUrl?: string | null | undefined;
readonly riskTier?: RiskTier;
readonly securityPageUrl?: string | null | undefined;
readonly serviceCriticality?: ServiceCriticality;
readonly serviceLevelAgreementUrl?: string | null | undefined;
readonly serviceStartAt?: string;
readonly serviceTerminationAt?: string | null | undefined;
readonly statusPageUrl?: string | null | undefined;
readonly termsOfServiceUrl?: string | null | undefined;
readonly trustPageUrl?: string | null | undefined;
readonly updatedAt?: string;
readonly websiteUrl?: string | null | undefined;
};
};
export type VendorViewQuery = {
@@ -137,24 +145,80 @@ v12 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "createdAt",
"name": "serviceLevelAgreementUrl",
"storageKey": null
},
v13 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "updatedAt",
"name": "dataProcessingAgreementUrl",
"storageKey": null
},
v14 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "securityPageUrl",
"storageKey": null
},
v15 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "trustPageUrl",
"storageKey": null
},
v16 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "certifications",
"storageKey": null
},
v17 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "headquarterAddress",
"storageKey": null
},
v18 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "legalName",
"storageKey": null
},
v19 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "websiteUrl",
"storageKey": null
},
v20 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "createdAt",
"storageKey": null
},
v21 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "updatedAt",
"storageKey": null
},
v22 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__typename",
"storageKey": null
},
v15 = [
v23 = [
{
"alias": null,
"args": null,
@@ -207,8 +271,8 @@ v15 = [
"name": "fileSize",
"storageKey": null
},
(v12/*: any*/),
(v14/*: any*/)
(v20/*: any*/),
(v22/*: any*/)
],
"storageKey": null
},
@@ -248,7 +312,7 @@ v15 = [
"storageKey": null
}
],
v16 = [
v24 = [
{
"kind": "Literal",
"name": "first",
@@ -285,6 +349,14 @@ return {
(v11/*: any*/),
(v12/*: any*/),
(v13/*: any*/),
(v14/*: any*/),
(v15/*: any*/),
(v16/*: any*/),
(v17/*: any*/),
(v18/*: any*/),
(v19/*: any*/),
(v20/*: any*/),
(v21/*: any*/),
{
"alias": "complianceReports",
"args": null,
@@ -292,7 +364,7 @@ return {
"kind": "LinkedField",
"name": "__VendorView_complianceReports_connection",
"plural": false,
"selections": (v15/*: any*/),
"selections": (v23/*: any*/),
"storageKey": null
}
],
@@ -320,7 +392,7 @@ return {
"name": "node",
"plural": false,
"selections": [
(v14/*: any*/),
(v22/*: any*/),
(v2/*: any*/),
{
"kind": "InlineFragment",
@@ -336,19 +408,27 @@ return {
(v11/*: any*/),
(v12/*: any*/),
(v13/*: any*/),
(v14/*: any*/),
(v15/*: any*/),
(v16/*: any*/),
(v17/*: any*/),
(v18/*: any*/),
(v19/*: any*/),
(v20/*: any*/),
(v21/*: any*/),
{
"alias": null,
"args": (v16/*: any*/),
"args": (v24/*: any*/),
"concreteType": "VendorComplianceReportConnection",
"kind": "LinkedField",
"name": "complianceReports",
"plural": false,
"selections": (v15/*: any*/),
"selections": (v23/*: any*/),
"storageKey": "complianceReports(first:100)"
},
{
"alias": null,
"args": (v16/*: any*/),
"args": (v24/*: any*/),
"filters": null,
"handle": "connection",
"key": "VendorView_complianceReports",
@@ -365,7 +445,7 @@ return {
]
},
"params": {
"cacheID": "9d2e53dfbc545614d651819697eda6e6",
"cacheID": "2bef9911b76d74ced85cf4430410a297",
"id": null,
"metadata": {
"connection": [
@@ -382,11 +462,11 @@ return {
},
"name": "VendorViewQuery",
"operationKind": "query",
"text": "query VendorViewQuery(\n $vendorId: ID!\n) {\n node(id: $vendorId) {\n __typename\n ... on Vendor {\n id\n name\n description\n serviceStartAt\n serviceTerminationAt\n serviceCriticality\n riskTier\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n createdAt\n updatedAt\n complianceReports(first: 100) {\n edges {\n node {\n id\n reportName\n reportDate\n validUntil\n fileUrl\n fileSize\n createdAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n id\n }\n}\n"
"text": "query VendorViewQuery(\n $vendorId: ID!\n) {\n node(id: $vendorId) {\n __typename\n ... on Vendor {\n id\n name\n description\n serviceStartAt\n serviceTerminationAt\n serviceCriticality\n riskTier\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n serviceLevelAgreementUrl\n dataProcessingAgreementUrl\n securityPageUrl\n trustPageUrl\n certifications\n headquarterAddress\n legalName\n websiteUrl\n createdAt\n updatedAt\n complianceReports(first: 100) {\n edges {\n node {\n id\n reportName\n reportDate\n validUntil\n fileUrl\n fileSize\n createdAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n id\n }\n}\n"
}
};
})();
(node as any).hash = "110583f1567e472ba6b4a6064be056e9";
(node as any).hash = "f3f95bc0c893b61e83940c1cc0c33922";
export default node;

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<7568e87d53b6e76d1db4e3029430f118>>
* @generated SignedSource<<0e66de0cfba2c27bbf78dcb8e846ad8d>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -12,16 +12,25 @@ import { ConcreteRequest } from 'relay-runtime';
export type RiskTier = "CRITICAL" | "GENERAL" | "SIGNIFICANT";
export type ServiceCriticality = "HIGH" | "LOW" | "MEDIUM";
export type UpdateVendorInput = {
category?: string | null | undefined;
certifications?: ReadonlyArray<string> | null | undefined;
dataProcessingAgreementUrl?: string | null | undefined;
description?: string | null | undefined;
headquarterAddress?: string | null | undefined;
id: string;
legalName?: string | null | undefined;
name?: string | null | undefined;
privacyPolicyUrl?: string | null | undefined;
riskTier?: RiskTier | null | undefined;
securityPageUrl?: string | null | undefined;
serviceCriticality?: ServiceCriticality | null | undefined;
serviceLevelAgreementUrl?: string | null | undefined;
serviceStartAt?: string | null | undefined;
serviceTerminationAt?: string | null | undefined;
statusPageUrl?: string | null | undefined;
termsOfServiceUrl?: string | null | undefined;
trustPageUrl?: string | null | undefined;
websiteUrl?: string | null | undefined;
};
export type VendorViewUpdateVendorMutation$variables = {
input: UpdateVendorInput;
@@ -29,17 +38,25 @@ export type VendorViewUpdateVendorMutation$variables = {
export type VendorViewUpdateVendorMutation$data = {
readonly updateVendor: {
readonly vendor: {
readonly description: string;
readonly certifications: ReadonlyArray<string>;
readonly dataProcessingAgreementUrl: string | null | undefined;
readonly description: string | null | undefined;
readonly headquarterAddress: string | null | undefined;
readonly id: string;
readonly legalName: string | null | undefined;
readonly name: string;
readonly privacyPolicyUrl: string | null | undefined;
readonly riskTier: RiskTier;
readonly securityPageUrl: string | null | undefined;
readonly serviceCriticality: ServiceCriticality;
readonly serviceLevelAgreementUrl: string | null | undefined;
readonly serviceStartAt: string;
readonly serviceTerminationAt: string | null | undefined;
readonly statusPageUrl: string | null | undefined;
readonly termsOfServiceUrl: string | null | undefined;
readonly trustPageUrl: string | null | undefined;
readonly updatedAt: string;
readonly websiteUrl: string | null | undefined;
};
};
};
@@ -149,6 +166,62 @@ v1 = [
"name": "privacyPolicyUrl",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "serviceLevelAgreementUrl",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "dataProcessingAgreementUrl",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "securityPageUrl",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "trustPageUrl",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "certifications",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "headquarterAddress",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "legalName",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "websiteUrl",
"storageKey": null
},
{
"alias": null,
"args": null,
@@ -181,16 +254,16 @@ return {
"selections": (v1/*: any*/)
},
"params": {
"cacheID": "1a49efe0fe5e3da519e1b15a8f81cc1e",
"cacheID": "8ed69675626a00cac2cc79aa570f123d",
"id": null,
"metadata": {},
"name": "VendorViewUpdateVendorMutation",
"operationKind": "mutation",
"text": "mutation VendorViewUpdateVendorMutation(\n $input: UpdateVendorInput!\n) {\n updateVendor(input: $input) {\n vendor {\n id\n name\n description\n serviceStartAt\n serviceTerminationAt\n serviceCriticality\n riskTier\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n updatedAt\n }\n }\n}\n"
"text": "mutation VendorViewUpdateVendorMutation(\n $input: UpdateVendorInput!\n) {\n updateVendor(input: $input) {\n vendor {\n id\n name\n description\n serviceStartAt\n serviceTerminationAt\n serviceCriticality\n riskTier\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n serviceLevelAgreementUrl\n dataProcessingAgreementUrl\n securityPageUrl\n trustPageUrl\n certifications\n headquarterAddress\n legalName\n websiteUrl\n updatedAt\n }\n }\n}\n"
}
};
})();
(node as any).hash = "15ffa38b13259f9c7c6511aa72d07247";
(node as any).hash = "517efd79b3eb1781ed562368a2ed1ecc";
export default node;