diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/LinksFieldInput.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/LinksFieldInput.tsx index bb8c84dd2..3fdbb0abf 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/LinksFieldInput.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/LinksFieldInput.tsx @@ -124,6 +124,33 @@ export const LinksFieldInput = ({ onCancel }: LinksFieldInputProps) => { }; const handleDeleteLink = (index: number) => { + const hasOnlyOneLastLink = links.length === 1; + + if (hasOnlyOneLastLink) { + persistLinksField({ + primaryLinkUrl: '', + primaryLinkLabel: '', + secondaryLinks: null, + }); + + handleDropdownClose(); + + return; + } + + const isRemovingPrimary = index === 0; + if (isRemovingPrimary) { + const [, nextPrimaryLink, ...nextSecondaryLinks] = links; + + persistLinksField({ + primaryLinkUrl: nextPrimaryLink.url ?? '', + primaryLinkLabel: nextPrimaryLink.label ?? '', + secondaryLinks: nextSecondaryLinks, + }); + + return; + } + persistLinksField({ ...fieldValue, secondaryLinks: toSpliced(fieldValue.secondaryLinks ?? [], index - 1, 1), diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/LinksFieldMenuItem.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/LinksFieldMenuItem.tsx index 39be33237..5b1fedb88 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/LinksFieldMenuItem.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/LinksFieldMenuItem.tsx @@ -46,6 +46,11 @@ export const LinksFieldMenuItem = ({ const handleMouseEnter = () => setIsHovered(true); const handleMouseLeave = () => setIsHovered(false); + const handleDeleteClick = () => { + setIsHovered(false); + onDelete?.(); + }; + // Make sure dropdown closes on unmount. useEffect(() => { if (isDropdownOpen) { @@ -86,14 +91,12 @@ export const LinksFieldMenuItem = ({ text="Edit" onClick={onEdit} /> - {!isPrimary && ( - - )} + } /> diff --git a/packages/twenty-front/src/utils/validation-schemas/__tests__/absoluteUrlSchema.test.ts b/packages/twenty-front/src/utils/validation-schemas/__tests__/absoluteUrlSchema.test.ts index d20f3bcf6..ffb83cfc8 100644 --- a/packages/twenty-front/src/utils/validation-schemas/__tests__/absoluteUrlSchema.test.ts +++ b/packages/twenty-front/src/utils/validation-schemas/__tests__/absoluteUrlSchema.test.ts @@ -28,7 +28,6 @@ describe('absoluteUrlSchema', () => { it('fails for invalid urls', () => { expect(absoluteUrlSchema.safeParse('?o').success).toBe(false); - expect(absoluteUrlSchema.safeParse('').success).toBe(false); expect(absoluteUrlSchema.safeParse('\\').success).toBe(false); }); }); diff --git a/packages/twenty-front/src/utils/validation-schemas/absoluteUrlSchema.ts b/packages/twenty-front/src/utils/validation-schemas/absoluteUrlSchema.ts index e0c376c74..a0deb4bfa 100644 --- a/packages/twenty-front/src/utils/validation-schemas/absoluteUrlSchema.ts +++ b/packages/twenty-front/src/utils/validation-schemas/absoluteUrlSchema.ts @@ -8,4 +8,5 @@ export const absoluteUrlSchema = z .string() .transform((value) => `https://${value}`) .pipe(z.string().url()), - ); + ) + .or(z.literal(''));