Add countries and category to vendors

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
This commit is contained in:
Sacha Al Himdani
2025-09-12 15:32:06 +02:00
parent 41512a7a89
commit a2dc85f853
23 changed files with 3781 additions and 16 deletions

View File

@@ -0,0 +1,169 @@
import { useTranslate } from "@probo/i18n";
import { useRef, useState } from "react";
import { Badge, Input, IconCrossLargeX } from "@probo/ui";
import { type Control, Controller, type FieldPath, type FieldValues } from "react-hook-form";
import { getCountryName, getCountryOptions, countries, type CountryCode } from "@probo/helpers";
import clsx from "clsx";
type Props<T extends FieldValues = FieldValues> = {
control: Control<T>;
name: FieldPath<T>;
disabled?: boolean;
};
export function CountriesField<T extends FieldValues = FieldValues>({ control, name, disabled }: Props<T>) {
return (
<Controller
control={control}
name={name}
render={({ field }) => (
<CountriesFieldInput
value={field.value}
onValueChange={field.onChange}
disabled={disabled}
/>
)}
/>
);
}
type CountriesFieldInputProps = {
value: string[];
onValueChange: (value: string[]) => void;
disabled?: boolean;
};
function CountriesFieldInput(props: CountriesFieldInputProps) {
const { __ } = useTranslate();
const animateBadge = useRef(false);
const addCountry = (code: string) => {
animateBadge.current = true;
props.onValueChange([...props.value, code]);
};
const removeCountry = (code: string) => {
animateBadge.current = true;
props.onValueChange(props.value.filter((v) => v !== code));
};
return (
<div className={clsx(props.value.length > 0 ? "space-y-4" : "")}>
{props.value.length > 0 && (
<div className="space-y-2">
<div className="flex flex-wrap gap-2">
{props.value.map((countryCode) => (
<Badge asChild size="md" key={countryCode}>
<button
onClick={() => removeCountry(countryCode)}
type="button"
disabled={props.disabled}
className={clsx(
"hover:bg-subtle-hover cursor-pointer",
props.disabled && "opacity-50 cursor-not-allowed",
animateBadge.current &&
"starting:opacity-0 starting:w-0 w-max transition-all duration-500 starting:bg-accent"
)}
>
{getCountryName(__, countryCode as CountryCode)}
<div className="w-0 overflow-hidden group-hover:w-4 duration-200">
<IconCrossLargeX size={12} />
</div>
</button>
</Badge>
))}
</div>
</div>
)}
{!props.disabled && (
<CountryInput
availableCountries={countries.filter(
(c: CountryCode) => !props.value.includes(c)
)}
onAdd={addCountry}
/>
)}
</div>
);
}
type CountryInputProps = {
availableCountries: readonly CountryCode[];
onAdd: (code: string) => void;
};
function CountryInput({ availableCountries, onAdd }: CountryInputProps) {
const { __ } = useTranslate();
const [search, setSearch] = useState("");
const [isOpen, setIsOpen] = useState(false);
const countryOptions = getCountryOptions(__);
const filteredCountries = countryOptions
.filter((option: { value: string; label: string }) => availableCountries.includes(option.value as CountryCode))
.filter((option: { value: string; label: string }) =>
option.label.toLowerCase().includes(search.toLowerCase())
);
const handleCountryClick = (value: string) => {
onAdd(value);
setSearch("");
};
return (
<div className="relative">
<div className="flex items-center gap-2">
<div className="relative flex-1">
<Input
type="text"
value={search}
onChange={(e) => setSearch(e.target.value)}
onFocus={() => setIsOpen(true)}
placeholder={__("Search and add countries...")}
className="w-full pr-8"
/>
<button
type="button"
onClick={() => setIsOpen(!isOpen)}
className="absolute right-2 top-1/2 -translate-y-1/2 text-txt-secondary hover:text-txt-primary transition-colors"
>
<svg
className="w-4 h-4"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M19 9l-7 7-7-7"
/>
</svg>
</button>
</div>
</div>
{isOpen && filteredCountries.length > 0 && (
<div className="absolute z-50 w-full mt-1 p-2 shadow-mid bg-level-1 overflow-y-auto overflow-x-hidden rounded-2xl border-border-low max-h-60">
{filteredCountries.map((option: { value: string; label: string }) => (
<button
key={option.value}
type="button"
onClick={() => handleCountryClick(option.value)}
className="w-full px-3 py-2 text-left text-sm text-txt-primary hover:bg-highlight-hover focus:bg-highlight-pressed focus:outline-none rounded-lg"
>
{option.label}
</button>
))}
</div>
)}
{isOpen && (
<div
className="fixed inset-0 z-40"
onClick={() => setIsOpen(false)}
/>
)}
</div>
);
}

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<ea3e7fd6a3b7dd5f78622e9f21cdb1d3>>
* @generated SignedSource<<28b582a607c240a6304ea42cb2451776>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -9,12 +9,16 @@
// @ts-nocheck
import { ReaderFragment } from 'relay-runtime';
export type CountryCode = "AD" | "AE" | "AF" | "AG" | "AI" | "AL" | "AM" | "AO" | "AQ" | "AR" | "AS" | "AT" | "AU" | "AW" | "AX" | "AZ" | "BA" | "BB" | "BD" | "BE" | "BF" | "BG" | "BH" | "BI" | "BJ" | "BL" | "BM" | "BN" | "BO" | "BQ" | "BR" | "BS" | "BT" | "BV" | "BW" | "BY" | "BZ" | "CA" | "CC" | "CD" | "CF" | "CG" | "CH" | "CI" | "CK" | "CL" | "CM" | "CN" | "CO" | "CR" | "CU" | "CV" | "CW" | "CX" | "CY" | "CZ" | "DE" | "DJ" | "DK" | "DM" | "DO" | "DZ" | "EC" | "EE" | "EG" | "EH" | "ER" | "ES" | "ET" | "FI" | "FJ" | "FK" | "FM" | "FO" | "FR" | "GA" | "GB" | "GD" | "GE" | "GF" | "GG" | "GH" | "GI" | "GL" | "GM" | "GN" | "GP" | "GQ" | "GR" | "GT" | "GU" | "GW" | "GY" | "HK" | "HM" | "HN" | "HR" | "HT" | "HU" | "ID" | "IE" | "IL" | "IM" | "IN" | "IO" | "IQ" | "IR" | "IS" | "IT" | "JE" | "JM" | "JO" | "JP" | "KE" | "KG" | "KH" | "KI" | "KM" | "KN" | "KP" | "KR" | "KW" | "KY" | "KZ" | "LA" | "LB" | "LC" | "LI" | "LK" | "LR" | "LS" | "LT" | "LU" | "LV" | "LY" | "MA" | "MC" | "MD" | "ME" | "MF" | "MG" | "MH" | "MK" | "ML" | "MM" | "MN" | "MO" | "MP" | "MQ" | "MR" | "MS" | "MT" | "MU" | "MV" | "MW" | "MX" | "MY" | "MZ" | "NA" | "NC" | "NE" | "NF" | "NG" | "NI" | "NL" | "NO" | "NP" | "NR" | "NU" | "NZ" | "OM" | "PA" | "PE" | "PF" | "PG" | "PH" | "PK" | "PL" | "PM" | "PN" | "PR" | "PS" | "PT" | "PW" | "PY" | "QA" | "RE" | "RO" | "RS" | "RU" | "RW" | "SA" | "SB" | "SC" | "SD" | "SE" | "SG" | "SH" | "SI" | "SJ" | "SK" | "SL" | "SM" | "SN" | "SO" | "SR" | "SS" | "ST" | "SV" | "SX" | "SY" | "SZ" | "TC" | "TD" | "TF" | "TG" | "TH" | "TJ" | "TK" | "TL" | "TM" | "TN" | "TO" | "TR" | "TT" | "TV" | "TW" | "TZ" | "UA" | "UG" | "UM" | "US" | "UY" | "UZ" | "VA" | "VC" | "VE" | "VG" | "VI" | "VN" | "VU" | "WF" | "WS" | "YE" | "YT" | "ZA" | "ZM" | "ZW";
export type VendorCategory = "ANALYTICS" | "CLOUD_MONITORING" | "CLOUD_PROVIDER" | "COLLABORATION" | "CUSTOMER_SUPPORT" | "DATA_STORAGE_AND_PROCESSING" | "DOCUMENT_MANAGEMENT" | "EMPLOYEE_MANAGEMENT" | "ENGINEERING" | "FINANCE" | "IDENTITY_PROVIDER" | "IT" | "MARKETING" | "OFFICE_OPERATIONS" | "OTHER" | "PASSWORD_MANAGEMENT" | "PRODUCT_AND_DESIGN" | "PROFESSIONAL_SERVICES" | "RECRUITING" | "SALES" | "SECURITY" | "VERSION_CONTROL";
import { FragmentRefs } from "relay-runtime";
export type useVendorFormFragment$data = {
readonly businessOwner: {
readonly id: string;
} | null | undefined;
readonly category: VendorCategory;
readonly certifications: ReadonlyArray<string>;
readonly countries: ReadonlyArray<CountryCode>;
readonly dataProcessingAgreementUrl: string | null | undefined;
readonly description: string | null | undefined;
readonly headquarterAddress: string | null | undefined;
@@ -70,6 +74,13 @@ return {
"name": "description",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "category",
"storageKey": null
},
{
"alias": null,
"args": null,
@@ -133,6 +144,13 @@ return {
"name": "certifications",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "countries",
"storageKey": null
},
{
"alias": null,
"args": null,
@@ -173,6 +191,6 @@ return {
};
})();
(node as any).hash = "87f1029f8c634a5f7efdb6d7abe17709";
(node as any).hash = "89148658660d29dbe0ab6761300c6771";
export default node;

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<faa26838a242a98d5df14f51ff257950>>
* @generated SignedSource<<3f3a2de3bcfe5c2e7abbea0ba0fb4848>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -10,12 +10,14 @@
import { ConcreteRequest } from 'relay-runtime';
import { FragmentRefs } from "relay-runtime";
export type CountryCode = "AD" | "AE" | "AF" | "AG" | "AI" | "AL" | "AM" | "AO" | "AQ" | "AR" | "AS" | "AT" | "AU" | "AW" | "AX" | "AZ" | "BA" | "BB" | "BD" | "BE" | "BF" | "BG" | "BH" | "BI" | "BJ" | "BL" | "BM" | "BN" | "BO" | "BQ" | "BR" | "BS" | "BT" | "BV" | "BW" | "BY" | "BZ" | "CA" | "CC" | "CD" | "CF" | "CG" | "CH" | "CI" | "CK" | "CL" | "CM" | "CN" | "CO" | "CR" | "CU" | "CV" | "CW" | "CX" | "CY" | "CZ" | "DE" | "DJ" | "DK" | "DM" | "DO" | "DZ" | "EC" | "EE" | "EG" | "EH" | "ER" | "ES" | "ET" | "FI" | "FJ" | "FK" | "FM" | "FO" | "FR" | "GA" | "GB" | "GD" | "GE" | "GF" | "GG" | "GH" | "GI" | "GL" | "GM" | "GN" | "GP" | "GQ" | "GR" | "GT" | "GU" | "GW" | "GY" | "HK" | "HM" | "HN" | "HR" | "HT" | "HU" | "ID" | "IE" | "IL" | "IM" | "IN" | "IO" | "IQ" | "IR" | "IS" | "IT" | "JE" | "JM" | "JO" | "JP" | "KE" | "KG" | "KH" | "KI" | "KM" | "KN" | "KP" | "KR" | "KW" | "KY" | "KZ" | "LA" | "LB" | "LC" | "LI" | "LK" | "LR" | "LS" | "LT" | "LU" | "LV" | "LY" | "MA" | "MC" | "MD" | "ME" | "MF" | "MG" | "MH" | "MK" | "ML" | "MM" | "MN" | "MO" | "MP" | "MQ" | "MR" | "MS" | "MT" | "MU" | "MV" | "MW" | "MX" | "MY" | "MZ" | "NA" | "NC" | "NE" | "NF" | "NG" | "NI" | "NL" | "NO" | "NP" | "NR" | "NU" | "NZ" | "OM" | "PA" | "PE" | "PF" | "PG" | "PH" | "PK" | "PL" | "PM" | "PN" | "PR" | "PS" | "PT" | "PW" | "PY" | "QA" | "RE" | "RO" | "RS" | "RU" | "RW" | "SA" | "SB" | "SC" | "SD" | "SE" | "SG" | "SH" | "SI" | "SJ" | "SK" | "SL" | "SM" | "SN" | "SO" | "SR" | "SS" | "ST" | "SV" | "SX" | "SY" | "SZ" | "TC" | "TD" | "TF" | "TG" | "TH" | "TJ" | "TK" | "TL" | "TM" | "TN" | "TO" | "TR" | "TT" | "TV" | "TW" | "TZ" | "UA" | "UG" | "UM" | "US" | "UY" | "UZ" | "VA" | "VC" | "VE" | "VG" | "VI" | "VN" | "VU" | "WF" | "WS" | "YE" | "YT" | "ZA" | "ZM" | "ZW";
export type VendorCategory = "ANALYTICS" | "CLOUD_MONITORING" | "CLOUD_PROVIDER" | "COLLABORATION" | "CUSTOMER_SUPPORT" | "DATA_STORAGE_AND_PROCESSING" | "DOCUMENT_MANAGEMENT" | "EMPLOYEE_MANAGEMENT" | "ENGINEERING" | "FINANCE" | "IDENTITY_PROVIDER" | "IT" | "MARKETING" | "OFFICE_OPERATIONS" | "OTHER" | "PASSWORD_MANAGEMENT" | "PRODUCT_AND_DESIGN" | "PROFESSIONAL_SERVICES" | "RECRUITING" | "SALES" | "SECURITY" | "VERSION_CONTROL";
export type UpdateVendorInput = {
businessAssociateAgreementUrl?: string | null | undefined;
businessOwnerId?: string | null | undefined;
category?: VendorCategory | null | undefined;
certifications?: ReadonlyArray<string> | null | undefined;
countries?: ReadonlyArray<CountryCode> | null | undefined;
dataProcessingAgreementUrl?: string | null | undefined;
description?: string | null | undefined;
headquarterAddress?: string | null | undefined;
@@ -148,6 +150,13 @@ return {
"name": "description",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "category",
"storageKey": null
},
{
"alias": null,
"args": null,
@@ -211,6 +220,13 @@ return {
"name": "certifications",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "countries",
"storageKey": null
},
{
"alias": null,
"args": null,
@@ -254,12 +270,12 @@ return {
]
},
"params": {
"cacheID": "324b4589b4692806f555489703521bcd",
"cacheID": "35a5e6d13ef172a9a8640740a5606b46",
"id": null,
"metadata": {},
"name": "useVendorFormMutation",
"operationKind": "mutation",
"text": "mutation useVendorFormMutation(\n $input: UpdateVendorInput!\n) {\n updateVendor(input: $input) {\n vendor {\n ...useVendorFormFragment\n id\n }\n }\n}\n\nfragment useVendorFormFragment on Vendor {\n id\n name\n description\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n serviceLevelAgreementUrl\n dataProcessingAgreementUrl\n websiteUrl\n legalName\n headquarterAddress\n certifications\n securityPageUrl\n trustPageUrl\n businessOwner {\n id\n }\n securityOwner {\n id\n }\n}\n"
"text": "mutation useVendorFormMutation(\n $input: UpdateVendorInput!\n) {\n updateVendor(input: $input) {\n vendor {\n ...useVendorFormFragment\n id\n }\n }\n}\n\nfragment useVendorFormFragment on Vendor {\n id\n name\n description\n category\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n serviceLevelAgreementUrl\n dataProcessingAgreementUrl\n websiteUrl\n legalName\n headquarterAddress\n certifications\n countries\n securityPageUrl\n trustPageUrl\n businessOwner {\n id\n }\n securityOwner {\n id\n }\n}\n"
}
};
})();

View File

@@ -10,6 +10,7 @@ import { useEffect, useMemo } from "react";
const schema = z.object({
name: z.string(),
description: z.string(),
category: z.string().nullish(),
statusPageUrl: z.string(),
termsOfServiceUrl: z.string(),
privacyPolicyUrl: z.string(),
@@ -19,6 +20,7 @@ const schema = z.object({
legalName: z.string(),
headquarterAddress: z.string(),
certifications: z.array(z.string()),
countries: z.array(z.string()),
securityPageUrl: z.string(),
trustPageUrl: z.string(),
businessOwnerId: z.string().nullish(),
@@ -30,6 +32,7 @@ const vendorFormFragment = graphql`
id
name
description
category
statusPageUrl
termsOfServiceUrl
privacyPolicyUrl
@@ -39,6 +42,7 @@ const vendorFormFragment = graphql`
legalName
headquarterAddress
certifications
countries
securityPageUrl
trustPageUrl
businessOwner {
@@ -73,6 +77,7 @@ export function useVendorForm(vendorKey: useVendorFormFragment$key) {
() => ({
name: vendor.name,
description: vendor.description ?? "",
category: vendor.category ?? null,
statusPageUrl: vendor.statusPageUrl ?? "",
termsOfServiceUrl: vendor.termsOfServiceUrl ?? "",
privacyPolicyUrl: vendor.privacyPolicyUrl ?? "",
@@ -82,6 +87,7 @@ export function useVendorForm(vendorKey: useVendorFormFragment$key) {
legalName: vendor.legalName ?? "",
headquarterAddress: vendor.headquarterAddress ?? "",
certifications: [...(vendor.certifications ?? [])],
countries: [...(vendor.countries ?? [])],
securityPageUrl: vendor.securityPageUrl ?? "",
trustPageUrl: vendor.trustPageUrl ?? "",
businessOwnerId: vendor.businessOwner?.id,

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<be30aebdf9a7304cd154284fa9f6b207>>
* @generated SignedSource<<309fa8f1d9e203536f9b7d00b3622456>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -10,12 +10,14 @@
import { ConcreteRequest } from 'relay-runtime';
import { FragmentRefs } from "relay-runtime";
export type CountryCode = "AD" | "AE" | "AF" | "AG" | "AI" | "AL" | "AM" | "AO" | "AQ" | "AR" | "AS" | "AT" | "AU" | "AW" | "AX" | "AZ" | "BA" | "BB" | "BD" | "BE" | "BF" | "BG" | "BH" | "BI" | "BJ" | "BL" | "BM" | "BN" | "BO" | "BQ" | "BR" | "BS" | "BT" | "BV" | "BW" | "BY" | "BZ" | "CA" | "CC" | "CD" | "CF" | "CG" | "CH" | "CI" | "CK" | "CL" | "CM" | "CN" | "CO" | "CR" | "CU" | "CV" | "CW" | "CX" | "CY" | "CZ" | "DE" | "DJ" | "DK" | "DM" | "DO" | "DZ" | "EC" | "EE" | "EG" | "EH" | "ER" | "ES" | "ET" | "FI" | "FJ" | "FK" | "FM" | "FO" | "FR" | "GA" | "GB" | "GD" | "GE" | "GF" | "GG" | "GH" | "GI" | "GL" | "GM" | "GN" | "GP" | "GQ" | "GR" | "GT" | "GU" | "GW" | "GY" | "HK" | "HM" | "HN" | "HR" | "HT" | "HU" | "ID" | "IE" | "IL" | "IM" | "IN" | "IO" | "IQ" | "IR" | "IS" | "IT" | "JE" | "JM" | "JO" | "JP" | "KE" | "KG" | "KH" | "KI" | "KM" | "KN" | "KP" | "KR" | "KW" | "KY" | "KZ" | "LA" | "LB" | "LC" | "LI" | "LK" | "LR" | "LS" | "LT" | "LU" | "LV" | "LY" | "MA" | "MC" | "MD" | "ME" | "MF" | "MG" | "MH" | "MK" | "ML" | "MM" | "MN" | "MO" | "MP" | "MQ" | "MR" | "MS" | "MT" | "MU" | "MV" | "MW" | "MX" | "MY" | "MZ" | "NA" | "NC" | "NE" | "NF" | "NG" | "NI" | "NL" | "NO" | "NP" | "NR" | "NU" | "NZ" | "OM" | "PA" | "PE" | "PF" | "PG" | "PH" | "PK" | "PL" | "PM" | "PN" | "PR" | "PS" | "PT" | "PW" | "PY" | "QA" | "RE" | "RO" | "RS" | "RU" | "RW" | "SA" | "SB" | "SC" | "SD" | "SE" | "SG" | "SH" | "SI" | "SJ" | "SK" | "SL" | "SM" | "SN" | "SO" | "SR" | "SS" | "ST" | "SV" | "SX" | "SY" | "SZ" | "TC" | "TD" | "TF" | "TG" | "TH" | "TJ" | "TK" | "TL" | "TM" | "TN" | "TO" | "TR" | "TT" | "TV" | "TW" | "TZ" | "UA" | "UG" | "UM" | "US" | "UY" | "UZ" | "VA" | "VC" | "VE" | "VG" | "VI" | "VN" | "VU" | "WF" | "WS" | "YE" | "YT" | "ZA" | "ZM" | "ZW";
export type VendorCategory = "ANALYTICS" | "CLOUD_MONITORING" | "CLOUD_PROVIDER" | "COLLABORATION" | "CUSTOMER_SUPPORT" | "DATA_STORAGE_AND_PROCESSING" | "DOCUMENT_MANAGEMENT" | "EMPLOYEE_MANAGEMENT" | "ENGINEERING" | "FINANCE" | "IDENTITY_PROVIDER" | "IT" | "MARKETING" | "OFFICE_OPERATIONS" | "OTHER" | "PASSWORD_MANAGEMENT" | "PRODUCT_AND_DESIGN" | "PROFESSIONAL_SERVICES" | "RECRUITING" | "SALES" | "SECURITY" | "VERSION_CONTROL";
export type UpdateVendorInput = {
businessAssociateAgreementUrl?: string | null | undefined;
businessOwnerId?: string | null | undefined;
category?: VendorCategory | null | undefined;
certifications?: ReadonlyArray<string> | null | undefined;
countries?: ReadonlyArray<CountryCode> | null | undefined;
dataProcessingAgreementUrl?: string | null | undefined;
description?: string | null | undefined;
headquarterAddress?: string | null | undefined;

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<8ef289e99926f279eb0e2d5ea955cb32>>
* @generated SignedSource<<58e32433a39672dcebad5b51c5d18bd4>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -9,12 +9,14 @@
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type CountryCode = "AD" | "AE" | "AF" | "AG" | "AI" | "AL" | "AM" | "AO" | "AQ" | "AR" | "AS" | "AT" | "AU" | "AW" | "AX" | "AZ" | "BA" | "BB" | "BD" | "BE" | "BF" | "BG" | "BH" | "BI" | "BJ" | "BL" | "BM" | "BN" | "BO" | "BQ" | "BR" | "BS" | "BT" | "BV" | "BW" | "BY" | "BZ" | "CA" | "CC" | "CD" | "CF" | "CG" | "CH" | "CI" | "CK" | "CL" | "CM" | "CN" | "CO" | "CR" | "CU" | "CV" | "CW" | "CX" | "CY" | "CZ" | "DE" | "DJ" | "DK" | "DM" | "DO" | "DZ" | "EC" | "EE" | "EG" | "EH" | "ER" | "ES" | "ET" | "FI" | "FJ" | "FK" | "FM" | "FO" | "FR" | "GA" | "GB" | "GD" | "GE" | "GF" | "GG" | "GH" | "GI" | "GL" | "GM" | "GN" | "GP" | "GQ" | "GR" | "GT" | "GU" | "GW" | "GY" | "HK" | "HM" | "HN" | "HR" | "HT" | "HU" | "ID" | "IE" | "IL" | "IM" | "IN" | "IO" | "IQ" | "IR" | "IS" | "IT" | "JE" | "JM" | "JO" | "JP" | "KE" | "KG" | "KH" | "KI" | "KM" | "KN" | "KP" | "KR" | "KW" | "KY" | "KZ" | "LA" | "LB" | "LC" | "LI" | "LK" | "LR" | "LS" | "LT" | "LU" | "LV" | "LY" | "MA" | "MC" | "MD" | "ME" | "MF" | "MG" | "MH" | "MK" | "ML" | "MM" | "MN" | "MO" | "MP" | "MQ" | "MR" | "MS" | "MT" | "MU" | "MV" | "MW" | "MX" | "MY" | "MZ" | "NA" | "NC" | "NE" | "NF" | "NG" | "NI" | "NL" | "NO" | "NP" | "NR" | "NU" | "NZ" | "OM" | "PA" | "PE" | "PF" | "PG" | "PH" | "PK" | "PL" | "PM" | "PN" | "PR" | "PS" | "PT" | "PW" | "PY" | "QA" | "RE" | "RO" | "RS" | "RU" | "RW" | "SA" | "SB" | "SC" | "SD" | "SE" | "SG" | "SH" | "SI" | "SJ" | "SK" | "SL" | "SM" | "SN" | "SO" | "SR" | "SS" | "ST" | "SV" | "SX" | "SY" | "SZ" | "TC" | "TD" | "TF" | "TG" | "TH" | "TJ" | "TK" | "TL" | "TM" | "TN" | "TO" | "TR" | "TT" | "TV" | "TW" | "TZ" | "UA" | "UG" | "UM" | "US" | "UY" | "UZ" | "VA" | "VC" | "VE" | "VG" | "VI" | "VN" | "VU" | "WF" | "WS" | "YE" | "YT" | "ZA" | "ZM" | "ZW";
export type VendorCategory = "ANALYTICS" | "CLOUD_MONITORING" | "CLOUD_PROVIDER" | "COLLABORATION" | "CUSTOMER_SUPPORT" | "DATA_STORAGE_AND_PROCESSING" | "DOCUMENT_MANAGEMENT" | "EMPLOYEE_MANAGEMENT" | "ENGINEERING" | "FINANCE" | "IDENTITY_PROVIDER" | "IT" | "MARKETING" | "OFFICE_OPERATIONS" | "OTHER" | "PASSWORD_MANAGEMENT" | "PRODUCT_AND_DESIGN" | "PROFESSIONAL_SERVICES" | "RECRUITING" | "SALES" | "SECURITY" | "VERSION_CONTROL";
export type CreateVendorInput = {
businessAssociateAgreementUrl?: string | null | undefined;
businessOwnerId?: string | null | undefined;
category?: VendorCategory | null | undefined;
certifications?: ReadonlyArray<string> | null | undefined;
countries?: ReadonlyArray<CountryCode> | null | undefined;
dataProcessingAgreementUrl?: string | null | undefined;
description?: string | null | undefined;
headquarterAddress?: string | null | undefined;

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<c3a7e9de9c7f072bbca3ad552e5860cd>>
* @generated SignedSource<<15c7796ac43c03708488ba03ef9d76a6>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -361,6 +361,13 @@ return {
(v5/*: any*/),
(v6/*: any*/),
(v10/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "category",
"storageKey": null
},
{
"alias": null,
"args": null,
@@ -417,6 +424,13 @@ return {
"name": "certifications",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "countries",
"storageKey": null
},
{
"alias": null,
"args": null,
@@ -807,12 +821,12 @@ return {
]
},
"params": {
"cacheID": "f0b506b57e84959deb0b1e3fa0481897",
"cacheID": "90924936acacd1851e8e81b1d94d6655",
"id": null,
"metadata": {},
"name": "VendorGraphNodeQuery",
"operationKind": "query",
"text": "query VendorGraphNodeQuery(\n $vendorId: ID!\n $organizationId: ID!\n) {\n node(id: $vendorId) {\n __typename\n ... on Vendor {\n id\n snapshotId\n name\n websiteUrl\n ...useVendorFormFragment\n ...VendorComplianceTabFragment\n ...VendorContactsTabFragment\n ...VendorServicesTabFragment\n ...VendorRiskAssessmentTabFragment\n ...VendorOverviewTabBusinessAssociateAgreementFragment\n ...VendorOverviewTabDataPrivacyAgreementFragment\n }\n id\n }\n viewer {\n user {\n people(organizationId: $organizationId) {\n id\n }\n id\n }\n id\n }\n}\n\nfragment VendorComplianceTabFragment on Vendor {\n complianceReports(first: 50) {\n edges {\n node {\n id\n ...VendorComplianceTabFragment_report\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment VendorComplianceTabFragment_report on VendorComplianceReport {\n id\n reportDate\n validUntil\n reportName\n fileUrl\n fileSize\n}\n\nfragment VendorContactsTabFragment on Vendor {\n contacts(first: 50) {\n edges {\n node {\n id\n ...VendorContactsTabFragment_contact\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment VendorContactsTabFragment_contact on VendorContact {\n id\n fullName\n email\n phone\n role\n createdAt\n updatedAt\n}\n\nfragment VendorOverviewTabBusinessAssociateAgreementFragment on Vendor {\n businessAssociateAgreement {\n id\n fileName\n fileUrl\n validFrom\n validUntil\n createdAt\n }\n}\n\nfragment VendorOverviewTabDataPrivacyAgreementFragment on Vendor {\n dataPrivacyAgreement {\n id\n fileName\n fileUrl\n validFrom\n validUntil\n createdAt\n }\n}\n\nfragment VendorRiskAssessmentTabFragment on Vendor {\n id\n riskAssessments(first: 50) {\n edges {\n node {\n id\n ...VendorRiskAssessmentTabFragment_assessment\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n }\n }\n}\n\nfragment VendorRiskAssessmentTabFragment_assessment on VendorRiskAssessment {\n id\n assessedAt\n assessedBy {\n id\n fullName\n }\n expiresAt\n dataSensitivity\n businessImpact\n notes\n}\n\nfragment VendorServicesTabFragment on Vendor {\n services(first: 50) {\n edges {\n node {\n id\n ...VendorServicesTabFragment_service\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment VendorServicesTabFragment_service on VendorService {\n id\n name\n description\n createdAt\n updatedAt\n}\n\nfragment useVendorFormFragment on Vendor {\n id\n name\n description\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n serviceLevelAgreementUrl\n dataProcessingAgreementUrl\n websiteUrl\n legalName\n headquarterAddress\n certifications\n securityPageUrl\n trustPageUrl\n businessOwner {\n id\n }\n securityOwner {\n id\n }\n}\n"
"text": "query VendorGraphNodeQuery(\n $vendorId: ID!\n $organizationId: ID!\n) {\n node(id: $vendorId) {\n __typename\n ... on Vendor {\n id\n snapshotId\n name\n websiteUrl\n ...useVendorFormFragment\n ...VendorComplianceTabFragment\n ...VendorContactsTabFragment\n ...VendorServicesTabFragment\n ...VendorRiskAssessmentTabFragment\n ...VendorOverviewTabBusinessAssociateAgreementFragment\n ...VendorOverviewTabDataPrivacyAgreementFragment\n }\n id\n }\n viewer {\n user {\n people(organizationId: $organizationId) {\n id\n }\n id\n }\n id\n }\n}\n\nfragment VendorComplianceTabFragment on Vendor {\n complianceReports(first: 50) {\n edges {\n node {\n id\n ...VendorComplianceTabFragment_report\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment VendorComplianceTabFragment_report on VendorComplianceReport {\n id\n reportDate\n validUntil\n reportName\n fileUrl\n fileSize\n}\n\nfragment VendorContactsTabFragment on Vendor {\n contacts(first: 50) {\n edges {\n node {\n id\n ...VendorContactsTabFragment_contact\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment VendorContactsTabFragment_contact on VendorContact {\n id\n fullName\n email\n phone\n role\n createdAt\n updatedAt\n}\n\nfragment VendorOverviewTabBusinessAssociateAgreementFragment on Vendor {\n businessAssociateAgreement {\n id\n fileName\n fileUrl\n validFrom\n validUntil\n createdAt\n }\n}\n\nfragment VendorOverviewTabDataPrivacyAgreementFragment on Vendor {\n dataPrivacyAgreement {\n id\n fileName\n fileUrl\n validFrom\n validUntil\n createdAt\n }\n}\n\nfragment VendorRiskAssessmentTabFragment on Vendor {\n id\n riskAssessments(first: 50) {\n edges {\n node {\n id\n ...VendorRiskAssessmentTabFragment_assessment\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n }\n }\n}\n\nfragment VendorRiskAssessmentTabFragment_assessment on VendorRiskAssessment {\n id\n assessedAt\n assessedBy {\n id\n fullName\n }\n expiresAt\n dataSensitivity\n businessImpact\n notes\n}\n\nfragment VendorServicesTabFragment on Vendor {\n services(first: 50) {\n edges {\n node {\n id\n ...VendorServicesTabFragment_service\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment VendorServicesTabFragment_service on VendorService {\n id\n name\n description\n createdAt\n updatedAt\n}\n\nfragment useVendorFormFragment on Vendor {\n id\n name\n description\n category\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n serviceLevelAgreementUrl\n dataProcessingAgreementUrl\n websiteUrl\n legalName\n headquarterAddress\n certifications\n countries\n securityPageUrl\n trustPageUrl\n businessOwner {\n id\n }\n securityOwner {\n id\n }\n}\n"
}
};
})();

View File

@@ -51,6 +51,7 @@ export function CreateVendorDialog({
serviceLevelAgreementUrl: vendor.serviceLevelAgreementUrl,
dataProcessingAgreementUrl: vendor.dataProcessingAgreementUrl,
certifications: vendor.certifications,
countries: vendor.countries,
securityPageUrl: vendor.securityPageUrl,
trustPageUrl: vendor.trustPageUrl,
statusPageUrl: vendor.statusPageUrl,

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<a0f6e47aa4001c2a99c02b7eabe5c99a>>
* @generated SignedSource<<6db92ed13cdca3a852d1b7b9c113840e>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -218,6 +218,13 @@ return {
"name": "description",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "category",
"storageKey": null
},
{
"alias": null,
"args": null,
@@ -274,6 +281,13 @@ return {
"name": "certifications",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "countries",
"storageKey": null
},
{
"alias": null,
"args": null,
@@ -528,12 +542,12 @@ return {
]
},
"params": {
"cacheID": "dbe0c3ef0f5d4d36436224603629d30a",
"cacheID": "025f271f1dca46c6f052f0d59a4315cc",
"id": null,
"metadata": {},
"name": "ImportAssessmentDialogMutation",
"operationKind": "mutation",
"text": "mutation ImportAssessmentDialogMutation(\n $input: AssessVendorInput!\n) {\n assessVendor(input: $input) {\n vendor {\n id\n name\n websiteUrl\n ...useVendorFormFragment\n ...VendorComplianceTabFragment\n ...VendorRiskAssessmentTabFragment\n }\n }\n}\n\nfragment VendorComplianceTabFragment on Vendor {\n complianceReports(first: 50) {\n edges {\n node {\n id\n ...VendorComplianceTabFragment_report\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment VendorComplianceTabFragment_report on VendorComplianceReport {\n id\n reportDate\n validUntil\n reportName\n fileUrl\n fileSize\n}\n\nfragment VendorRiskAssessmentTabFragment on Vendor {\n id\n riskAssessments(first: 50) {\n edges {\n node {\n id\n ...VendorRiskAssessmentTabFragment_assessment\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n }\n }\n}\n\nfragment VendorRiskAssessmentTabFragment_assessment on VendorRiskAssessment {\n id\n assessedAt\n assessedBy {\n id\n fullName\n }\n expiresAt\n dataSensitivity\n businessImpact\n notes\n}\n\nfragment useVendorFormFragment on Vendor {\n id\n name\n description\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n serviceLevelAgreementUrl\n dataProcessingAgreementUrl\n websiteUrl\n legalName\n headquarterAddress\n certifications\n securityPageUrl\n trustPageUrl\n businessOwner {\n id\n }\n securityOwner {\n id\n }\n}\n"
"text": "mutation ImportAssessmentDialogMutation(\n $input: AssessVendorInput!\n) {\n assessVendor(input: $input) {\n vendor {\n id\n name\n websiteUrl\n ...useVendorFormFragment\n ...VendorComplianceTabFragment\n ...VendorRiskAssessmentTabFragment\n }\n }\n}\n\nfragment VendorComplianceTabFragment on Vendor {\n complianceReports(first: 50) {\n edges {\n node {\n id\n ...VendorComplianceTabFragment_report\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment VendorComplianceTabFragment_report on VendorComplianceReport {\n id\n reportDate\n validUntil\n reportName\n fileUrl\n fileSize\n}\n\nfragment VendorRiskAssessmentTabFragment on Vendor {\n id\n riskAssessments(first: 50) {\n edges {\n node {\n id\n ...VendorRiskAssessmentTabFragment_assessment\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n }\n }\n}\n\nfragment VendorRiskAssessmentTabFragment_assessment on VendorRiskAssessment {\n id\n assessedAt\n assessedBy {\n id\n fullName\n }\n expiresAt\n dataSensitivity\n businessImpact\n notes\n}\n\nfragment useVendorFormFragment on Vendor {\n id\n name\n description\n category\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n serviceLevelAgreementUrl\n dataProcessingAgreementUrl\n websiteUrl\n legalName\n headquarterAddress\n certifications\n countries\n securityPageUrl\n trustPageUrl\n businessOwner {\n id\n }\n securityOwner {\n id\n }\n}\n"
}
};
})();

View File

@@ -1,8 +1,10 @@
import { useTranslate } from "@probo/i18n";
import { useVendorForm } from "/hooks/forms/useVendorForm";
import { useOutletContext, useParams } from "react-router";
import { Button, Card, Field, Input, IconPlusLarge, IconTrashCan, IconPencil } from "@probo/ui";
import { Button, Card, Field, Input, IconPlusLarge, IconTrashCan, IconPencil, Option } from "@probo/ui";
import { PeopleSelectField } from "/components/form/PeopleSelectField";
import { ControlledField } from "/components/form/ControlledField";
import { CountriesField } from "/components/form/CountriesField";
import { useOrganizationId } from "/hooks/useOrganizationId";
import { useMemo } from "react";
import { usePageTitle } from "@probo/hooks";
@@ -17,6 +19,7 @@ import { EditDataPrivacyAgreementDialog } from "../dialogs/EditDataPrivacyAgreem
import type { useVendorFormFragment$key } from "/hooks/forms/__generated__/useVendorFormFragment.graphql";
import type { VendorOverviewTabBusinessAssociateAgreementFragment$key } from "./__generated__/VendorOverviewTabBusinessAssociateAgreementFragment.graphql";
import type { VendorOverviewTabDataPrivacyAgreementFragment$key } from "./__generated__/VendorOverviewTabDataPrivacyAgreementFragment.graphql";
import type { VendorCategory } from "@probo/vendors";
const vendorBusinessAssociateAgreementFragment = graphql`
fragment VendorOverviewTabBusinessAssociateAgreementFragment on Vendor {
@@ -54,6 +57,31 @@ export default function VendorOverviewTab() {
}>();
const { __ } = useTranslate();
const vendorCategories: { value: VendorCategory; label: string }[] = [
{ value: "ANALYTICS", label: __("Analytics") },
{ value: "CLOUD_MONITORING", label: __("Cloud Monitoring") },
{ value: "CLOUD_PROVIDER", label: __("Cloud Provider") },
{ value: "COLLABORATION", label: __("Collaboration") },
{ value: "CUSTOMER_SUPPORT", label: __("Customer Support") },
{ value: "DATA_STORAGE_AND_PROCESSING", label: __("Data Storage and Processing") },
{ value: "DOCUMENT_MANAGEMENT", label: __("Document Management") },
{ value: "EMPLOYEE_MANAGEMENT", label: __("Employee Management") },
{ value: "ENGINEERING", label: __("Engineering") },
{ value: "FINANCE", label: __("Finance") },
{ value: "IDENTITY_PROVIDER", label: __("Identity Provider") },
{ value: "IT", label: __("IT") },
{ value: "MARKETING", label: __("Marketing") },
{ value: "OFFICE_OPERATIONS", label: __("Office Operations") },
{ value: "OTHER", label: __("Other") },
{ value: "PASSWORD_MANAGEMENT", label: __("Password Management") },
{ value: "PRODUCT_AND_DESIGN", label: __("Product and Design") },
{ value: "PROFESSIONAL_SERVICES", label: __("Professional Services") },
{ value: "RECRUITING", label: __("Recruiting") },
{ value: "SALES", label: __("Sales") },
{ value: "SECURITY", label: __("Security") },
{ value: "VERSION_CONTROL", label: __("Version Control") },
];
const organizationId = useOrganizationId();
const { snapshotId } = useParams<{ snapshotId?: string }>();
const isSnapshotMode = Boolean(snapshotId);
@@ -119,6 +147,21 @@ export default function VendorOverviewTab() {
error={errors.description?.message}
disabled={isSubmitting || isSnapshotMode}
/>
<ControlledField
control={control}
name="category"
type="select"
label={__("Category")}
placeholder={__("Select a category")}
error={errors.category?.message}
disabled={isSubmitting || isSnapshotMode}
>
{vendorCategories.map((category) => (
<Option key={category.value} value={category.value}>
{category.label}
</Option>
))}
</ControlledField>
<Field
{...register("legalName")}
label={__("Legal name")}
@@ -143,6 +186,17 @@ export default function VendorOverviewTab() {
</Card>
</div>
<div className="space-y-4">
<h2 className="text-base font-medium">{__("Countries")}</h2>
<Card padded>
<CountriesField
control={control}
name="countries"
disabled={isSubmitting || isSnapshotMode}
/>
</Card>
</div>
{/* Ownership */}
<div className="space-y-4">
<h2 className="text-base font-medium">{__("Ownership details")}</h2>

View File

@@ -0,0 +1,299 @@
type Translator = (s: string) => string;
// ISO 3166-1 alpha-2 country codes
export const countries = [
"AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR",
"AS", "AT", "AU", "AW", "AX", "AZ", "BA", "BB", "BD", "BE",
"BF", "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ",
"BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD",
"CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR",
"CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM",
"DO", "DZ", "EC", "EE", "EG", "EH", "ER", "ES", "ET", "FI",
"FJ", "FK", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF",
"GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GT",
"GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID",
"IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", "IT", "JE",
"JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP",
"KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR",
"LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MF",
"MG", "MH", "MK", "ML", "MM", "MN", "MO", "MP", "MQ", "MR",
"MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NC",
"NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ",
"OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN",
"PR", "PS", "PT", "PW", "PY", "QA", "RE", "RO", "RS", "RU",
"RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SJ",
"SK", "SL", "SM", "SN", "SO", "SR", "SS", "ST", "SV", "SX",
"SY", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", "TK", "TL",
"TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG",
"UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN",
"VU", "WF", "WS", "YE", "YT", "ZA", "ZM", "ZW",
] as const;
export type CountryCode = typeof countries[number];
const countryNames: Record<CountryCode, (t: Translator) => string> = {
"AD": (__) => __("Andorra"),
"AE": (__) => __("United Arab Emirates"),
"AF": (__) => __("Afghanistan"),
"AG": (__) => __("Antigua and Barbuda"),
"AI": (__) => __("Anguilla"),
"AL": (__) => __("Albania"),
"AM": (__) => __("Armenia"),
"AO": (__) => __("Angola"),
"AQ": (__) => __("Antarctica"),
"AR": (__) => __("Argentina"),
"AS": (__) => __("American Samoa"),
"AT": (__) => __("Austria"),
"AU": (__) => __("Australia"),
"AW": (__) => __("Aruba"),
"AX": (__) => __("Åland Islands"),
"AZ": (__) => __("Azerbaijan"),
"BA": (__) => __("Bosnia and Herzegovina"),
"BB": (__) => __("Barbados"),
"BD": (__) => __("Bangladesh"),
"BE": (__) => __("Belgium"),
"BF": (__) => __("Burkina Faso"),
"BG": (__) => __("Bulgaria"),
"BH": (__) => __("Bahrain"),
"BI": (__) => __("Burundi"),
"BJ": (__) => __("Benin"),
"BL": (__) => __("Saint Barthélemy"),
"BM": (__) => __("Bermuda"),
"BN": (__) => __("Brunei"),
"BO": (__) => __("Bolivia"),
"BQ": (__) => __("Bonaire, Sint Eustatius and Saba"),
"BR": (__) => __("Brazil"),
"BS": (__) => __("Bahamas"),
"BT": (__) => __("Bhutan"),
"BV": (__) => __("Bouvet Island"),
"BW": (__) => __("Botswana"),
"BY": (__) => __("Belarus"),
"BZ": (__) => __("Belize"),
"CA": (__) => __("Canada"),
"CC": (__) => __("Cocos (Keeling) Islands"),
"CD": (__) => __("Congo (DRC)"),
"CF": (__) => __("Central African Republic"),
"CG": (__) => __("Congo (Republic)"),
"CH": (__) => __("Switzerland"),
"CI": (__) => __("Côte d'Ivoire"),
"CK": (__) => __("Cook Islands"),
"CL": (__) => __("Chile"),
"CM": (__) => __("Cameroon"),
"CN": (__) => __("China"),
"CO": (__) => __("Colombia"),
"CR": (__) => __("Costa Rica"),
"CU": (__) => __("Cuba"),
"CV": (__) => __("Cape Verde"),
"CW": (__) => __("Curaçao"),
"CX": (__) => __("Christmas Island"),
"CY": (__) => __("Cyprus"),
"CZ": (__) => __("Czechia"),
"DE": (__) => __("Germany"),
"DJ": (__) => __("Djibouti"),
"DK": (__) => __("Denmark"),
"DM": (__) => __("Dominica"),
"DO": (__) => __("Dominican Republic"),
"DZ": (__) => __("Algeria"),
"EC": (__) => __("Ecuador"),
"EE": (__) => __("Estonia"),
"EG": (__) => __("Egypt"),
"EH": (__) => __("Western Sahara"),
"ER": (__) => __("Eritrea"),
"ES": (__) => __("Spain"),
"ET": (__) => __("Ethiopia"),
"FI": (__) => __("Finland"),
"FJ": (__) => __("Fiji"),
"FK": (__) => __("Falkland Islands"),
"FM": (__) => __("Micronesia"),
"FO": (__) => __("Faroe Islands"),
"FR": (__) => __("France"),
"GA": (__) => __("Gabon"),
"GB": (__) => __("United Kingdom"),
"GD": (__) => __("Grenada"),
"GE": (__) => __("Georgia"),
"GF": (__) => __("French Guiana"),
"GG": (__) => __("Guernsey"),
"GH": (__) => __("Ghana"),
"GI": (__) => __("Gibraltar"),
"GL": (__) => __("Greenland"),
"GM": (__) => __("Gambia"),
"GN": (__) => __("Guinea"),
"GP": (__) => __("Guadeloupe"),
"GQ": (__) => __("Equatorial Guinea"),
"GR": (__) => __("Greece"),
"GT": (__) => __("Guatemala"),
"GU": (__) => __("Guam"),
"GW": (__) => __("Guinea-Bissau"),
"GY": (__) => __("Guyana"),
"HK": (__) => __("Hong Kong"),
"HM": (__) => __("Heard Island and McDonald Islands"),
"HN": (__) => __("Honduras"),
"HR": (__) => __("Croatia"),
"HT": (__) => __("Haiti"),
"HU": (__) => __("Hungary"),
"ID": (__) => __("Indonesia"),
"IE": (__) => __("Ireland"),
"IL": (__) => __("Israel"),
"IM": (__) => __("Isle of Man"),
"IN": (__) => __("India"),
"IO": (__) => __("British Indian Ocean Territory"),
"IQ": (__) => __("Iraq"),
"IR": (__) => __("Iran"),
"IS": (__) => __("Iceland"),
"IT": (__) => __("Italy"),
"JE": (__) => __("Jersey"),
"JM": (__) => __("Jamaica"),
"JO": (__) => __("Jordan"),
"JP": (__) => __("Japan"),
"KE": (__) => __("Kenya"),
"KG": (__) => __("Kyrgyzstan"),
"KH": (__) => __("Cambodia"),
"KI": (__) => __("Kiribati"),
"KM": (__) => __("Comoros"),
"KN": (__) => __("Saint Kitts and Nevis"),
"KP": (__) => __("North Korea"),
"KR": (__) => __("South Korea"),
"KW": (__) => __("Kuwait"),
"KY": (__) => __("Cayman Islands"),
"KZ": (__) => __("Kazakhstan"),
"LA": (__) => __("Laos"),
"LB": (__) => __("Lebanon"),
"LC": (__) => __("Saint Lucia"),
"LI": (__) => __("Liechtenstein"),
"LK": (__) => __("Sri Lanka"),
"LR": (__) => __("Liberia"),
"LS": (__) => __("Lesotho"),
"LT": (__) => __("Lithuania"),
"LU": (__) => __("Luxembourg"),
"LV": (__) => __("Latvia"),
"LY": (__) => __("Libya"),
"MA": (__) => __("Morocco"),
"MC": (__) => __("Monaco"),
"MD": (__) => __("Moldova"),
"ME": (__) => __("Montenegro"),
"MF": (__) => __("Saint Martin"),
"MG": (__) => __("Madagascar"),
"MH": (__) => __("Marshall Islands"),
"MK": (__) => __("North Macedonia"),
"ML": (__) => __("Mali"),
"MM": (__) => __("Myanmar"),
"MN": (__) => __("Mongolia"),
"MO": (__) => __("Macau"),
"MP": (__) => __("Northern Mariana Islands"),
"MQ": (__) => __("Martinique"),
"MR": (__) => __("Mauritania"),
"MS": (__) => __("Montserrat"),
"MT": (__) => __("Malta"),
"MU": (__) => __("Mauritius"),
"MV": (__) => __("Maldives"),
"MW": (__) => __("Malawi"),
"MX": (__) => __("Mexico"),
"MY": (__) => __("Malaysia"),
"MZ": (__) => __("Mozambique"),
"NA": (__) => __("Namibia"),
"NC": (__) => __("New Caledonia"),
"NE": (__) => __("Niger"),
"NF": (__) => __("Norfolk Island"),
"NG": (__) => __("Nigeria"),
"NI": (__) => __("Nicaragua"),
"NL": (__) => __("Netherlands"),
"NO": (__) => __("Norway"),
"NP": (__) => __("Nepal"),
"NR": (__) => __("Nauru"),
"NU": (__) => __("Niue"),
"NZ": (__) => __("New Zealand"),
"OM": (__) => __("Oman"),
"PA": (__) => __("Panama"),
"PE": (__) => __("Peru"),
"PF": (__) => __("French Polynesia"),
"PG": (__) => __("Papua New Guinea"),
"PH": (__) => __("Philippines"),
"PK": (__) => __("Pakistan"),
"PL": (__) => __("Poland"),
"PM": (__) => __("Saint Pierre and Miquelon"),
"PN": (__) => __("Pitcairn"),
"PR": (__) => __("Puerto Rico"),
"PS": (__) => __("Palestine"),
"PT": (__) => __("Portugal"),
"PW": (__) => __("Palau"),
"PY": (__) => __("Paraguay"),
"QA": (__) => __("Qatar"),
"RE": (__) => __("Réunion"),
"RO": (__) => __("Romania"),
"RS": (__) => __("Serbia"),
"RU": (__) => __("Russia"),
"RW": (__) => __("Rwanda"),
"SA": (__) => __("Saudi Arabia"),
"SB": (__) => __("Solomon Islands"),
"SC": (__) => __("Seychelles"),
"SD": (__) => __("Sudan"),
"SE": (__) => __("Sweden"),
"SG": (__) => __("Singapore"),
"SH": (__) => __("Saint Helena"),
"SI": (__) => __("Slovenia"),
"SJ": (__) => __("Svalbard and Jan Mayen"),
"SK": (__) => __("Slovakia"),
"SL": (__) => __("Sierra Leone"),
"SM": (__) => __("San Marino"),
"SN": (__) => __("Senegal"),
"SO": (__) => __("Somalia"),
"SR": (__) => __("Suriname"),
"SS": (__) => __("South Sudan"),
"ST": (__) => __("São Tomé and Príncipe"),
"SV": (__) => __("El Salvador"),
"SX": (__) => __("Sint Maarten"),
"SY": (__) => __("Syria"),
"SZ": (__) => __("Eswatini"),
"TC": (__) => __("Turks and Caicos Islands"),
"TD": (__) => __("Chad"),
"TF": (__) => __("French Southern Territories"),
"TG": (__) => __("Togo"),
"TH": (__) => __("Thailand"),
"TJ": (__) => __("Tajikistan"),
"TK": (__) => __("Tokelau"),
"TL": (__) => __("Timor-Leste"),
"TM": (__) => __("Turkmenistan"),
"TN": (__) => __("Tunisia"),
"TO": (__) => __("Tonga"),
"TR": (__) => __("Turkey"),
"TT": (__) => __("Trinidad and Tobago"),
"TV": (__) => __("Tuvalu"),
"TW": (__) => __("Taiwan"),
"TZ": (__) => __("Tanzania"),
"UA": (__) => __("Ukraine"),
"UG": (__) => __("Uganda"),
"UM": (__) => __("United States Minor Outlying Islands"),
"US": (__) => __("United States"),
"UY": (__) => __("Uruguay"),
"UZ": (__) => __("Uzbekistan"),
"VA": (__) => __("Vatican City"),
"VC": (__) => __("Saint Vincent and the Grenadines"),
"VE": (__) => __("Venezuela"),
"VG": (__) => __("Virgin Islands (British)"),
"VI": (__) => __("Virgin Islands (U.S.)"),
"VN": (__) => __("Vietnam"),
"VU": (__) => __("Vanuatu"),
"WF": (__) => __("Wallis and Futuna"),
"WS": (__) => __("Samoa"),
"YE": (__) => __("Yemen"),
"YT": (__) => __("Mayotte"),
"ZA": (__) => __("South Africa"),
"ZM": (__) => __("Zambia"),
"ZW": (__) => __("Zimbabwe"),
};
export function getCountryName(__: Translator, code: CountryCode): string {
const translator = countryNames[code];
return translator ? translator(__) : code;
}
export function getCountryOptions(__: Translator) {
return countries.map(code => ({
value: code,
label: getCountryName(__, code),
}));
}
export function getCountryLabel(__: Translator, code: CountryCode): string {
return getCountryName(__, code);
}

View File

@@ -12,6 +12,7 @@ export { randomInt } from "./number";
export { getMeasureStateLabel, measureStates } from "./measure";
export { getRole, getRoles, peopleRoles } from "./people";
export { certificationCategoryLabel, certifications } from "./certifications";
export { getCountryName, getCountryOptions, getCountryLabel, countries, type CountryCode } from "./countries";
export { availableFrameworks } from "./frameworks";
export { getDocumentTypeLabel, documentTypes } from "./documents";
export { getAssetTypeVariant, getCriticityVariant } from "./assets";

View File

@@ -83,6 +83,9 @@ export interface Vendor {
/** URL to vendor's status page */
statusPageUrl?: string;
/** Countries where the vendor is located */
countries?: CountryCode[];
}
/**

View File

@@ -0,0 +1,854 @@
// Copyright (c) 2025 Probo Inc <hello@getprobo.com>.
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
package coredata
import (
"database/sql/driver"
"fmt"
"strings"
)
type (
CountryCode string
)
const (
CountryCodeAD CountryCode = "AD"
CountryCodeAE CountryCode = "AE"
CountryCodeAF CountryCode = "AF"
CountryCodeAG CountryCode = "AG"
CountryCodeAI CountryCode = "AI"
CountryCodeAL CountryCode = "AL"
CountryCodeAM CountryCode = "AM"
CountryCodeAO CountryCode = "AO"
CountryCodeAQ CountryCode = "AQ"
CountryCodeAR CountryCode = "AR"
CountryCodeAS CountryCode = "AS"
CountryCodeAT CountryCode = "AT"
CountryCodeAU CountryCode = "AU"
CountryCodeAW CountryCode = "AW"
CountryCodeAX CountryCode = "AX"
CountryCodeAZ CountryCode = "AZ"
CountryCodeBA CountryCode = "BA"
CountryCodeBB CountryCode = "BB"
CountryCodeBD CountryCode = "BD"
CountryCodeBE CountryCode = "BE"
CountryCodeBF CountryCode = "BF"
CountryCodeBG CountryCode = "BG"
CountryCodeBH CountryCode = "BH"
CountryCodeBI CountryCode = "BI"
CountryCodeBJ CountryCode = "BJ"
CountryCodeBL CountryCode = "BL"
CountryCodeBM CountryCode = "BM"
CountryCodeBN CountryCode = "BN"
CountryCodeBO CountryCode = "BO"
CountryCodeBQ CountryCode = "BQ"
CountryCodeBR CountryCode = "BR"
CountryCodeBS CountryCode = "BS"
CountryCodeBT CountryCode = "BT"
CountryCodeBV CountryCode = "BV"
CountryCodeBW CountryCode = "BW"
CountryCodeBY CountryCode = "BY"
CountryCodeBZ CountryCode = "BZ"
CountryCodeCA CountryCode = "CA"
CountryCodeCC CountryCode = "CC"
CountryCodeCD CountryCode = "CD"
CountryCodeCF CountryCode = "CF"
CountryCodeCG CountryCode = "CG"
CountryCodeCH CountryCode = "CH"
CountryCodeCI CountryCode = "CI"
CountryCodeCK CountryCode = "CK"
CountryCodeCL CountryCode = "CL"
CountryCodeCM CountryCode = "CM"
CountryCodeCN CountryCode = "CN"
CountryCodeCO CountryCode = "CO"
CountryCodeCR CountryCode = "CR"
CountryCodeCU CountryCode = "CU"
CountryCodeCV CountryCode = "CV"
CountryCodeCW CountryCode = "CW"
CountryCodeCX CountryCode = "CX"
CountryCodeCY CountryCode = "CY"
CountryCodeCZ CountryCode = "CZ"
CountryCodeDE CountryCode = "DE"
CountryCodeDJ CountryCode = "DJ"
CountryCodeDK CountryCode = "DK"
CountryCodeDM CountryCode = "DM"
CountryCodeDO CountryCode = "DO"
CountryCodeDZ CountryCode = "DZ"
CountryCodeEC CountryCode = "EC"
CountryCodeEE CountryCode = "EE"
CountryCodeEG CountryCode = "EG"
CountryCodeEH CountryCode = "EH"
CountryCodeER CountryCode = "ER"
CountryCodeES CountryCode = "ES"
CountryCodeET CountryCode = "ET"
CountryCodeFI CountryCode = "FI"
CountryCodeFJ CountryCode = "FJ"
CountryCodeFK CountryCode = "FK"
CountryCodeFM CountryCode = "FM"
CountryCodeFO CountryCode = "FO"
CountryCodeFR CountryCode = "FR"
CountryCodeGA CountryCode = "GA"
CountryCodeGB CountryCode = "GB"
CountryCodeGD CountryCode = "GD"
CountryCodeGE CountryCode = "GE"
CountryCodeGF CountryCode = "GF"
CountryCodeGG CountryCode = "GG"
CountryCodeGH CountryCode = "GH"
CountryCodeGI CountryCode = "GI"
CountryCodeGL CountryCode = "GL"
CountryCodeGM CountryCode = "GM"
CountryCodeGN CountryCode = "GN"
CountryCodeGP CountryCode = "GP"
CountryCodeGQ CountryCode = "GQ"
CountryCodeGR CountryCode = "GR"
CountryCodeGT CountryCode = "GT"
CountryCodeGU CountryCode = "GU"
CountryCodeGW CountryCode = "GW"
CountryCodeGY CountryCode = "GY"
CountryCodeHK CountryCode = "HK"
CountryCodeHM CountryCode = "HM"
CountryCodeHN CountryCode = "HN"
CountryCodeHR CountryCode = "HR"
CountryCodeHT CountryCode = "HT"
CountryCodeHU CountryCode = "HU"
CountryCodeID CountryCode = "ID"
CountryCodeIE CountryCode = "IE"
CountryCodeIL CountryCode = "IL"
CountryCodeIM CountryCode = "IM"
CountryCodeIN CountryCode = "IN"
CountryCodeIO CountryCode = "IO"
CountryCodeIQ CountryCode = "IQ"
CountryCodeIR CountryCode = "IR"
CountryCodeIS CountryCode = "IS"
CountryCodeIT CountryCode = "IT"
CountryCodeJE CountryCode = "JE"
CountryCodeJM CountryCode = "JM"
CountryCodeJO CountryCode = "JO"
CountryCodeJP CountryCode = "JP"
CountryCodeKE CountryCode = "KE"
CountryCodeKG CountryCode = "KG"
CountryCodeKH CountryCode = "KH"
CountryCodeKI CountryCode = "KI"
CountryCodeKM CountryCode = "KM"
CountryCodeKN CountryCode = "KN"
CountryCodeKP CountryCode = "KP"
CountryCodeKR CountryCode = "KR"
CountryCodeKW CountryCode = "KW"
CountryCodeKY CountryCode = "KY"
CountryCodeKZ CountryCode = "KZ"
CountryCodeLA CountryCode = "LA"
CountryCodeLB CountryCode = "LB"
CountryCodeLC CountryCode = "LC"
CountryCodeLI CountryCode = "LI"
CountryCodeLK CountryCode = "LK"
CountryCodeLR CountryCode = "LR"
CountryCodeLS CountryCode = "LS"
CountryCodeLT CountryCode = "LT"
CountryCodeLU CountryCode = "LU"
CountryCodeLV CountryCode = "LV"
CountryCodeLY CountryCode = "LY"
CountryCodeMA CountryCode = "MA"
CountryCodeMC CountryCode = "MC"
CountryCodeMD CountryCode = "MD"
CountryCodeME CountryCode = "ME"
CountryCodeMF CountryCode = "MF"
CountryCodeMG CountryCode = "MG"
CountryCodeMH CountryCode = "MH"
CountryCodeMK CountryCode = "MK"
CountryCodeML CountryCode = "ML"
CountryCodeMM CountryCode = "MM"
CountryCodeMN CountryCode = "MN"
CountryCodeMO CountryCode = "MO"
CountryCodeMP CountryCode = "MP"
CountryCodeMQ CountryCode = "MQ"
CountryCodeMR CountryCode = "MR"
CountryCodeMS CountryCode = "MS"
CountryCodeMT CountryCode = "MT"
CountryCodeMU CountryCode = "MU"
CountryCodeMV CountryCode = "MV"
CountryCodeMW CountryCode = "MW"
CountryCodeMX CountryCode = "MX"
CountryCodeMY CountryCode = "MY"
CountryCodeMZ CountryCode = "MZ"
CountryCodeNA CountryCode = "NA"
CountryCodeNC CountryCode = "NC"
CountryCodeNE CountryCode = "NE"
CountryCodeNF CountryCode = "NF"
CountryCodeNG CountryCode = "NG"
CountryCodeNI CountryCode = "NI"
CountryCodeNL CountryCode = "NL"
CountryCodeNO CountryCode = "NO"
CountryCodeNP CountryCode = "NP"
CountryCodeNR CountryCode = "NR"
CountryCodeNU CountryCode = "NU"
CountryCodeNZ CountryCode = "NZ"
CountryCodeOM CountryCode = "OM"
CountryCodePA CountryCode = "PA"
CountryCodePE CountryCode = "PE"
CountryCodePF CountryCode = "PF"
CountryCodePG CountryCode = "PG"
CountryCodePH CountryCode = "PH"
CountryCodePK CountryCode = "PK"
CountryCodePL CountryCode = "PL"
CountryCodePM CountryCode = "PM"
CountryCodePN CountryCode = "PN"
CountryCodePR CountryCode = "PR"
CountryCodePS CountryCode = "PS"
CountryCodePT CountryCode = "PT"
CountryCodePW CountryCode = "PW"
CountryCodePY CountryCode = "PY"
CountryCodeQA CountryCode = "QA"
CountryCodeRE CountryCode = "RE"
CountryCodeRO CountryCode = "RO"
CountryCodeRS CountryCode = "RS"
CountryCodeRU CountryCode = "RU"
CountryCodeRW CountryCode = "RW"
CountryCodeSA CountryCode = "SA"
CountryCodeSB CountryCode = "SB"
CountryCodeSC CountryCode = "SC"
CountryCodeSD CountryCode = "SD"
CountryCodeSE CountryCode = "SE"
CountryCodeSG CountryCode = "SG"
CountryCodeSH CountryCode = "SH"
CountryCodeSI CountryCode = "SI"
CountryCodeSJ CountryCode = "SJ"
CountryCodeSK CountryCode = "SK"
CountryCodeSL CountryCode = "SL"
CountryCodeSM CountryCode = "SM"
CountryCodeSN CountryCode = "SN"
CountryCodeSO CountryCode = "SO"
CountryCodeSR CountryCode = "SR"
CountryCodeSS CountryCode = "SS"
CountryCodeST CountryCode = "ST"
CountryCodeSV CountryCode = "SV"
CountryCodeSX CountryCode = "SX"
CountryCodeSY CountryCode = "SY"
CountryCodeSZ CountryCode = "SZ"
CountryCodeTC CountryCode = "TC"
CountryCodeTD CountryCode = "TD"
CountryCodeTF CountryCode = "TF"
CountryCodeTG CountryCode = "TG"
CountryCodeTH CountryCode = "TH"
CountryCodeTJ CountryCode = "TJ"
CountryCodeTK CountryCode = "TK"
CountryCodeTL CountryCode = "TL"
CountryCodeTM CountryCode = "TM"
CountryCodeTN CountryCode = "TN"
CountryCodeTO CountryCode = "TO"
CountryCodeTR CountryCode = "TR"
CountryCodeTT CountryCode = "TT"
CountryCodeTV CountryCode = "TV"
CountryCodeTW CountryCode = "TW"
CountryCodeTZ CountryCode = "TZ"
CountryCodeUA CountryCode = "UA"
CountryCodeUG CountryCode = "UG"
CountryCodeUM CountryCode = "UM"
CountryCodeUS CountryCode = "US"
CountryCodeUY CountryCode = "UY"
CountryCodeUZ CountryCode = "UZ"
CountryCodeVA CountryCode = "VA"
CountryCodeVC CountryCode = "VC"
CountryCodeVE CountryCode = "VE"
CountryCodeVG CountryCode = "VG"
CountryCodeVI CountryCode = "VI"
CountryCodeVN CountryCode = "VN"
CountryCodeVU CountryCode = "VU"
CountryCodeWF CountryCode = "WF"
CountryCodeWS CountryCode = "WS"
CountryCodeYE CountryCode = "YE"
CountryCodeYT CountryCode = "YT"
CountryCodeZA CountryCode = "ZA"
CountryCodeZM CountryCode = "ZM"
CountryCodeZW CountryCode = "ZW"
)
func (ct CountryCode) String() string {
return string(ct)
}
func (ct *CountryCode) Scan(value any) error {
var s string
switch v := value.(type) {
case string:
s = v
case []byte:
s = string(v)
default:
return fmt.Errorf("unsupported type for CountryCode: %T", value)
}
switch s {
case CountryCodeAD.String():
*ct = CountryCodeAD
case CountryCodeAE.String():
*ct = CountryCodeAE
case CountryCodeAF.String():
*ct = CountryCodeAF
case CountryCodeAG.String():
*ct = CountryCodeAG
case CountryCodeAI.String():
*ct = CountryCodeAI
case CountryCodeAL.String():
*ct = CountryCodeAL
case CountryCodeAM.String():
*ct = CountryCodeAM
case CountryCodeAO.String():
*ct = CountryCodeAO
case CountryCodeAQ.String():
*ct = CountryCodeAQ
case CountryCodeAR.String():
*ct = CountryCodeAR
case CountryCodeAS.String():
*ct = CountryCodeAS
case CountryCodeAT.String():
*ct = CountryCodeAT
case CountryCodeAU.String():
*ct = CountryCodeAU
case CountryCodeAW.String():
*ct = CountryCodeAW
case CountryCodeAX.String():
*ct = CountryCodeAX
case CountryCodeAZ.String():
*ct = CountryCodeAZ
case CountryCodeBA.String():
*ct = CountryCodeBA
case CountryCodeBB.String():
*ct = CountryCodeBB
case CountryCodeBD.String():
*ct = CountryCodeBD
case CountryCodeBE.String():
*ct = CountryCodeBE
case CountryCodeBF.String():
*ct = CountryCodeBF
case CountryCodeBG.String():
*ct = CountryCodeBG
case CountryCodeBH.String():
*ct = CountryCodeBH
case CountryCodeBI.String():
*ct = CountryCodeBI
case CountryCodeBJ.String():
*ct = CountryCodeBJ
case CountryCodeBL.String():
*ct = CountryCodeBL
case CountryCodeBM.String():
*ct = CountryCodeBM
case CountryCodeBN.String():
*ct = CountryCodeBN
case CountryCodeBO.String():
*ct = CountryCodeBO
case CountryCodeBQ.String():
*ct = CountryCodeBQ
case CountryCodeBR.String():
*ct = CountryCodeBR
case CountryCodeBS.String():
*ct = CountryCodeBS
case CountryCodeBT.String():
*ct = CountryCodeBT
case CountryCodeBV.String():
*ct = CountryCodeBV
case CountryCodeBW.String():
*ct = CountryCodeBW
case CountryCodeBY.String():
*ct = CountryCodeBY
case CountryCodeBZ.String():
*ct = CountryCodeBZ
case CountryCodeCA.String():
*ct = CountryCodeCA
case CountryCodeCC.String():
*ct = CountryCodeCC
case CountryCodeCD.String():
*ct = CountryCodeCD
case CountryCodeCF.String():
*ct = CountryCodeCF
case CountryCodeCG.String():
*ct = CountryCodeCG
case CountryCodeCH.String():
*ct = CountryCodeCH
case CountryCodeCI.String():
*ct = CountryCodeCI
case CountryCodeCK.String():
*ct = CountryCodeCK
case CountryCodeCL.String():
*ct = CountryCodeCL
case CountryCodeCM.String():
*ct = CountryCodeCM
case CountryCodeCN.String():
*ct = CountryCodeCN
case CountryCodeCO.String():
*ct = CountryCodeCO
case CountryCodeCR.String():
*ct = CountryCodeCR
case CountryCodeCU.String():
*ct = CountryCodeCU
case CountryCodeCV.String():
*ct = CountryCodeCV
case CountryCodeCW.String():
*ct = CountryCodeCW
case CountryCodeCX.String():
*ct = CountryCodeCX
case CountryCodeCY.String():
*ct = CountryCodeCY
case CountryCodeCZ.String():
*ct = CountryCodeCZ
case CountryCodeDE.String():
*ct = CountryCodeDE
case CountryCodeDJ.String():
*ct = CountryCodeDJ
case CountryCodeDK.String():
*ct = CountryCodeDK
case CountryCodeDM.String():
*ct = CountryCodeDM
case CountryCodeDO.String():
*ct = CountryCodeDO
case CountryCodeDZ.String():
*ct = CountryCodeDZ
case CountryCodeEC.String():
*ct = CountryCodeEC
case CountryCodeEE.String():
*ct = CountryCodeEE
case CountryCodeEG.String():
*ct = CountryCodeEG
case CountryCodeEH.String():
*ct = CountryCodeEH
case CountryCodeER.String():
*ct = CountryCodeER
case CountryCodeES.String():
*ct = CountryCodeES
case CountryCodeET.String():
*ct = CountryCodeET
case CountryCodeFI.String():
*ct = CountryCodeFI
case CountryCodeFJ.String():
*ct = CountryCodeFJ
case CountryCodeFK.String():
*ct = CountryCodeFK
case CountryCodeFM.String():
*ct = CountryCodeFM
case CountryCodeFO.String():
*ct = CountryCodeFO
case CountryCodeFR.String():
*ct = CountryCodeFR
case CountryCodeGA.String():
*ct = CountryCodeGA
case CountryCodeGB.String():
*ct = CountryCodeGB
case CountryCodeGD.String():
*ct = CountryCodeGD
case CountryCodeGE.String():
*ct = CountryCodeGE
case CountryCodeGF.String():
*ct = CountryCodeGF
case CountryCodeGG.String():
*ct = CountryCodeGG
case CountryCodeGH.String():
*ct = CountryCodeGH
case CountryCodeGI.String():
*ct = CountryCodeGI
case CountryCodeGL.String():
*ct = CountryCodeGL
case CountryCodeGM.String():
*ct = CountryCodeGM
case CountryCodeGN.String():
*ct = CountryCodeGN
case CountryCodeGP.String():
*ct = CountryCodeGP
case CountryCodeGQ.String():
*ct = CountryCodeGQ
case CountryCodeGR.String():
*ct = CountryCodeGR
case CountryCodeGT.String():
*ct = CountryCodeGT
case CountryCodeGU.String():
*ct = CountryCodeGU
case CountryCodeGW.String():
*ct = CountryCodeGW
case CountryCodeGY.String():
*ct = CountryCodeGY
case CountryCodeHK.String():
*ct = CountryCodeHK
case CountryCodeHM.String():
*ct = CountryCodeHM
case CountryCodeHN.String():
*ct = CountryCodeHN
case CountryCodeHR.String():
*ct = CountryCodeHR
case CountryCodeHT.String():
*ct = CountryCodeHT
case CountryCodeHU.String():
*ct = CountryCodeHU
case CountryCodeID.String():
*ct = CountryCodeID
case CountryCodeIE.String():
*ct = CountryCodeIE
case CountryCodeIL.String():
*ct = CountryCodeIL
case CountryCodeIM.String():
*ct = CountryCodeIM
case CountryCodeIN.String():
*ct = CountryCodeIN
case CountryCodeIO.String():
*ct = CountryCodeIO
case CountryCodeIQ.String():
*ct = CountryCodeIQ
case CountryCodeIR.String():
*ct = CountryCodeIR
case CountryCodeIS.String():
*ct = CountryCodeIS
case CountryCodeIT.String():
*ct = CountryCodeIT
case CountryCodeJE.String():
*ct = CountryCodeJE
case CountryCodeJM.String():
*ct = CountryCodeJM
case CountryCodeJO.String():
*ct = CountryCodeJO
case CountryCodeJP.String():
*ct = CountryCodeJP
case CountryCodeKE.String():
*ct = CountryCodeKE
case CountryCodeKG.String():
*ct = CountryCodeKG
case CountryCodeKH.String():
*ct = CountryCodeKH
case CountryCodeKI.String():
*ct = CountryCodeKI
case CountryCodeKM.String():
*ct = CountryCodeKM
case CountryCodeKN.String():
*ct = CountryCodeKN
case CountryCodeKP.String():
*ct = CountryCodeKP
case CountryCodeKR.String():
*ct = CountryCodeKR
case CountryCodeKW.String():
*ct = CountryCodeKW
case CountryCodeKY.String():
*ct = CountryCodeKY
case CountryCodeKZ.String():
*ct = CountryCodeKZ
case CountryCodeLA.String():
*ct = CountryCodeLA
case CountryCodeLB.String():
*ct = CountryCodeLB
case CountryCodeLC.String():
*ct = CountryCodeLC
case CountryCodeLI.String():
*ct = CountryCodeLI
case CountryCodeLK.String():
*ct = CountryCodeLK
case CountryCodeLR.String():
*ct = CountryCodeLR
case CountryCodeLS.String():
*ct = CountryCodeLS
case CountryCodeLT.String():
*ct = CountryCodeLT
case CountryCodeLU.String():
*ct = CountryCodeLU
case CountryCodeLV.String():
*ct = CountryCodeLV
case CountryCodeLY.String():
*ct = CountryCodeLY
case CountryCodeMA.String():
*ct = CountryCodeMA
case CountryCodeMC.String():
*ct = CountryCodeMC
case CountryCodeMD.String():
*ct = CountryCodeMD
case CountryCodeME.String():
*ct = CountryCodeME
case CountryCodeMF.String():
*ct = CountryCodeMF
case CountryCodeMG.String():
*ct = CountryCodeMG
case CountryCodeMH.String():
*ct = CountryCodeMH
case CountryCodeMK.String():
*ct = CountryCodeMK
case CountryCodeML.String():
*ct = CountryCodeML
case CountryCodeMM.String():
*ct = CountryCodeMM
case CountryCodeMN.String():
*ct = CountryCodeMN
case CountryCodeMO.String():
*ct = CountryCodeMO
case CountryCodeMP.String():
*ct = CountryCodeMP
case CountryCodeMQ.String():
*ct = CountryCodeMQ
case CountryCodeMR.String():
*ct = CountryCodeMR
case CountryCodeMS.String():
*ct = CountryCodeMS
case CountryCodeMT.String():
*ct = CountryCodeMT
case CountryCodeMU.String():
*ct = CountryCodeMU
case CountryCodeMV.String():
*ct = CountryCodeMV
case CountryCodeMW.String():
*ct = CountryCodeMW
case CountryCodeMX.String():
*ct = CountryCodeMX
case CountryCodeMY.String():
*ct = CountryCodeMY
case CountryCodeMZ.String():
*ct = CountryCodeMZ
case CountryCodeNA.String():
*ct = CountryCodeNA
case CountryCodeNC.String():
*ct = CountryCodeNC
case CountryCodeNE.String():
*ct = CountryCodeNE
case CountryCodeNF.String():
*ct = CountryCodeNF
case CountryCodeNG.String():
*ct = CountryCodeNG
case CountryCodeNI.String():
*ct = CountryCodeNI
case CountryCodeNL.String():
*ct = CountryCodeNL
case CountryCodeNO.String():
*ct = CountryCodeNO
case CountryCodeNP.String():
*ct = CountryCodeNP
case CountryCodeNR.String():
*ct = CountryCodeNR
case CountryCodeNU.String():
*ct = CountryCodeNU
case CountryCodeNZ.String():
*ct = CountryCodeNZ
case CountryCodeOM.String():
*ct = CountryCodeOM
case CountryCodePA.String():
*ct = CountryCodePA
case CountryCodePE.String():
*ct = CountryCodePE
case CountryCodePF.String():
*ct = CountryCodePF
case CountryCodePG.String():
*ct = CountryCodePG
case CountryCodePH.String():
*ct = CountryCodePH
case CountryCodePK.String():
*ct = CountryCodePK
case CountryCodePL.String():
*ct = CountryCodePL
case CountryCodePM.String():
*ct = CountryCodePM
case CountryCodePN.String():
*ct = CountryCodePN
case CountryCodePR.String():
*ct = CountryCodePR
case CountryCodePS.String():
*ct = CountryCodePS
case CountryCodePT.String():
*ct = CountryCodePT
case CountryCodePW.String():
*ct = CountryCodePW
case CountryCodePY.String():
*ct = CountryCodePY
case CountryCodeQA.String():
*ct = CountryCodeQA
case CountryCodeRE.String():
*ct = CountryCodeRE
case CountryCodeRO.String():
*ct = CountryCodeRO
case CountryCodeRS.String():
*ct = CountryCodeRS
case CountryCodeRU.String():
*ct = CountryCodeRU
case CountryCodeRW.String():
*ct = CountryCodeRW
case CountryCodeSA.String():
*ct = CountryCodeSA
case CountryCodeSB.String():
*ct = CountryCodeSB
case CountryCodeSC.String():
*ct = CountryCodeSC
case CountryCodeSD.String():
*ct = CountryCodeSD
case CountryCodeSE.String():
*ct = CountryCodeSE
case CountryCodeSG.String():
*ct = CountryCodeSG
case CountryCodeSH.String():
*ct = CountryCodeSH
case CountryCodeSI.String():
*ct = CountryCodeSI
case CountryCodeSJ.String():
*ct = CountryCodeSJ
case CountryCodeSK.String():
*ct = CountryCodeSK
case CountryCodeSL.String():
*ct = CountryCodeSL
case CountryCodeSM.String():
*ct = CountryCodeSM
case CountryCodeSN.String():
*ct = CountryCodeSN
case CountryCodeSO.String():
*ct = CountryCodeSO
case CountryCodeSR.String():
*ct = CountryCodeSR
case CountryCodeSS.String():
*ct = CountryCodeSS
case CountryCodeST.String():
*ct = CountryCodeST
case CountryCodeSV.String():
*ct = CountryCodeSV
case CountryCodeSY.String():
*ct = CountryCodeSY
case CountryCodeSZ.String():
*ct = CountryCodeSZ
case CountryCodeTC.String():
*ct = CountryCodeTC
case CountryCodeTD.String():
*ct = CountryCodeTD
case CountryCodeTF.String():
*ct = CountryCodeTF
case CountryCodeTG.String():
*ct = CountryCodeTG
case CountryCodeTH.String():
*ct = CountryCodeTH
case CountryCodeTJ.String():
*ct = CountryCodeTJ
case CountryCodeTK.String():
*ct = CountryCodeTK
case CountryCodeTL.String():
*ct = CountryCodeTL
case CountryCodeTM.String():
*ct = CountryCodeTM
case CountryCodeTN.String():
*ct = CountryCodeTN
case CountryCodeTO.String():
*ct = CountryCodeTO
case CountryCodeTR.String():
*ct = CountryCodeTR
case CountryCodeTT.String():
*ct = CountryCodeTT
case CountryCodeTV.String():
*ct = CountryCodeTV
case CountryCodeTW.String():
*ct = CountryCodeTW
case CountryCodeTZ.String():
*ct = CountryCodeTZ
case CountryCodeUA.String():
*ct = CountryCodeUA
case CountryCodeUG.String():
*ct = CountryCodeUG
case CountryCodeUM.String():
*ct = CountryCodeUM
case CountryCodeUS.String():
*ct = CountryCodeUS
case CountryCodeUY.String():
*ct = CountryCodeUY
case CountryCodeUZ.String():
*ct = CountryCodeUZ
case CountryCodeVA.String():
*ct = CountryCodeVA
case CountryCodeVC.String():
*ct = CountryCodeVC
case CountryCodeVE.String():
*ct = CountryCodeVE
case CountryCodeVG.String():
*ct = CountryCodeVG
case CountryCodeVI.String():
*ct = CountryCodeVI
case CountryCodeVN.String():
*ct = CountryCodeVN
case CountryCodeVU.String():
*ct = CountryCodeVU
case CountryCodeWF.String():
*ct = CountryCodeWF
case CountryCodeWS.String():
*ct = CountryCodeWS
case CountryCodeYE.String():
*ct = CountryCodeYE
case CountryCodeYT.String():
*ct = CountryCodeYT
case CountryCodeZA.String():
*ct = CountryCodeZA
case CountryCodeZM.String():
*ct = CountryCodeZM
case CountryCodeZW.String():
*ct = CountryCodeZW
default:
return fmt.Errorf("invalid CountryCode value: %q", s)
}
return nil
}
func (st CountryCode) Value() (driver.Value, error) {
return st.String(), nil
}
type CountryCodes []CountryCode
func (s *CountryCodes) Scan(value any) error {
switch v := value.(type) {
case string:
return s.scanFromString(v)
case []byte:
return s.scanFromString(string(v))
default:
return fmt.Errorf("unsupported type for CountryCodes: %T", value)
}
}
func (s *CountryCodes) scanFromString(str string) error {
str = strings.TrimSpace(str)
if str == "{}" || str == "" {
*s = []CountryCode{}
return nil
}
if strings.HasPrefix(str, "{") && strings.HasSuffix(str, "}") {
str = str[1 : len(str)-1]
}
parts := strings.Split(str, ",")
result := make([]CountryCode, len(parts))
for i, part := range parts {
part = strings.TrimSpace(part)
if strings.HasPrefix(part, `"`) && strings.HasSuffix(part, `"`) {
part = part[1 : len(part)-1]
}
var ct CountryCode
if err := ct.Scan(part); err != nil {
return fmt.Errorf("invalid country code in array: %s", part)
}
result[i] = ct
}
*s = result
return nil
}
func (s CountryCodes) Value() (driver.Value, error) {
if len(s) == 0 {
return "{}", nil
}
values := make([]string, len(s))
for i, ct := range s {
values[i] = ct.String()
}
return "{" + strings.Join(values, ",") + "}", nil
}

View File

@@ -0,0 +1,31 @@
-- ISO 3166-1 alpha-2 country codes
CREATE TYPE country_code AS ENUM (
'AD','AE','AF','AG','AI','AL','AM','AO','AQ','AR',
'AS','AT','AU','AW','AX','AZ','BA','BB','BD','BE',
'BF','BG','BH','BI','BJ','BL','BM','BN','BO','BQ',
'BR','BS','BT','BV','BW','BY','BZ','CA','CC','CD',
'CF','CG','CH','CI','CK','CL','CM','CN','CO','CR',
'CU','CV','CW','CX','CY','CZ','DE','DJ','DK','DM',
'DO','DZ','EC','EE','EG','EH','ER','ES','ET','FI',
'FJ','FK','FM','FO','FR','GA','GB','GD','GE','GF',
'GG','GH','GI','GL','GM','GN','GP','GQ','GR','GT',
'GU','GW','GY','HK','HM','HN','HR','HT','HU','ID',
'IE','IL','IM','IN','IO','IQ','IR','IS','IT','JE',
'JM','JO','JP','KE','KG','KH','KI','KM','KN','KP',
'KR','KW','KY','KZ','LA','LB','LC','LI','LK','LR',
'LS','LT','LU','LV','LY','MA','MC','MD','ME','MF',
'MG','MH','MK','ML','MM','MN','MO','MP','MQ','MR',
'MS','MT','MU','MV','MW','MX','MY','MZ','NA','NC',
'NE','NF','NG','NI','NL','NO','NP','NR','NU','NZ',
'OM','PA','PE','PF','PG','PH','PK','PL','PM','PN',
'PR','PS','PT','PW','PY','QA','RE','RO','RS','RU',
'RW','SA','SB','SC','SD','SE','SG','SH','SI','SJ',
'SK','SL','SM','SN','SO','SR','SS','ST','SV','SX',
'SY','SZ','TC','TD','TF','TG','TH','TJ','TK','TL',
'TM','TN','TO','TR','TT','TV','TW','TZ','UA','UG',
'UM','US','UY','UZ','VA','VC','VE','VG','VI','VN',
'VU','WF','WS','YE','YT','ZA','ZM','ZW'
);
ALTER TABLE vendors ADD COLUMN countries country_code[] NOT NULL DEFAULT '{}';
ALTER TABLE vendors ALTER COLUMN countries DROP DEFAULT;

View File

@@ -43,6 +43,7 @@ type (
BusinessAssociateAgreementURL *string `db:"business_associate_agreement_url"`
SubprocessorsListURL *string `db:"subprocessors_list_url"`
Certifications []string `db:"certifications"`
Countries CountryCodes `db:"countries"`
BusinessOwnerID *gid.GID `db:"business_owner_id"`
SecurityOwnerID *gid.GID `db:"security_owner_id"`
StatusPageURL *string `db:"status_page_url"`
@@ -99,6 +100,7 @@ SELECT
business_associate_agreement_url,
subprocessors_list_url,
certifications,
countries,
business_owner_id,
security_owner_id,
status_page_url,
@@ -162,6 +164,7 @@ INSERT INTO
business_associate_agreement_url,
subprocessors_list_url,
certifications,
countries,
business_owner_id,
security_owner_id,
status_page_url,
@@ -190,6 +193,7 @@ VALUES (
@business_associate_agreement_url,
@subprocessors_list_url,
@certifications,
@countries,
@business_owner_id,
@security_owner_id,
@status_page_url,
@@ -220,6 +224,7 @@ VALUES (
"business_associate_agreement_url": v.BusinessAssociateAgreementURL,
"subprocessors_list_url": v.SubprocessorsListURL,
"certifications": v.Certifications,
"countries": v.Countries,
"business_owner_id": v.BusinessOwnerID,
"security_owner_id": v.SecurityOwnerID,
"status_page_url": v.StatusPageURL,
@@ -311,6 +316,7 @@ SELECT
business_associate_agreement_url,
subprocessors_list_url,
certifications,
countries,
business_owner_id,
security_owner_id,
status_page_url,
@@ -372,6 +378,7 @@ SET
business_associate_agreement_url = @business_associate_agreement_url,
subprocessors_list_url = @subprocessors_list_url,
certifications = @certifications,
countries = @countries,
status_page_url = @status_page_url,
terms_of_service_url = @terms_of_service_url,
security_page_url = @security_page_url,
@@ -400,6 +407,7 @@ WHERE %s
"business_associate_agreement_url": v.BusinessAssociateAgreementURL,
"subprocessors_list_url": v.SubprocessorsListURL,
"certifications": v.Certifications,
"countries": v.Countries,
"status_page_url": v.StatusPageURL,
"terms_of_service_url": v.TermsOfServiceURL,
"security_page_url": v.SecurityPageURL,
@@ -513,6 +521,7 @@ WITH vend AS (
v.business_associate_agreement_url,
v.subprocessors_list_url,
v.certifications,
v.countries,
v.business_owner_id,
v.security_owner_id,
v.status_page_url,
@@ -547,6 +556,7 @@ SELECT
business_associate_agreement_url,
subprocessors_list_url,
certifications,
countries,
business_owner_id,
security_owner_id,
status_page_url,
@@ -648,6 +658,7 @@ WITH vend AS (
v.business_associate_agreement_url,
v.subprocessors_list_url,
v.certifications,
v.countries,
v.business_owner_id,
v.security_owner_id,
v.status_page_url,
@@ -682,6 +693,7 @@ SELECT
business_associate_agreement_url,
subprocessors_list_url,
certifications,
countries,
business_owner_id,
security_owner_id,
status_page_url,
@@ -761,6 +773,7 @@ INSERT INTO vendors (
business_associate_agreement_url,
subprocessors_list_url,
certifications,
countries,
business_owner_id,
security_owner_id,
status_page_url,
@@ -789,6 +802,7 @@ SELECT
v.business_associate_agreement_url,
v.subprocessors_list_url,
v.certifications,
v.countries,
v.business_owner_id,
v.security_owner_id,
v.status_page_url,
@@ -861,6 +875,7 @@ INSERT INTO vendors (
business_associate_agreement_url,
subprocessors_list_url,
certifications,
countries,
business_owner_id,
security_owner_id,
status_page_url,
@@ -889,6 +904,7 @@ SELECT
v.business_associate_agreement_url,
v.subprocessors_list_url,
v.certifications,
v.countries,
v.business_owner_id,
v.security_owner_id,
v.status_page_url,
@@ -963,6 +979,7 @@ INSERT INTO vendors (
business_associate_agreement_url,
subprocessors_list_url,
certifications,
countries,
business_owner_id,
security_owner_id,
status_page_url,
@@ -991,6 +1008,7 @@ SELECT
v.business_associate_agreement_url,
v.subprocessors_list_url,
v.certifications,
v.countries,
v.business_owner_id,
v.security_owner_id,
v.status_page_url,

View File

@@ -44,6 +44,7 @@ type (
BusinessAssociateAgreementURL *string
SubprocessorsListURL *string
Certifications []string
Countries coredata.CountryCodes
SecurityPageURL *string
TrustPageURL *string
TermsOfServiceURL *string
@@ -67,6 +68,7 @@ type (
BusinessAssociateAgreementURL *string
SubprocessorsListURL *string
Certifications []string
Countries coredata.CountryCodes
SecurityPageURL *string
TrustPageURL *string
StatusPageURL *string
@@ -290,6 +292,10 @@ func (s VendorService) Update(
vendor.Certifications = req.Certifications
}
if req.Countries != nil {
vendor.Countries = req.Countries
}
if req.StatusPageURL != nil {
vendor.StatusPageURL = req.StatusPageURL
}
@@ -396,6 +402,7 @@ func (s VendorService) Create(
BusinessAssociateAgreementURL: req.BusinessAssociateAgreementURL,
SubprocessorsListURL: req.SubprocessorsListURL,
Certifications: req.Certifications,
Countries: req.Countries,
SecurityPageURL: req.SecurityPageURL,
TrustPageURL: req.TrustPageURL,
StatusPageURL: req.StatusPageURL,

View File

@@ -563,6 +563,258 @@ enum DocumentVersionOrderField
)
}
enum CountryCode
@goModel(model: "github.com/getprobo/probo/pkg/coredata.CountryCode") {
AD @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAD")
AE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAE")
AF @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAF")
AG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAG")
AI @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAI")
AL @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAL")
AM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAM")
AO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAO")
AQ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAQ")
AR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAR")
AS @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAS")
AT @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAT")
AU @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAU")
AW @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAW")
AX @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAX")
AZ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeAZ")
BA @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBA")
BB @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBB")
BD @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBD")
BE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBE")
BF @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBF")
BG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBG")
BH @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBH")
BI @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBI")
BJ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBJ")
BL @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBL")
BM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBM")
BN @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBN")
BO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBO")
BQ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBQ")
BR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBR")
BS @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBS")
BT @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBT")
BV @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBV")
BW @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBW")
BY @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBY")
BZ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeBZ")
CA @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCA")
CC @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCC")
CD @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCD")
CF @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCF")
CG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCG")
CH @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCH")
CI @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCI")
CK @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCK")
CL @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCL")
CM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCM")
CN @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCN")
CO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCO")
CR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCR")
CU @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCU")
CV @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCV")
CW @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCW")
CX @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCX")
CY @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCY")
CZ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeCZ")
DE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeDE")
DJ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeDJ")
DK @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeDK")
DM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeDM")
DO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeDO")
DZ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeDZ")
EC @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeEC")
EE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeEE")
EG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeEG")
EH @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeEH")
ER @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeER")
ES @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeES")
ET @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeET")
FI @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeFI")
FJ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeFJ")
FK @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeFK")
FM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeFM")
FO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeFO")
FR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeFR")
GA @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGA")
GB @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGB")
GD @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGD")
GE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGE")
GF @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGF")
GG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGG")
GH @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGH")
GI @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGI")
GL @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGL")
GM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGM")
GN @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGN")
GP @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGP")
GQ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGQ")
GR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGR")
GT @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGT")
GU @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGU")
GW @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGW")
GY @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeGY")
HK @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeHK")
HM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeHM")
HN @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeHN")
HR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeHR")
HT @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeHT")
HU @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeHU")
ID @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeID")
IE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeIE")
IL @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeIL")
IM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeIM")
IN @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeIN")
IO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeIO")
IQ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeIQ")
IR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeIR")
IS @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeIS")
IT @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeIT")
JE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeJE")
JM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeJM")
JO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeJO")
JP @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeJP")
KE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeKE")
KG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeKG")
KH @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeKH")
KI @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeKI")
KM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeKM")
KN @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeKN")
KP @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeKP")
KR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeKR")
KW @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeKW")
KY @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeKY")
KZ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeKZ")
LA @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeLA")
LB @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeLB")
LC @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeLC")
LI @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeLI")
LK @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeLK")
LR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeLR")
LS @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeLS")
LT @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeLT")
LU @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeLU")
LV @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeLV")
LY @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeLY")
MA @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMA")
MC @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMC")
MD @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMD")
ME @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeME")
MF @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMF")
MG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMG")
MH @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMH")
MK @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMK")
ML @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeML")
MM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMM")
MN @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMN")
MO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMO")
MP @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMP")
MQ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMQ")
MR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMR")
MS @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMS")
MT @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMT")
MU @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMU")
MV @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMV")
MW @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMW")
MX @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMX")
MY @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMY")
MZ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeMZ")
NA @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeNA")
NC @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeNC")
NE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeNE")
NF @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeNF")
NG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeNG")
NI @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeNI")
NL @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeNL")
NO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeNO")
NP @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeNP")
NR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeNR")
NU @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeNU")
NZ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeNZ")
OM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeOM")
PA @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePA")
PE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePE")
PF @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePF")
PG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePG")
PH @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePH")
PK @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePK")
PL @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePL")
PM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePM")
PN @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePN")
PR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePR")
PS @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePS")
PT @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePT")
PW @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePW")
PY @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodePY")
QA @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeQA")
RE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeRE")
RO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeRO")
RS @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeRS")
RU @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeRU")
RW @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeRW")
SA @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSA")
SB @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSB")
SC @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSC")
SD @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSD")
SE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSE")
SG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSG")
SH @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSH")
SI @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSI")
SJ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSJ")
SK @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSK")
SL @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSL")
SM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSM")
SN @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSN")
SO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSO")
SR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSR")
SS @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSS")
ST @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeST")
SV @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSV")
SX @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSX")
SY @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSY")
SZ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeSZ")
TC @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTC")
TD @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTD")
TF @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTF")
TG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTG")
TH @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTH")
TJ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTJ")
TK @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTK")
TL @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTL")
TM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTM")
TN @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTN")
TO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTO")
TR @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTR")
TT @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTT")
TV @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTV")
TW @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTW")
TZ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeTZ")
UA @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeUA")
UG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeUG")
UM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeUM")
US @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeUS")
UY @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeUY")
UZ @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeUZ")
VA @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeVA")
VC @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeVC")
VE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeVE")
VG @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeVG")
VI @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeVI")
VN @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeVN")
VU @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeVU")
WF @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeWF")
WS @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeWS")
YE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeYE")
YT @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeYT")
ZA @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeZA")
ZM @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeZM")
ZW @goEnum(value: "github.com/getprobo/probo/pkg/coredata.CountryCodeZW")
}
enum VendorCategory
@goModel(model: "github.com/getprobo/probo/pkg/coredata.VendorCategory") {
ANALYTICS
@@ -1412,6 +1664,7 @@ type Vendor implements Node {
businessAssociateAgreementUrl: String
subprocessorsListUrl: String
certifications: [String!]!
countries: [CountryCode!]!
securityPageUrl: String
trustPageUrl: String
headquarterAddress: String
@@ -2555,6 +2808,7 @@ input CreateVendorInput {
businessAssociateAgreementUrl: String
subprocessorsListUrl: String
certifications: [String!]
countries: [CountryCode!]
securityPageUrl: String
trustPageUrl: String
statusPageUrl: String
@@ -2579,6 +2833,7 @@ input UpdateVendorInput {
headquarterAddress: String
category: VendorCategory
certifications: [String!]
countries: [CountryCode!]
securityPageUrl: String
trustPageUrl: String
businessOwnerId: ID

File diff suppressed because it is too large Load Diff

View File

@@ -547,6 +547,7 @@ type CreateVendorInput struct {
BusinessAssociateAgreementURL *string `json:"businessAssociateAgreementUrl,omitempty"`
SubprocessorsListURL *string `json:"subprocessorsListUrl,omitempty"`
Certifications []string `json:"certifications,omitempty"`
Countries []coredata.CountryCode `json:"countries,omitempty"`
SecurityPageURL *string `json:"securityPageUrl,omitempty"`
TrustPageURL *string `json:"trustPageUrl,omitempty"`
StatusPageURL *string `json:"statusPageUrl,omitempty"`
@@ -1792,6 +1793,7 @@ type UpdateVendorInput struct {
HeadquarterAddress *string `json:"headquarterAddress,omitempty"`
Category *coredata.VendorCategory `json:"category,omitempty"`
Certifications []string `json:"certifications,omitempty"`
Countries []coredata.CountryCode `json:"countries,omitempty"`
SecurityPageURL *string `json:"securityPageUrl,omitempty"`
TrustPageURL *string `json:"trustPageUrl,omitempty"`
BusinessOwnerID *gid.GID `json:"businessOwnerId,omitempty"`
@@ -1933,6 +1935,7 @@ type Vendor struct {
BusinessAssociateAgreementURL *string `json:"businessAssociateAgreementUrl,omitempty"`
SubprocessorsListURL *string `json:"subprocessorsListUrl,omitempty"`
Certifications []string `json:"certifications"`
Countries []coredata.CountryCode `json:"countries"`
SecurityPageURL *string `json:"securityPageUrl,omitempty"`
TrustPageURL *string `json:"trustPageUrl,omitempty"`
HeadquarterAddress *string `json:"headquarterAddress,omitempty"`

View File

@@ -81,6 +81,7 @@ func NewVendor(v *coredata.Vendor) *Vendor {
Category: v.Category,
ShowOnTrustCenter: v.ShowOnTrustCenter,
SnapshotID: v.SnapshotID,
Countries: v.Countries,
UpdatedAt: v.UpdatedAt,
CreatedAt: v.CreatedAt,
}

View File

@@ -1390,6 +1390,7 @@ func (r *mutationResolver) CreateVendor(ctx context.Context, input types.CreateV
TrustPageURL: input.TrustPageURL,
BusinessOwnerID: input.BusinessOwnerID,
SecurityOwnerID: input.SecurityOwnerID,
Countries: input.Countries,
},
)
if err != nil {
@@ -1425,6 +1426,7 @@ func (r *mutationResolver) UpdateVendor(ctx context.Context, input types.UpdateV
BusinessOwnerID: &input.BusinessOwnerID,
SecurityOwnerID: &input.SecurityOwnerID,
ShowOnTrustCenter: input.ShowOnTrustCenter,
Countries: input.Countries,
})
if err != nil {
return nil, fmt.Errorf("cannot update vendor: %w", err)

View File

@@ -182,6 +182,7 @@ type Vendor implements Node {
category: VendorCategory!
websiteUrl: String
privacyPolicyUrl: String
countries: [String!]!
}
type VendorConnection {