Enhance vendor management with extended data fields
Signed-off-by: gearnode <bryan@frimin.fr>
This commit is contained in:
24
apps/console/public/data/vendors/LICENSE.md
vendored
Normal file
24
apps/console/public/data/vendors/LICENSE.md
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
# Vendors Data
|
||||
|
||||
The `[vendors.json](vendors.json)` file contains data about various vendors and their security certifications. This data is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.
|
||||
|
||||
## License Requirements
|
||||
|
||||
When using this data, you must:
|
||||
|
||||
1. **Give appropriate credit** - Provide attribution to Probo Inc. and include a link to this license
|
||||
2. **Indicate if changes were made** - If you modify the data, you must indicate that changes were made
|
||||
3. **Share under the same license** - If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original
|
||||
|
||||
## Attribution Example
|
||||
|
||||
When using this data, please include the following attribution:
|
||||
|
||||
```
|
||||
Data sourced from Probo Inc. (https://getprobo.com) under CC BY-SA 4.0 license
|
||||
```
|
||||
|
||||
## More Information
|
||||
|
||||
For more information about the CC BY-SA 4.0 license, please visit:
|
||||
https://creativecommons.org/licenses/by-sa/4.0/
|
||||
309
apps/console/public/data/vendors/vendors.json
vendored
Normal file
309
apps/console/public/data/vendors/vendors.json
vendored
Normal file
@@ -0,0 +1,309 @@
|
||||
[
|
||||
{
|
||||
"name": "Slack",
|
||||
"headquarterAddress": "San Francisco, 50 Fremont Street, United States",
|
||||
"legalName": "Slack Technologies, Inc.",
|
||||
"websiteUrl": "https://slack.com",
|
||||
"privacyPolicyUrl": "https://slack.com/intl/en-gb/trust/privacy/privacy-policy",
|
||||
"serviceLevelAgreementUrl": "https://slack.com/intl/en-gb/terms/service-level-agreement",
|
||||
"description": "Slack is a team communication platform that allows users to send messages, files, and images to each other.",
|
||||
"statusPageUrl": "https://slack-status.com/",
|
||||
"termsOfServiceUrl": "https://slack.com/intl/en-gb/main-services-agreement",
|
||||
"category": "Communication",
|
||||
"certifications": [
|
||||
"ISO/IEC 27001:2022",
|
||||
"ISO/IEC 27017:2015",
|
||||
"ISO/IEC 27018:2019",
|
||||
"SOC2 Type 2",
|
||||
"C5",
|
||||
"GDPR"
|
||||
],
|
||||
"securityPageUrl": "https://slack.com/intl/en-gb/trust/security"
|
||||
},
|
||||
{
|
||||
"name": "Zoom",
|
||||
"headquarterAddress": "950 Page Mill Rd, Palo Alto, CA 94306",
|
||||
"legalName": "Zoom Video Communications, Inc.",
|
||||
"websiteUrl": "https://zoom.us",
|
||||
"privacyPolicyUrl": "https://zoom.us/privacy",
|
||||
"serviceLevelAgreementUrl": "https://explore.zoom.us/en/premier-support-terms/",
|
||||
"description": "Zoom is a video communication platform that allows users to send messages, files, and images to each other.",
|
||||
"category": "Communication",
|
||||
"certifications": [
|
||||
"ISO/IEC 27001:2022",
|
||||
"ISO/IEC 27017:2015",
|
||||
"ISO/IEC 27018:2019",
|
||||
"ISO/IEC 27701:2019",
|
||||
"SOC2 Type 2",
|
||||
"SOC2 HITRUST",
|
||||
"CSTAR LEVEL 2",
|
||||
"FedRAMP",
|
||||
"StateRAMP",
|
||||
"CJIS",
|
||||
"UK Cyber Essentials Plus",
|
||||
"iRAP",
|
||||
"ENS",
|
||||
"BSI C5",
|
||||
"gpaNRW",
|
||||
"ISMAP",
|
||||
"ETDA",
|
||||
"PCI DSS",
|
||||
"GDPR"
|
||||
],
|
||||
"securityPageUrl": "https://zoom.us/trust/security",
|
||||
"statusPageUrl": "https://status.zoom.us/"
|
||||
},
|
||||
{
|
||||
"name": "Github",
|
||||
"headquarterAddress": "88 Colin P Kelly Jr St, San Francisco, CA 94103",
|
||||
"legalName": "GitHub, Inc.",
|
||||
"websiteUrl": "https://github.com",
|
||||
"privacyPolicyUrl": "https://github.com/site/privacy",
|
||||
"serviceLevelAgreementUrl": "https://github.com/site/terms",
|
||||
"subprocessorsListUrl": "https://docs.github.com/en/site-policy/privacy-policies/github-subprocessors",
|
||||
"description": "Github is a code hosting platform for version control and collaboration.",
|
||||
"category": "Code Hosting",
|
||||
"certifications": [
|
||||
"SOC 1 Type 2",
|
||||
"SOC 2 Type 2",
|
||||
"CSA CAIQ Level 1",
|
||||
"ISO/IEC 27001:2013",
|
||||
"CSA STAR Level 2",
|
||||
"GDPR"
|
||||
],
|
||||
"securityPageUrl": "https://docs.github.com/en/code-security/security-overview/about-security-overview",
|
||||
"statusPageUrl": "https://www.githubstatus.com/"
|
||||
},
|
||||
{
|
||||
"name": "Stripe",
|
||||
"headquarterAddress": "101 Townsend St, San Francisco, CA 94103",
|
||||
"legalName": "Stripe, Inc.",
|
||||
"websiteUrl": "https://stripe.com",
|
||||
"privacyPolicyUrl": "https://stripe.com/privacy",
|
||||
"serviceLevelAgreementUrl": "https://stripe.com/legal/ssa",
|
||||
"dataProcessingAgreementUrl": "https://stripe.com/legal/dpa",
|
||||
"description": "Online payment processing platform that enables businesses to accept and manage digital payments, supporting various payment methods and currencies with integrated fraud protection and compliance features",
|
||||
"category": "Payment Processing",
|
||||
"certifications": [
|
||||
"PCI DSS v4.0",
|
||||
"SOC 2 Type 2",
|
||||
"SOC 1 Type 2",
|
||||
"SOC 3",
|
||||
"EMVCo Level 1",
|
||||
"EMVCo Level 2",
|
||||
"CBPR",
|
||||
"PRP",
|
||||
"EU-U.S. DPF",
|
||||
"EU-U.S. DPF",
|
||||
"GDPR"
|
||||
],
|
||||
"securityPageUrl": "https://stripe.com/security",
|
||||
"statusPageUrl": "https://status.stripe.com/"
|
||||
},
|
||||
{
|
||||
"name": "Cloudflare",
|
||||
"headquarterAddress": "101 Townsend St, San Francisco, CA 94103",
|
||||
"legalName": "Cloudflare, Inc.",
|
||||
"websiteUrl": "https://cloudflare.com",
|
||||
"privacyPolicyUrl": "https://cloudflare.com/privacy",
|
||||
"serviceLevelAgreementUrl": "https://www.cloudflare.com/en-gb/business-sla",
|
||||
"description": "Cloudflare is a cloud computing company that provides a range of services, including web hosting, domain name registration, and cloud storage.",
|
||||
"category": "Web Hosting",
|
||||
"certifications": [
|
||||
"ISO/IEC 27001:2013",
|
||||
"ISO/IEC 27701:2019",
|
||||
"ISO/IEC 27018:2019",
|
||||
"FedRAMP",
|
||||
"SOC 2 Type 2",
|
||||
"PCI DSS 4.0",
|
||||
"Global CBPR",
|
||||
"Global PRP",
|
||||
"EU Cloud Code of Conduct",
|
||||
"Cyber Essentials",
|
||||
"C5:2020",
|
||||
"ENS",
|
||||
"BSI Qualification",
|
||||
"WCAG 2.1 AA and Section 508",
|
||||
"APPI",
|
||||
"LGPD",
|
||||
"DPDP",
|
||||
"GDPR",
|
||||
"PDPA",
|
||||
"PIPA",
|
||||
"DORA",
|
||||
"CCPA",
|
||||
"CPRA"
|
||||
],
|
||||
"securityPageUrl": "https://www.cloudflare.com/en-gb/security",
|
||||
"statusPageUrl": "https://www.cloudflarestatus.com/"
|
||||
},
|
||||
{
|
||||
"name": "Sentry",
|
||||
"headquarterAddress": "1 Market St, San Francisco, CA 94105",
|
||||
"legalName": "Sentry, Inc.",
|
||||
"websiteUrl": "https://sentry.io",
|
||||
"privacyPolicyUrl": "https://sentry.io/privacy",
|
||||
"serviceLevelAgreementUrl": "",
|
||||
"description": "Sentry is a cloud-based platform for monitoring and analyzing application performance and user behavior.",
|
||||
"category": "Monitoring",
|
||||
"certifications": ["ISO/IEC 27001:2013", "SOC2 Type 2"],
|
||||
"securityPageUrl": "https://sentry.io/security",
|
||||
"statusPageUrl": "https://status.sentry.io/"
|
||||
},
|
||||
{
|
||||
"name": "Datadog",
|
||||
"headquarterAddress": "1 Market St, San Francisco, CA 94105",
|
||||
"legalName": "Datadog, Inc.",
|
||||
"websiteUrl": "https://datadog.com",
|
||||
"privacyPolicyUrl": "https://datadog.com/privacy",
|
||||
"serviceLevelAgreementUrl": "https://datadog.com/terms",
|
||||
"description": "Datadog is a cloud-based platform for monitoring and analyzing application performance and user behavior.",
|
||||
"category": "Monitoring",
|
||||
"certifications": [
|
||||
"CCPA",
|
||||
"CSA STAR",
|
||||
"DORA",
|
||||
"EU-US DPF",
|
||||
"FedRAMP",
|
||||
"GDPR",
|
||||
"HIPAA",
|
||||
"ISO/IEC 27001:2022",
|
||||
"ISO/IEC 27017:2015",
|
||||
"GDPR"
|
||||
],
|
||||
"securityPageUrl": "https://datadog.com/security",
|
||||
"trustPageUrl": "https://datadog.com/trust",
|
||||
"statusPageUrl": "https://status.datadoghq.com/"
|
||||
},
|
||||
{
|
||||
"name": "Vercel",
|
||||
"headquarterAddress": "1 Market St, San Francisco, CA 94105",
|
||||
"legalName": "Vercel, Inc.",
|
||||
"websiteUrl": "https://vercel.com",
|
||||
"privacyPolicyUrl": "https://vercel.com/legal/privacy-policy",
|
||||
"serviceLevelAgreementUrl": "https://vercel.com/legal/sla",
|
||||
"dataProcessingAgreementUrl": "https://vercel.com/legal/dpa",
|
||||
"description": "Vercel is a cloud-based platform for monitoring and analyzing application performance and user behavior.",
|
||||
"category": "Web Hosting",
|
||||
"certifications": [
|
||||
"ISO/IEC 27001:2013",
|
||||
"SOC2 Type 2",
|
||||
"GDPR",
|
||||
"PCI DSS",
|
||||
"HIPAA",
|
||||
"DPF",
|
||||
"CCPA",
|
||||
"PIPEDA"
|
||||
],
|
||||
"securityPageUrl": "https://vercel.com/security",
|
||||
"trustPageUrl": "https://security.vercel.com/",
|
||||
"statusPageUrl": "https://status.vercel.com/"
|
||||
},
|
||||
{
|
||||
"name": "Sendgrid",
|
||||
"headquarterAddress": "1801 California Street, Suite 500, Denver, CO 80202",
|
||||
"legalName": "SendGrid, Inc.",
|
||||
"websiteUrl": "https://sendgrid.com",
|
||||
"privacyPolicyUrl": "https://www.twilio.com/en-us/legal/privacy",
|
||||
"serviceLevelAgreementUrl": "https://sendgrid.com/terms",
|
||||
"dataProcessingAgreementUrl": "https://sendgrid.com/dpa",
|
||||
"description": "Cloud-based email delivery platform that provides transactional and marketing email services, offering reliable message delivery, analytics, and automation features for business communications.",
|
||||
"category": "Email Marketing",
|
||||
"certifications": [
|
||||
"CCPA",
|
||||
"CPRA",
|
||||
"GDPR",
|
||||
"HIPAA",
|
||||
"ISO/IEC 27001:2013",
|
||||
"ISO/IEC 27017:2015",
|
||||
"ISO/IEC 27018:2019",
|
||||
"SOC2 Type 2",
|
||||
"PCI DSS"
|
||||
],
|
||||
"securityPageUrl": "https://sendgrid.com/en-us/policies/security",
|
||||
"trustPageUrl": "https://security.twilio.com/",
|
||||
"statusPageUrl": "https://status.sendgrid.com/"
|
||||
},
|
||||
{
|
||||
"name": "Figma",
|
||||
"headquarterAddress": "760 Market St Floor 10, San Francisco, CA 94102",
|
||||
"legalName": "Figma, Inc.",
|
||||
"websiteUrl": "https://figma.com",
|
||||
"privacyPolicyUrl": "https://www.figma.com/legal/privacy/",
|
||||
"serviceSoftwareAgreementUrl": "https://www.figma.com/ssa/",
|
||||
"description": "Cloud-based design and prototyping platform that enables collaborative interface design, wireframing, and mockup creation with real-time editing capabilities for teams.",
|
||||
"category": "Design",
|
||||
"certifications": [
|
||||
"SOC 2 Type 2",
|
||||
"ISO/IEC 27001:2013",
|
||||
"ISO/IEC 27001:2022",
|
||||
"GDPR",
|
||||
"ISO/IEC 27017:2015",
|
||||
"ISO/IEC 27018:2019",
|
||||
"SOC3",
|
||||
"CCPA",
|
||||
"CSA",
|
||||
"SIG",
|
||||
"EU Cloud Code of Conduct",
|
||||
"TISAX",
|
||||
"VPAT"
|
||||
],
|
||||
"securityPageUrl": "https://www.figma.com/security",
|
||||
"trustPageUrl": "https://compliance.figma.com/",
|
||||
"statusPageUrl": "https://status.figma.com/"
|
||||
},
|
||||
{
|
||||
"name": "Notion",
|
||||
"headquarterAddress": "2300 Harrison St, San Francisco, CA 94110",
|
||||
"legalName": "Notion Labs, Inc.",
|
||||
"websiteUrl": "https://notion.so",
|
||||
"privacyPolicyUrl": "https://www.notion.so/notion/Privacy-Policy-3468d120cf614d4c9014c09f6adc9091",
|
||||
"serviceLevelAgreementUrl": "https://www.notion.so/notion/Service-Level-Terms-6f805fa1d4ca4463b805e2832ae8ff0d",
|
||||
"subprocessorsListUrl": "https://www.notion.so/notion/Notion-s-List-of-Subprocessors-268fa5bcfa0f46b6bc29436b21676734",
|
||||
"businessAssociateAgreementUrl": "https://www.notion.so/notion/Business-Associate-Agreement-909d9f4ccca041b1a23d0fe6e56fa111",
|
||||
"description": "Cloud-based workspace and collaboration platform that offers document management, project management, and team communication features, allowing users to create, edit, and share content in a centralized environment.",
|
||||
"category": "Project Management",
|
||||
"certifications": [
|
||||
"SOC 2 Type 2",
|
||||
"ISO/IEC 27001:2022",
|
||||
"ISO/IEC 27701:2019",
|
||||
"ISO/IEC 27017:2015",
|
||||
"ISO/IEC 27018:2019",
|
||||
"HIPAA",
|
||||
"BSI C5",
|
||||
"GDPR",
|
||||
"CCPA"
|
||||
],
|
||||
"statusPageUrl": "https://status.notion.so"
|
||||
},
|
||||
{
|
||||
"name": "Mintlify",
|
||||
"headquarterAddress": "108 Ferris Place, Ithaca, NY 14850",
|
||||
"legalName": "Mintlify, Inc.",
|
||||
"websiteUrl": "https://mintlify.com",
|
||||
"privacyPolicyUrl": "https://app.termly.io/policy-viewer/policy.html?policyUUID=95d79e73-9d6f-4e0a-8abd-2a608e8f5242",
|
||||
"termsOfServiceUrl": "https://mintlify.com/legal/terms",
|
||||
"description": "Mintlify is a cloud-based documentation platform that enables teams to create, manage, and share documentation for their projects.",
|
||||
"category": "Documentation",
|
||||
"certifications": ["SOC 2 Type 1"],
|
||||
"subprocessorsListUrl": "https://security.mintlify.com",
|
||||
"trustPageUrl": "https://security.mintlify.com/",
|
||||
"statusPageUrl": "https://status.mintlify.com/"
|
||||
},
|
||||
{
|
||||
"name": "Supabase",
|
||||
"headquarterAddress": "3500 S Dupont Hwy, United States",
|
||||
"legalName": "Supabase, Inc.",
|
||||
"websiteUrl": "https://supabase.com",
|
||||
"privacyPolicyUrl": "https://supabase.com/privacy",
|
||||
"termsOfServiceUrl": "https://supabase.com/terms",
|
||||
"description": "Open-source Firebase alternative providing a backend-as-a-service platform with PostgreSQL database, authentication, storage, and API functionality for application development.",
|
||||
"category": "Database",
|
||||
"certifications": ["SOC2 Type 2", "HIPAA", "GDPR"],
|
||||
"securityPageUrl": "https://supabase.com/security",
|
||||
"serviceLevelAgreementUrl": "https://supabase.com/sla",
|
||||
"trustPageUrl": "https://security.supabase.com/",
|
||||
"dataProcessingAgreementUrl": "https://supabase.com/legal/dpa",
|
||||
"statusPageUrl": "https://status.supabase.com/"
|
||||
}
|
||||
]
|
||||
@@ -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",
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
112
apps/console/src/pages/organizations/vendors/__generated__/VendorViewQuery.graphql.ts
generated
vendored
112
apps/console/src/pages/organizations/vendors/__generated__/VendorViewQuery.graphql.ts
generated
vendored
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user