@@ -156,9 +156,9 @@ const FakeCheckableMenuItemList = ({ hasAvatar }: { hasAvatar?: boolean }) => {
export const Empty: Story = {
render: (args) => (
-
+
-
+
),
};
@@ -179,60 +179,60 @@ export const WithContentBelow: Story = {
export const SimpleMenuItem: Story = {
...WithContentBelow,
render: (args) => (
-
-
+
+
{mockSelectArray.map(({ name }) => (
{name}
))}
-
-
+
+
),
};
export const WithHeaders: Story = {
...WithContentBelow,
render: (args) => (
-
+
Header
-
- Subheader 1
-
+
+ Subheader 1
+
{mockSelectArray.slice(0, 3).map(({ name }) => (
{name}
))}
-
-
- Subheader 2
-
+
+
+ Subheader 2
+
{mockSelectArray.slice(3).map(({ name }) => (
{name}
))}
-
-
+
+
),
};
export const WithIcons: Story = {
...WithContentBelow,
render: (args) => (
-
-
+
+
{mockSelectArray.map(({ name }) => (
{name}
))}
-
-
+
+
),
};
export const WithActions: Story = {
...WithContentBelow,
render: (args) => (
-
-
+
+
{mockSelectArray.map(({ name }, index) => (
))}
-
-
+
+
),
parameters: {
pseudo: { hover: ['.hover'] },
@@ -255,71 +255,71 @@ export const WithActions: Story = {
export const LoadingMenu: Story = {
...WithContentBelow,
render: () => (
-
+
-
-
+
+
-
-
+
+
),
};
export const Search: Story = {
...WithContentBelow,
render: (args) => (
-
+
-
-
+
+
{mockSelectArray.map(({ name }) => (
{name}
))}
-
-
+
+
),
};
export const SelectableMenuItem: Story = {
...WithContentBelow,
render: (args) => (
-
-
+
+
-
-
+
+
),
};
export const SelectableMenuItemWithAvatar: Story = {
...WithContentBelow,
render: (args) => (
-
-
+
+
-
-
+
+
),
};
export const CheckableMenuItem: Story = {
...WithContentBelow,
render: (args) => (
-
-
+
+
-
-
+
+
),
};
export const CheckableMenuItemWithAvatar: Story = {
...WithContentBelow,
render: (args) => (
-
-
+
+
-
-
+
+
),
};
diff --git a/front/src/modules/ui/dropdown/hooks/useDropdownButton.ts b/front/src/modules/ui/dropdown/hooks/useDropdownButton.ts
index e92f1f2eb..c921c3dbd 100644
--- a/front/src/modules/ui/dropdown/hooks/useDropdownButton.ts
+++ b/front/src/modules/ui/dropdown/hooks/useDropdownButton.ts
@@ -1,17 +1,27 @@
import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
-import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
-import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
+import { useRecoilScopedFamilyState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedFamilyState';
-import { isDropdownButtonOpenScopedState } from '../states/isDropdownButtonOpenScopedState';
+import { dropdownButtonCustomHotkeyScopeScopedFamilyState } from '../states/dropdownButtonCustomHotkeyScopeScopedFamilyState';
+import { isDropdownButtonOpenScopedFamilyState } from '../states/isDropdownButtonOpenScopedFamilyState';
+import { DropdownRecoilScopeContext } from '../states/recoil-scope-contexts/DropdownRecoilScopeContext';
-export function useDropdownButton() {
+export function useDropdownButton({ key }: { key: string }) {
const {
setHotkeyScopeAndMemorizePreviousScope,
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
- const [isDropdownButtonOpen, setIsDropdownButtonOpen] = useRecoilScopedState(
- isDropdownButtonOpenScopedState,
+ const [isDropdownButtonOpen, setIsDropdownButtonOpen] =
+ useRecoilScopedFamilyState(
+ isDropdownButtonOpenScopedFamilyState,
+ key,
+ DropdownRecoilScopeContext,
+ );
+
+ const [dropdownButtonCustomHotkeyScope] = useRecoilScopedFamilyState(
+ dropdownButtonCustomHotkeyScopeScopedFamilyState,
+ key,
+ DropdownRecoilScopeContext,
);
function closeDropdownButton() {
@@ -19,22 +29,22 @@ export function useDropdownButton() {
setIsDropdownButtonOpen(false);
}
- function openDropdownButton(hotkeyScopeToSet?: HotkeyScope) {
+ function openDropdownButton() {
setIsDropdownButtonOpen(true);
- if (hotkeyScopeToSet) {
+ if (dropdownButtonCustomHotkeyScope) {
setHotkeyScopeAndMemorizePreviousScope(
- hotkeyScopeToSet.scope,
- hotkeyScopeToSet.customScopes,
+ dropdownButtonCustomHotkeyScope.scope,
+ dropdownButtonCustomHotkeyScope.customScopes,
);
}
}
- function toggleDropdownButton(hotkeyScopeToSet?: HotkeyScope) {
+ function toggleDropdownButton() {
if (isDropdownButtonOpen) {
closeDropdownButton();
} else {
- openDropdownButton(hotkeyScopeToSet);
+ openDropdownButton();
}
}
diff --git a/front/src/modules/ui/dropdown/states/dropdownButtonCustomHotkeyScopeScopedFamilyState.ts b/front/src/modules/ui/dropdown/states/dropdownButtonCustomHotkeyScopeScopedFamilyState.ts
new file mode 100644
index 000000000..2e73d7f82
--- /dev/null
+++ b/front/src/modules/ui/dropdown/states/dropdownButtonCustomHotkeyScopeScopedFamilyState.ts
@@ -0,0 +1,11 @@
+import { atomFamily } from 'recoil';
+
+import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
+
+export const dropdownButtonCustomHotkeyScopeScopedFamilyState = atomFamily<
+ HotkeyScope | null | undefined,
+ string
+>({
+ key: 'dropdownButtonCustomHotkeyScopeScopedState',
+ default: null,
+});
diff --git a/front/src/modules/ui/dropdown/states/isDropdownButtonOpenScopedState.ts b/front/src/modules/ui/dropdown/states/isDropdownButtonOpenScopedFamilyState.ts
similarity index 53%
rename from front/src/modules/ui/dropdown/states/isDropdownButtonOpenScopedState.ts
rename to front/src/modules/ui/dropdown/states/isDropdownButtonOpenScopedFamilyState.ts
index a46b7befe..c81d0173f 100644
--- a/front/src/modules/ui/dropdown/states/isDropdownButtonOpenScopedState.ts
+++ b/front/src/modules/ui/dropdown/states/isDropdownButtonOpenScopedFamilyState.ts
@@ -1,6 +1,9 @@
import { atomFamily } from 'recoil';
-export const isDropdownButtonOpenScopedState = atomFamily
({
+export const isDropdownButtonOpenScopedFamilyState = atomFamily<
+ boolean,
+ string
+>({
key: 'isDropdownButtonOpenScopedState',
default: false,
});
diff --git a/front/src/modules/ui/dropdown/states/recoil-scope-contexts/DropdownRecoilScopeContext.ts b/front/src/modules/ui/dropdown/states/recoil-scope-contexts/DropdownRecoilScopeContext.ts
new file mode 100644
index 000000000..139778002
--- /dev/null
+++ b/front/src/modules/ui/dropdown/states/recoil-scope-contexts/DropdownRecoilScopeContext.ts
@@ -0,0 +1,3 @@
+import { createContext } from 'react';
+
+export const DropdownRecoilScopeContext = createContext(null);
diff --git a/front/src/modules/ui/filter-n-sort/components/DropdownMenuContainer.tsx b/front/src/modules/ui/filter-n-sort/components/DropdownMenuContainer.tsx
index 336aca561..fa5df064f 100644
--- a/front/src/modules/ui/filter-n-sort/components/DropdownMenuContainer.tsx
+++ b/front/src/modules/ui/filter-n-sort/components/DropdownMenuContainer.tsx
@@ -1,7 +1,7 @@
import { type HTMLAttributes, useRef } from 'react';
import styled from '@emotion/styled';
-import { DropdownMenu } from '@/ui/dropdown/components/DropdownMenu';
+import { StyledDropdownMenu } from '@/ui/dropdown/components/StyledDropdownMenu';
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
const StyledDropdownMenuContainer = styled.ul<{
@@ -38,7 +38,7 @@ export function DropdownMenuContainer({
return (
- {children}
+ {children}
);
}
diff --git a/front/src/modules/ui/filter-n-sort/components/FilterDropdownEntitySelect.tsx b/front/src/modules/ui/filter-n-sort/components/FilterDropdownEntitySelect.tsx
index 3a686e368..0095e3d02 100644
--- a/front/src/modules/ui/filter-n-sort/components/FilterDropdownEntitySelect.tsx
+++ b/front/src/modules/ui/filter-n-sort/components/FilterDropdownEntitySelect.tsx
@@ -1,6 +1,6 @@
import { Context } from 'react';
-import { DropdownMenuSeparator } from '@/ui/dropdown/components/DropdownMenuSeparator';
+import { StyledDropdownMenuSeparator } from '@/ui/dropdown/components/StyledDropdownMenuSeparator';
import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
@@ -22,7 +22,7 @@ export function FilterDropdownEntitySelect({
return (
<>
-
+
{filterDefinitionUsedInDropdown.entitySelectComponent}
diff --git a/front/src/modules/ui/filter-n-sort/components/FilterDropdownFilterSelect.tsx b/front/src/modules/ui/filter-n-sort/components/FilterDropdownFilterSelect.tsx
index 00b8f6d13..1b310875e 100644
--- a/front/src/modules/ui/filter-n-sort/components/FilterDropdownFilterSelect.tsx
+++ b/front/src/modules/ui/filter-n-sort/components/FilterDropdownFilterSelect.tsx
@@ -1,7 +1,7 @@
import { Context } from 'react';
-import { DropdownMenuItemsContainer } from '@/ui/dropdown/components/DropdownMenuItemsContainer';
import { DropdownMenuSelectableItem } from '@/ui/dropdown/components/DropdownMenuSelectableItem';
+import { StyledDropdownMenuItemsContainer } from '@/ui/dropdown/components/StyledDropdownMenuItemsContainer';
import { RelationPickerHotkeyScope } from '@/ui/input/relation-picker/types/RelationPickerHotkeyScope';
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
@@ -41,7 +41,7 @@ export function FilterDropdownFilterSelect({
const setHotkeyScope = useSetHotkeyScope();
return (
-
+
{availableFilters.map((availableFilter, index) => (
))}
-
+
);
}
diff --git a/front/src/modules/ui/filter-n-sort/components/FilterDropdownOperandSelect.tsx b/front/src/modules/ui/filter-n-sort/components/FilterDropdownOperandSelect.tsx
index cdb6bc0bd..2a234c79f 100644
--- a/front/src/modules/ui/filter-n-sort/components/FilterDropdownOperandSelect.tsx
+++ b/front/src/modules/ui/filter-n-sort/components/FilterDropdownOperandSelect.tsx
@@ -1,7 +1,7 @@
import { Context } from 'react';
import { DropdownMenuItem } from '@/ui/dropdown/components/DropdownMenuItem';
-import { DropdownMenuItemsContainer } from '@/ui/dropdown/components/DropdownMenuItemsContainer';
+import { StyledDropdownMenuItemsContainer } from '@/ui/dropdown/components/StyledDropdownMenuItemsContainer';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
import { useFilterCurrentlyEdited } from '../hooks/useFilterCurrentlyEdited';
@@ -62,7 +62,7 @@ export function FilterDropdownOperandSelect({
}
return (
-
+
{operandsForFilterType.map((filterOperand, index) => (
))}
-
+
);
}
diff --git a/front/src/modules/ui/filter-n-sort/components/MultipleFiltersDropdownButton.tsx b/front/src/modules/ui/filter-n-sort/components/MultipleFiltersDropdownButton.tsx
index cc2ff24f8..dd60a11bd 100644
--- a/front/src/modules/ui/filter-n-sort/components/MultipleFiltersDropdownButton.tsx
+++ b/front/src/modules/ui/filter-n-sort/components/MultipleFiltersDropdownButton.tsx
@@ -1,6 +1,6 @@
import { Context, useCallback, useState } from 'react';
-import { DropdownMenuSeparator } from '@/ui/dropdown/components/DropdownMenuSeparator';
+import { StyledDropdownMenuSeparator } from '@/ui/dropdown/components/StyledDropdownMenuSeparator';
import { filterDefinitionUsedInDropdownScopedState } from '@/ui/filter-n-sort/states/filterDefinitionUsedInDropdownScopedState';
import { filterDropdownSearchInputScopedState } from '@/ui/filter-n-sort/states/filterDropdownSearchInputScopedState';
import { filtersScopedState } from '@/ui/filter-n-sort/states/filtersScopedState';
@@ -119,7 +119,7 @@ export function MultipleFiltersDropdownButton({
selectedOperandInDropdown && (
<>
-
+
{filterDefinitionUsedInDropdown.type === 'text' && (
)}
diff --git a/front/src/modules/ui/filter-n-sort/components/SingleEntityFilterDropdownButton.tsx b/front/src/modules/ui/filter-n-sort/components/SingleEntityFilterDropdownButton.tsx
index a31dbf994..a7f35d22b 100644
--- a/front/src/modules/ui/filter-n-sort/components/SingleEntityFilterDropdownButton.tsx
+++ b/front/src/modules/ui/filter-n-sort/components/SingleEntityFilterDropdownButton.tsx
@@ -10,6 +10,7 @@ import { selectedOperandInDropdownScopedState } from '@/ui/filter-n-sort/states/
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
+import { StyledHeaderDropdownButton } from '../../dropdown/components/StyledHeaderDropdownButton';
import { availableFiltersScopedState } from '../states/availableFiltersScopedState';
import { filtersScopedState } from '../states/filtersScopedState';
import { FiltersHotkeyScope } from '../types/FiltersHotkeyScope';
@@ -27,29 +28,6 @@ const StyledDropdownButtonContainer = styled.div`
z-index: 1;
`;
-type StyledDropdownButtonProps = {
- isUnfolded: boolean;
-};
-
-const StyledDropdownButton = styled.div`
- align-items: center;
- background: ${({ theme }) => theme.background.primary};
- border-radius: ${({ theme }) => theme.border.radius.sm};
- cursor: pointer;
- display: flex;
-
- filter: ${(props) => (props.isUnfolded ? 'brightness(0.95)' : 'none')};
- padding: ${({ theme }) => theme.spacing(1)};
-
- padding-left: ${({ theme }) => theme.spacing(2)};
- padding-right: ${({ theme }) => theme.spacing(2)};
-
- &:hover {
- filter: brightness(0.95);
- }
- user-select: none;
-`;
-
export function SingleEntityFilterDropdownButton({
context,
HotkeyScope,
@@ -109,7 +87,7 @@ export function SingleEntityFilterDropdownButton({
return (
- handleIsUnfoldedChange(!isUnfolded)}
>
@@ -119,7 +97,7 @@ export function SingleEntityFilterDropdownButton({
'Filter'
)}
-
+
{isUnfolded && (
handleIsUnfoldedChange(false)}>
diff --git a/front/src/modules/ui/filter-n-sort/components/SortDropdownButton.tsx b/front/src/modules/ui/filter-n-sort/components/SortDropdownButton.tsx
index 2eeea865b..f7580bd9b 100644
--- a/front/src/modules/ui/filter-n-sort/components/SortDropdownButton.tsx
+++ b/front/src/modules/ui/filter-n-sort/components/SortDropdownButton.tsx
@@ -3,9 +3,9 @@ import { useTheme } from '@emotion/react';
import { IconChevronDown } from '@tabler/icons-react';
import { DropdownMenuHeader } from '@/ui/dropdown/components/DropdownMenuHeader';
-import { DropdownMenuItemsContainer } from '@/ui/dropdown/components/DropdownMenuItemsContainer';
import { DropdownMenuSelectableItem } from '@/ui/dropdown/components/DropdownMenuSelectableItem';
-import { DropdownMenuSeparator } from '@/ui/dropdown/components/DropdownMenuSeparator';
+import { StyledDropdownMenuItemsContainer } from '@/ui/dropdown/components/StyledDropdownMenuItemsContainer';
+import { StyledDropdownMenuSeparator } from '@/ui/dropdown/components/StyledDropdownMenuSeparator';
import { OverflowingTextWithTooltip } from '@/ui/tooltip/OverflowingTextWithTooltip';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
@@ -81,7 +81,7 @@ export function SortDropdownButton({
HotkeyScope={HotkeyScope}
>
{isOptionUnfolded ? (
-
+
{options.map((option, index) => (
({
{option === 'asc' ? 'Ascending' : 'Descending'}
))}
-
+
) : (
<>
({
>
{selectedSortDirection === 'asc' ? 'Ascending' : 'Descending'}
-
+
-
+
{availableSorts.map((sort, index) => (
({
))}
-
+
>
)}
diff --git a/front/src/modules/ui/input/relation-picker/components/MultipleEntitySelect.tsx b/front/src/modules/ui/input/relation-picker/components/MultipleEntitySelect.tsx
index 13482a38f..943d6ee3a 100644
--- a/front/src/modules/ui/input/relation-picker/components/MultipleEntitySelect.tsx
+++ b/front/src/modules/ui/input/relation-picker/components/MultipleEntitySelect.tsx
@@ -1,12 +1,12 @@
import { useRef } from 'react';
import debounce from 'lodash.debounce';
-import { DropdownMenu } from '@/ui/dropdown/components/DropdownMenu';
import { DropdownMenuCheckableItem } from '@/ui/dropdown/components/DropdownMenuCheckableItem';
import { DropdownMenuInput } from '@/ui/dropdown/components/DropdownMenuInput';
import { DropdownMenuItem } from '@/ui/dropdown/components/DropdownMenuItem';
-import { DropdownMenuItemsContainer } from '@/ui/dropdown/components/DropdownMenuItemsContainer';
-import { DropdownMenuSeparator } from '@/ui/dropdown/components/DropdownMenuSeparator';
+import { StyledDropdownMenu } from '@/ui/dropdown/components/StyledDropdownMenu';
+import { StyledDropdownMenuItemsContainer } from '@/ui/dropdown/components/StyledDropdownMenuItemsContainer';
+import { StyledDropdownMenuSeparator } from '@/ui/dropdown/components/StyledDropdownMenuSeparator';
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
import { Avatar } from '@/users/components/Avatar';
import { isNonEmptyString } from '~/utils/isNonEmptyString';
@@ -72,14 +72,14 @@ export function MultipleEntitySelect<
});
return (
-
+
-
-
+
+
{entitiesInDropdown?.map((entity) => (
No result
)}
-
-
+
+
);
}
diff --git a/front/src/modules/ui/input/relation-picker/components/SingleEntitySelect.tsx b/front/src/modules/ui/input/relation-picker/components/SingleEntitySelect.tsx
index 21324bb46..93f5fb9be 100644
--- a/front/src/modules/ui/input/relation-picker/components/SingleEntitySelect.tsx
+++ b/front/src/modules/ui/input/relation-picker/components/SingleEntitySelect.tsx
@@ -1,11 +1,11 @@
import { useRef } from 'react';
import { useTheme } from '@emotion/react';
-import { DropdownMenu } from '@/ui/dropdown/components/DropdownMenu';
import { DropdownMenuInput } from '@/ui/dropdown/components/DropdownMenuInput';
import { DropdownMenuItem } from '@/ui/dropdown/components/DropdownMenuItem';
-import { DropdownMenuItemsContainer } from '@/ui/dropdown/components/DropdownMenuItemsContainer';
-import { DropdownMenuSeparator } from '@/ui/dropdown/components/DropdownMenuSeparator';
+import { StyledDropdownMenu } from '@/ui/dropdown/components/StyledDropdownMenu';
+import { StyledDropdownMenuItemsContainer } from '@/ui/dropdown/components/StyledDropdownMenuItemsContainer';
+import { StyledDropdownMenuSeparator } from '@/ui/dropdown/components/StyledDropdownMenuSeparator';
import { IconPlus } from '@/ui/icon';
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
import { isDefined } from '~/utils/isDefined';
@@ -55,7 +55,7 @@ export function SingleEntitySelect<
});
return (
-
-
+
{showCreateButton && (
<>
-
+
Add New
-
-
+
+
>
)}
-
+
);
}
diff --git a/front/src/modules/ui/input/relation-picker/components/SingleEntitySelectBase.tsx b/front/src/modules/ui/input/relation-picker/components/SingleEntitySelectBase.tsx
index 16ecabe3c..784d47a20 100644
--- a/front/src/modules/ui/input/relation-picker/components/SingleEntitySelectBase.tsx
+++ b/front/src/modules/ui/input/relation-picker/components/SingleEntitySelectBase.tsx
@@ -2,8 +2,8 @@ import { useRef } from 'react';
import { Key } from 'ts-key-enum';
import { DropdownMenuItem } from '@/ui/dropdown/components/DropdownMenuItem';
-import { DropdownMenuItemsContainer } from '@/ui/dropdown/components/DropdownMenuItemsContainer';
import { DropdownMenuSelectableItem } from '@/ui/dropdown/components/DropdownMenuSelectableItem';
+import { StyledDropdownMenuItemsContainer } from '@/ui/dropdown/components/StyledDropdownMenuItemsContainer';
import { OverflowingTextWithTooltip } from '@/ui/tooltip/OverflowingTextWithTooltip';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { Avatar } from '@/users/components/Avatar';
@@ -73,7 +73,7 @@ export function SingleEntitySelectBase<
);
return (
-
+
{entities.loading ? (
) : entitiesInDropdown.length === 0 ? (
@@ -97,6 +97,6 @@ export function SingleEntitySelectBase<
))
)}
-
+
);
}
diff --git a/front/src/modules/ui/input/text/components/TextInputDisplay.tsx b/front/src/modules/ui/input/text/components/TextInputDisplay.tsx
index 010f45fa0..a88132d55 100644
--- a/front/src/modules/ui/input/text/components/TextInputDisplay.tsx
+++ b/front/src/modules/ui/input/text/components/TextInputDisplay.tsx
@@ -1,9 +1,16 @@
-/* eslint-disable twenty/styled-components-prefixed-with-styled */
import styled from '@emotion/styled';
-export const TextInputDisplay = styled.div`
+const StyledTextInputDisplay = styled.div`
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 100%;
`;
+
+export type TextInputDisplayProps = {
+ children: React.ReactNode;
+};
+
+export function TextInputDisplay({ children }: TextInputDisplayProps) {
+ return {children};
+}
diff --git a/front/src/modules/ui/layout/components/ShowPageContainer.tsx b/front/src/modules/ui/layout/components/ShowPageContainer.tsx
index 4260a9832..61b2b29ba 100644
--- a/front/src/modules/ui/layout/components/ShowPageContainer.tsx
+++ b/front/src/modules/ui/layout/components/ShowPageContainer.tsx
@@ -1,9 +1,9 @@
-/* eslint-disable twenty/styled-components-prefixed-with-styled */
+import { ReactElement } from 'react';
import styled from '@emotion/styled';
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
-export const ShowPageContainer = styled.div`
+export const StyledShowPageContainer = styled.div`
display: flex;
flex-direction: ${() => (useIsMobile() ? 'column' : 'row')};
gap: ${({ theme }) => (useIsMobile() ? theme.spacing(3) : '0')};
@@ -11,3 +11,11 @@ export const ShowPageContainer = styled.div`
overflow-x: ${() => (useIsMobile() ? 'hidden' : 'auto')};
width: ${() => (useIsMobile() ? `calc(100% - 2px);` : '100%')};
`;
+
+export type ShowPageContainerProps = {
+ children: ReactElement[];
+};
+
+export function ShowPageContainer({ children }: ShowPageContainerProps) {
+ return {children} ;
+}
diff --git a/front/src/modules/ui/layout/show-page/components/ShowPageLeftContainer.tsx b/front/src/modules/ui/layout/show-page/components/ShowPageLeftContainer.tsx
index ca4add4b9..1941a01f8 100644
--- a/front/src/modules/ui/layout/show-page/components/ShowPageLeftContainer.tsx
+++ b/front/src/modules/ui/layout/show-page/components/ShowPageLeftContainer.tsx
@@ -1,9 +1,9 @@
-/* eslint-disable twenty/styled-components-prefixed-with-styled */
+import { ReactElement } from 'react';
import styled from '@emotion/styled';
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
-export const ShowPageLeftContainer = styled.div`
+const StyledShowPageLeftContainer = styled.div`
background: ${({ theme }) => theme.background.secondary};
border-bottom-left-radius: 8px;
border-right: 1px solid
@@ -24,3 +24,13 @@ export const ShowPageLeftContainer = styled.div`
z-index: 10;
`;
+
+export type ShowPageLeftContainerProps = {
+ children: ReactElement[];
+};
+
+export function ShowPageLeftContainer({
+ children,
+}: ShowPageLeftContainerProps) {
+ return {children} ;
+}
diff --git a/front/src/modules/ui/layout/show-page/components/ShowPageRightContainer.tsx b/front/src/modules/ui/layout/show-page/components/ShowPageRightContainer.tsx
index 18eff5d62..e619d49b9 100644
--- a/front/src/modules/ui/layout/show-page/components/ShowPageRightContainer.tsx
+++ b/front/src/modules/ui/layout/show-page/components/ShowPageRightContainer.tsx
@@ -1,9 +1,9 @@
-/* eslint-disable twenty/styled-components-prefixed-with-styled */
+import { ReactElement } from 'react';
import styled from '@emotion/styled';
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
-export const ShowPageRightContainer = styled.div`
+export const StyledShowPageRightContainer = styled.div`
display: flex;
flex: 1 0 0;
flex-direction: column;
@@ -15,3 +15,15 @@ export const ShowPageRightContainer = styled.div`
return isMobile ? `calc(100% - ${theme.spacing(6)})` : 'auto';
}};
`;
+
+export type ShowPageRightContainerProps = {
+ children: ReactElement;
+};
+
+export function ShowPageRightContainer({
+ children,
+}: ShowPageRightContainerProps) {
+ return (
+ {children}
+ );
+}
diff --git a/front/src/modules/ui/table/components/EntityTableColumnMenu.tsx b/front/src/modules/ui/table/components/EntityTableColumnMenu.tsx
index 770789b65..cf5fb87c6 100644
--- a/front/src/modules/ui/table/components/EntityTableColumnMenu.tsx
+++ b/front/src/modules/ui/table/components/EntityTableColumnMenu.tsx
@@ -4,15 +4,15 @@ import styled from '@emotion/styled';
import { useRecoilValue } from 'recoil';
import { IconButton } from '@/ui/button/components/IconButton';
-import { DropdownMenu } from '@/ui/dropdown/components/DropdownMenu';
import { DropdownMenuItem } from '@/ui/dropdown/components/DropdownMenuItem';
-import { DropdownMenuItemsContainer } from '@/ui/dropdown/components/DropdownMenuItemsContainer';
+import { StyledDropdownMenu } from '@/ui/dropdown/components/StyledDropdownMenu';
+import { StyledDropdownMenuItemsContainer } from '@/ui/dropdown/components/StyledDropdownMenuItemsContainer';
import { IconPlus } from '@/ui/icon';
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
import { hiddenTableColumnsState } from '../states/tableColumnsState';
-const StyledColumnMenu = styled(DropdownMenu)`
+const StyledColumnMenu = styled(StyledDropdownMenu)`
font-weight: ${({ theme }) => theme.font.weight.regular};
`;
@@ -38,7 +38,7 @@ export const EntityTableColumnMenu = ({
return (
-
+
{hiddenColumns.map((column) => (
))}
-
+
);
};
diff --git a/front/src/modules/ui/table/options/components/TableOptionsDropdown.tsx b/front/src/modules/ui/table/options/components/TableOptionsDropdown.tsx
new file mode 100644
index 000000000..361443317
--- /dev/null
+++ b/front/src/modules/ui/table/options/components/TableOptionsDropdown.tsx
@@ -0,0 +1,40 @@
+import { DropdownButton } from '@/ui/dropdown/components/DropdownButton';
+import type {
+ ViewFieldDefinition,
+ ViewFieldMetadata,
+} from '@/ui/editable-field/types/ViewField';
+import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
+
+import { type TableView } from '../../states/tableViewsState';
+
+import { TableOptionsDropdownButton } from './TableOptionsDropdownButton';
+import { TableOptionsDropdownContent } from './TableOptionsDropdownContent';
+
+type TableOptionsDropdownProps = {
+ onColumnsChange?: (columns: ViewFieldDefinition[]) => void;
+ onViewsChange?: (views: TableView[]) => void;
+ onImport?: () => void;
+ customHotkeyScope: HotkeyScope;
+};
+
+export function TableOptionsDropdown({
+ onColumnsChange,
+ onViewsChange,
+ onImport,
+ customHotkeyScope,
+}: TableOptionsDropdownProps) {
+ return (
+ }
+ dropdownHotkeyScope={customHotkeyScope}
+ dropdownKey="options"
+ dropdownComponents={
+
+ }
+ />
+ );
+}
diff --git a/front/src/modules/ui/table/options/components/TableOptionsDropdownButton.tsx b/front/src/modules/ui/table/options/components/TableOptionsDropdownButton.tsx
index 59b519508..9e4094b97 100644
--- a/front/src/modules/ui/table/options/components/TableOptionsDropdownButton.tsx
+++ b/front/src/modules/ui/table/options/components/TableOptionsDropdownButton.tsx
@@ -1,273 +1,17 @@
-import {
- type FormEvent,
- useCallback,
- useEffect,
- useRef,
- useState,
-} from 'react';
-import { useTheme } from '@emotion/react';
-import { useRecoilState, useRecoilValue } from 'recoil';
-import { v4 } from 'uuid';
+import { StyledHeaderDropdownButton } from '@/ui/dropdown/components/StyledHeaderDropdownButton';
+import { useDropdownButton } from '@/ui/dropdown/hooks/useDropdownButton';
-import { IconButton } from '@/ui/button/components/IconButton';
-import { DropdownMenuHeader } from '@/ui/dropdown/components/DropdownMenuHeader';
-import { DropdownMenuInput } from '@/ui/dropdown/components/DropdownMenuInput';
-import { DropdownMenuItem } from '@/ui/dropdown/components/DropdownMenuItem';
-import { DropdownMenuItemsContainer } from '@/ui/dropdown/components/DropdownMenuItemsContainer';
-import { DropdownMenuSeparator } from '@/ui/dropdown/components/DropdownMenuSeparator';
-import type {
- ViewFieldDefinition,
- ViewFieldMetadata,
-} from '@/ui/editable-field/types/ViewField';
-import DropdownButton from '@/ui/filter-n-sort/components/DropdownButton';
-import {
- IconChevronLeft,
- IconFileImport,
- IconMinus,
- IconPlus,
- IconTag,
-} from '@/ui/icon';
-import {
- hiddenTableColumnsState,
- tableColumnsState,
- visibleTableColumnsState,
-} from '@/ui/table/states/tableColumnsState';
-import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
-import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
-import { useRecoilScopedValue } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedValue';
-
-import { TableRecoilScopeContext } from '../../states/recoil-scope-contexts/TableRecoilScopeContext';
-import {
- type TableView,
- tableViewEditModeState,
- tableViewsByIdState,
- tableViewsState,
-} from '../../states/tableViewsState';
-import { TableOptionsHotkeyScope } from '../../types/TableOptionsHotkeyScope';
-
-import { TableOptionsDropdownSection } from './TableOptionsDropdownSection';
-
-type TableOptionsDropdownButtonProps = {
- onColumnsChange?: (columns: ViewFieldDefinition[]) => void;
- onViewsChange?: (views: TableView[]) => void;
- onImport?: () => void;
- HotkeyScope: TableOptionsHotkeyScope;
-};
-
-enum Option {
- Properties = 'Properties',
-}
-
-export const TableOptionsDropdownButton = ({
- onColumnsChange,
- onViewsChange,
- onImport,
- HotkeyScope,
-}: TableOptionsDropdownButtonProps) => {
- const theme = useTheme();
-
- const [isUnfolded, setIsUnfolded] = useState(false);
- const [selectedOption, setSelectedOption] = useState