Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds KeyBoard Navigation to ObjectFilterDropDownFilterSelect ( #4365 ) #6613

Merged
merged 23 commits into from
Sep 6, 2024
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
898a0e1
made filter-dropdown-navigable
Faisal-imtiyaz123 Aug 11, 2024
eb718c4
Merge branch '4365' of https://github.com/Faisal-imtiyaz123/twenty in…
Faisal-imtiyaz123 Aug 17, 2024
d65e820
enables keyboard naviagtio on ObjectFilterDropDownFilterSelect
Faisal-imtiyaz123 Aug 20, 2024
7d6041b
Merge branch 'main' of https://github.com/twentyhq/twenty into 4365-new
Faisal-imtiyaz123 Aug 20, 2024
3308f54
enables keyboard navigation for objectFilterDropDownFilter
Faisal-imtiyaz123 Aug 21, 2024
32ffbd5
Merge branch 'twentyhq:main' into 4365
Faisal-imtiyaz123 Aug 21, 2024
70d0402
Merge branch '4365-new' into 4365
Faisal-imtiyaz123 Aug 21, 2024
e2cdb1e
removes hovered from MenuItem
Faisal-imtiyaz123 Aug 21, 2024
31f0025
re-enables disabled typechecker
Faisal-imtiyaz123 Aug 21, 2024
73de0f2
Merge branch 'main' into 4365
lucasbordeau Aug 23, 2024
8702335
Fixed hook
lucasbordeau Aug 23, 2024
1972890
Merge branch 'main' of https://github.com/twentyhq/twenty into 4365
Faisal-imtiyaz123 Aug 23, 2024
04dac07
Found clean pattern
lucasbordeau Aug 26, 2024
4401cb8
Removed unused hook
lucasbordeau Aug 26, 2024
d6e65a7
Merge branch 'twentyhq:main' into 4365
Faisal-imtiyaz123 Aug 28, 2024
166bb47
Merge branch '4365' of https://github.com/Faisal-imtiyaz123/twenty in…
Faisal-imtiyaz123 Aug 28, 2024
42ec199
resets selectedListItem position in keyboardNavigation on close
Faisal-imtiyaz123 Aug 28, 2024
e7bf94d
fixes bug with resetting position
Faisal-imtiyaz123 Aug 28, 2024
dcf84f5
adds onEnter to ObjectFilterDropDownMenuItem
Faisal-imtiyaz123 Sep 2, 2024
a8b1a82
removes unnecessary imports from ObjectFilterDropDownMenuItem
Faisal-imtiyaz123 Sep 2, 2024
9556ca8
Merge branch 'main' into 4365
lucasbordeau Sep 6, 2024
9c14b9d
Fixed vite
lucasbordeau Sep 6, 2024
87eea27
Refactor
lucasbordeau Sep 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import { useState } from 'react';
import styled from '@emotion/styled';
import { useState } from 'react';
import { useRecoilValue } from 'recoil';
import { useIcons } from 'twenty-ui';

import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';

import { getOperandsForFilterType } from '../utils/getOperandsForFilterType';
import { ObjectFilterDropdownFilterSelectMenuItem } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem';
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';

export const StyledInput = styled.input`
background: transparent;
Expand Down Expand Up @@ -39,20 +38,18 @@ export const StyledInput = styled.input`

export const ObjectFilterDropdownFilterSelect = () => {
const [searchText, setSearchText] = useState('');
const {
setFilterDefinitionUsedInDropdown,
setSelectedOperandInDropdown,
setObjectFilterDropdownSearchInput,
availableFilterDefinitionsState,
} = useFilterDropdown();

const { availableFilterDefinitionsState } = useFilterDropdown();

const availableFilterDefinitions = useRecoilValue(
availableFilterDefinitionsState,
);

const { getIcon } = useIcons();

const setHotkeyScope = useSetHotkeyScope();
const sortedAvailableFilterDefinitions = [...availableFilterDefinitions]
.sort((a, b) => a.label.localeCompare(b.label))
.filter((item) =>
item.label.toLocaleLowerCase().includes(searchText.toLocaleLowerCase()),
);

return (
<>
Expand All @@ -64,39 +61,24 @@ export const ObjectFilterDropdownFilterSelect = () => {
setSearchText(event.target.value)
}
/>
<DropdownMenuItemsContainer>
{[...availableFilterDefinitions]
.sort((a, b) => a.label.localeCompare(b.label))
.filter((item) =>
item.label
.toLocaleLowerCase()
.includes(searchText.toLocaleLowerCase()),
)
.map((availableFilterDefinition, index) => (
<MenuItem
key={`select-filter-${index}`}
testId={`select-filter-${index}`}
onClick={() => {
setFilterDefinitionUsedInDropdown(availableFilterDefinition);

if (
availableFilterDefinition.type === 'RELATION' ||
availableFilterDefinition.type === 'SELECT'
) {
setHotkeyScope(RelationPickerHotkeyScope.RelationPicker);
}

setSelectedOperandInDropdown(
getOperandsForFilterType(availableFilterDefinition.type)?.[0],
);

setObjectFilterDropdownSearchInput('');
}}
LeftIcon={getIcon(availableFilterDefinition.iconName)}
text={availableFilterDefinition.label}
/>
))}
</DropdownMenuItemsContainer>
<SelectableList
hotkeyScope={FiltersHotkeyScope.ObjectFilterDropdownButton}
selectableItemIdArray={sortedAvailableFilterDefinitions.map(
(item) => item.fieldMetadataId,
)}
selectableListId={OBJECT_FILTER_DROPDOWN_ID}
>
<DropdownMenuItemsContainer>
{sortedAvailableFilterDefinitions.map(
(availableFilterDefinition, index) => (
<ObjectFilterDropdownFilterSelectMenuItem
key={`select-filter-${index}`}
filterDefinition={availableFilterDefinition}
/>
),
)}
</DropdownMenuItemsContainer>
</SelectableList>
</>
);
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had to test multiple patterns and this one seems like the best for now.

Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown';
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
import { getOperandsForFilterType } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType';
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
import { MenuItemSelect } from '@/ui/navigation/menu-item/components/MenuItemSelect';
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
import { useRecoilValue } from 'recoil';
import { useIcons } from 'twenty-ui';

export type ObjectFilterDropdownFilterSelectMenuItemProps = {
filterDefinition: FilterDefinition;
};

export const ObjectFilterDropdownFilterSelectMenuItem = ({
filterDefinition,
}: ObjectFilterDropdownFilterSelectMenuItemProps) => {
const {
setFilterDefinitionUsedInDropdown,
setSelectedOperandInDropdown,
setObjectFilterDropdownSearchInput,
} = useFilterDropdown();

const { isSelectedItemIdSelector } = useSelectableList(
OBJECT_FILTER_DROPDOWN_ID,
);

const isSelectedItem = useRecoilValue(
isSelectedItemIdSelector(filterDefinition.fieldMetadataId),
);

const { getIcon } = useIcons();

const setHotkeyScope = useSetHotkeyScope();

const handleClick = () => {
setFilterDefinitionUsedInDropdown(filterDefinition);

if (
filterDefinition.type === 'RELATION' ||
filterDefinition.type === 'SELECT'
) {
setHotkeyScope(RelationPickerHotkeyScope.RelationPicker);
}

setSelectedOperandInDropdown(
getOperandsForFilterType(filterDefinition.type)?.[0],
);

setObjectFilterDropdownSearchInput('');
};

return (
<MenuItemSelect
selected={false}
hovered={isSelectedItem}
onClick={handleClick}
LeftIcon={getIcon(filterDefinition.iconName)}
text={filterDefinition.label}
/>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ export const SelectableMenuItemSelect = ({
);

const isSelectedItemId = useRecoilValue(isSelectedItemIdSelector(entity.id));

return (
<StyledSelectableItem itemId={entity.id} key={entity.id}>
<MenuItemSelectAvatar
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ export type MenuItemBaseProps = {
accent?: MenuItemAccent;
isKeySelected?: boolean;
isHoverBackgroundDisabled?: boolean;
hovered?:boolean;
};

export const StyledMenuItemBase = styled.div<MenuItemBaseProps>`
--horizontal-padding: ${({ theme }) => theme.spacing(1)};
--vertical-padding: ${({ theme }) => theme.spacing(2)};

align-items: center;

border-radius: ${({ theme }) => theme.border.radius.sm};
Expand Down
Loading