Skip to content

Commit 18875ea

Browse files
committed
feat: set primary link in Links field
Closes #5375
1 parent 2386191 commit 18875ea

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/LinksFieldInput.tsx

+15
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownM
1414
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
1515
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
1616
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
17+
import { moveArrayItem } from '~/utils/array/moveArrayItem';
1718
import { toSpliced } from '~/utils/array/toSpliced';
1819
import { isDefined } from '~/utils/isDefined';
1920

@@ -86,6 +87,19 @@ export const LinksFieldInput = ({
8687
);
8788
};
8889

90+
const handleSetPrimaryLink = (index: number) => {
91+
const nextLinks = moveArrayItem(links, { fromIndex: index, toIndex: 0 });
92+
const [nextPrimaryLink, ...nextSecondaryLinks] = nextLinks;
93+
94+
onSubmit?.(() =>
95+
persistLinksField({
96+
primaryLinkUrl: nextPrimaryLink.url ?? '',
97+
primaryLinkLabel: nextPrimaryLink.label ?? '',
98+
secondaryLinks: nextSecondaryLinks,
99+
}),
100+
);
101+
};
102+
89103
const handleDeleteLink = (index: number) => {
90104
onSubmit?.(() =>
91105
persistLinksField({
@@ -110,6 +124,7 @@ export const LinksFieldInput = ({
110124
dropdownId={`${hotkeyScope}-links-${index}`}
111125
isPrimary={index === 0}
112126
label={label}
127+
onSetAsPrimary={() => handleSetPrimaryLink(index)}
113128
onDelete={() => handleDeleteLink(index)}
114129
url={url}
115130
/>

packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/LinksFieldMenuItem.tsx

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import { useEffect } from 'react';
12
import styled from '@emotion/styled';
23
import {
34
IconBookmark,
5+
IconBookmarkPlus,
46
IconComponent,
57
IconDotsVertical,
68
IconTrash,
@@ -16,6 +18,7 @@ type LinksFieldMenuItemProps = {
1618
dropdownId: string;
1719
isPrimary?: boolean;
1820
label: string;
21+
onSetAsPrimary: () => void;
1922
onDelete: () => void;
2023
url: string;
2124
};
@@ -30,10 +33,18 @@ export const LinksFieldMenuItem = ({
3033
dropdownId,
3134
isPrimary,
3235
label,
36+
onSetAsPrimary,
3337
onDelete,
3438
url,
3539
}: LinksFieldMenuItemProps) => {
36-
const { isDropdownOpen } = useDropdown(dropdownId);
40+
const { isDropdownOpen, closeDropdown } = useDropdown(dropdownId);
41+
42+
// Make sure dropdown closes on unmount.
43+
useEffect(() => {
44+
if (isDropdownOpen) {
45+
return () => closeDropdown();
46+
}
47+
}, [closeDropdown, isDropdownOpen]);
3748

3849
return (
3950
<MenuItem
@@ -55,6 +66,11 @@ export const LinksFieldMenuItem = ({
5566
clickableComponent={iconButton}
5667
dropdownComponents={
5768
<DropdownMenuItemsContainer>
69+
<MenuItem
70+
LeftIcon={IconBookmarkPlus}
71+
text="Set as Primary"
72+
onClick={onSetAsPrimary}
73+
/>
5874
<MenuItem
5975
accent="danger"
6076
LeftIcon={IconTrash}

packages/twenty-ui/src/display/icon/components/TablerIcons.ts

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export {
2020
IconBolt,
2121
IconBook2,
2222
IconBookmark,
23+
IconBookmarkPlus,
2324
IconBox,
2425
IconBrandGithub,
2526
IconBrandGoogle,

0 commit comments

Comments
 (0)