Fix non mandatory fields on vendor

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
This commit is contained in:
Sacha Al Himdani
2025-09-01 17:59:53 +02:00
parent 078102db74
commit 6716b1e615
5 changed files with 32 additions and 17 deletions

View File

@@ -10,6 +10,7 @@ type Props = {
name: string;
label?: string;
error?: string;
optional?: boolean;
} & ComponentProps<typeof Field>;
export function PeopleSelectField({
@@ -27,6 +28,7 @@ export function PeopleSelectField({
control={control}
name={props.name}
disabled={props.disabled}
optional={props.optional}
/>
</Suspense>
</Field>
@@ -34,7 +36,7 @@ export function PeopleSelectField({
}
function PeopleSelectWithQuery(
props: Pick<Props, "organizationId" | "control" | "name" | "disabled">
props: Pick<Props, "organizationId" | "control" | "name" | "disabled" | "optional">
) {
const { __ } = useTranslate();
const { name, organizationId, control } = props;
@@ -51,12 +53,15 @@ function PeopleSelectWithQuery(
id={name}
variant="editor"
placeholder={__("Select an owner")}
onValueChange={field.onChange}
onValueChange={(value) => field.onChange(value === "__NONE__" ? null : value)}
key={people?.length.toString() ?? "0"}
{...field}
className="w-full"
value={field.value ?? ""}
value={field.value ?? (props.optional ? "__NONE__" : "")}
>
{props.optional && (
<Option value="__NONE__">{__("None")}</Option>
)}
{people?.map((p) => (
<Option key={p.id} value={p.id} className="flex gap-2">
<Avatar name={p.fullName} />

View File

@@ -21,8 +21,8 @@ const schema = z.object({
certifications: z.array(z.string()),
securityPageUrl: z.string(),
trustPageUrl: z.string(),
businessOwnerId: z.string(),
securityOwnerId: z.string(),
businessOwnerId: z.string().nullish(),
securityOwnerId: z.string().nullish(),
});
const vendorFormFragment = graphql`

View File

@@ -154,6 +154,7 @@ export default function VendorOverviewTab() {
label={__("Business owner")}
error={errors.businessOwnerId?.message}
disabled={isSubmitting || isSnapshotMode}
optional={true}
/>
<PeopleSelectField
organizationId={organizationId}
@@ -162,6 +163,7 @@ export default function VendorOverviewTab() {
label={__("Security owner")}
error={errors.securityOwnerId?.message}
disabled={isSubmitting || isSnapshotMode}
optional={true}
/>
</Card>
</div>

View File

@@ -70,8 +70,8 @@ type (
SecurityPageURL *string
TrustPageURL *string
StatusPageURL *string
BusinessOwnerID *gid.GID
SecurityOwnerID *gid.GID
BusinessOwnerID **gid.GID
SecurityOwnerID **gid.GID
ShowOnTrustCenter *bool
}
@@ -303,19 +303,27 @@ func (s VendorService) Update(
}
if req.BusinessOwnerID != nil {
businessOwner := &coredata.People{}
if err := businessOwner.LoadByID(ctx, conn, s.svc.scope, *req.BusinessOwnerID); err != nil {
return fmt.Errorf("cannot load business owner: %w", err)
if *req.BusinessOwnerID != nil {
businessOwner := &coredata.People{}
if err := businessOwner.LoadByID(ctx, conn, s.svc.scope, **req.BusinessOwnerID); err != nil {
return fmt.Errorf("cannot load business owner: %w", err)
}
vendor.BusinessOwnerID = &businessOwner.ID
} else {
vendor.BusinessOwnerID = nil
}
vendor.BusinessOwnerID = &businessOwner.ID
}
if req.SecurityOwnerID != nil {
securityOwner := &coredata.People{}
if err := securityOwner.LoadByID(ctx, conn, s.svc.scope, *req.SecurityOwnerID); err != nil {
return fmt.Errorf("cannot load security owner: %w", err)
if *req.SecurityOwnerID != nil {
securityOwner := &coredata.People{}
if err := securityOwner.LoadByID(ctx, conn, s.svc.scope, **req.SecurityOwnerID); err != nil {
return fmt.Errorf("cannot load security owner: %w", err)
}
vendor.SecurityOwnerID = &securityOwner.ID
} else {
vendor.SecurityOwnerID = nil
}
vendor.SecurityOwnerID = &securityOwner.ID
}
vendor.UpdatedAt = time.Now()

View File

@@ -1443,8 +1443,8 @@ func (r *mutationResolver) UpdateVendor(ctx context.Context, input types.UpdateV
WebsiteURL: input.WebsiteURL,
Category: input.Category,
Certifications: input.Certifications,
BusinessOwnerID: input.BusinessOwnerID,
SecurityOwnerID: input.SecurityOwnerID,
BusinessOwnerID: &input.BusinessOwnerID,
SecurityOwnerID: &input.SecurityOwnerID,
ShowOnTrustCenter: input.ShowOnTrustCenter,
})
if err != nil {