Fixed reset rating field to "no value" on star re-click (#6296)

### Description
Resolves Issue:  [https://github.com/twentyhq/twenty/issues/6224](#6224)

### Additional Consideration
I have changed the default start rating value from 1 star to no star
since clicking on the selected start was reverting the filed to 1 star
which didn't seem like the appropriate behaviour. Let me know if this
change is fine

---------

Co-authored-by: JosephAshwin23 <joseph.sanjivi@anywhere.co>
Co-authored-by: Thomas Trompette <thomas.trompette@sfr.fr>
This commit is contained in:
Ashmash100
2024-07-22 15:47:10 +05:30
committed by GitHub
parent 33fc4ff907
commit 52c6320f74
4 changed files with 31 additions and 11 deletions

View File

@ -7,7 +7,9 @@ import { FieldRatingValue } from '@/object-record/record-field/types/FieldMetada
import { RatingInput } from '@/ui/field/input/components/RatingInput'; import { RatingInput } from '@/ui/field/input/components/RatingInput';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
const convertFieldRatingValueToNumber = (rating: FieldRatingValue): string => { const convertFieldRatingValueToNumber = (
rating: Exclude<FieldRatingValue, null>,
): string => {
return rating.split('_')[1]; return rating.split('_')[1];
}; };
@ -51,6 +53,10 @@ export const ObjectFilterDropdownRatingInput = () => {
<RatingInput <RatingInput
value={selectedFilter?.value as FieldRatingValue} value={selectedFilter?.value as FieldRatingValue}
onChange={(newValue: FieldRatingValue) => { onChange={(newValue: FieldRatingValue) => {
if (!newValue) {
return;
}
selectFilter?.({ selectFilter?.({
id: selectedFilter?.id ? selectedFilter.id : v4(), id: selectedFilter?.id ? selectedFilter.id : v4(),
fieldMetadataId: filterDefinitionUsedInDropdown.fieldMetadataId, fieldMetadataId: filterDefinitionUsedInDropdown.fieldMetadataId,

View File

@ -16,14 +16,14 @@ export const useRatingField = () => {
const fieldName = fieldDefinition.metadata.fieldName; const fieldName = fieldDefinition.metadata.fieldName;
const [fieldValue, setFieldValue] = useRecoilState<FieldRatingValue | null>( const [fieldValue, setFieldValue] = useRecoilState<FieldRatingValue>(
recordStoreFamilySelector({ recordStoreFamilySelector({
recordId: entityId, recordId: entityId,
fieldName: fieldName, fieldName: fieldName,
}), }),
); );
const rating = fieldValue ?? 'RATING_1'; const rating = fieldValue ?? null;
return { return {
fieldDefinition, fieldDefinition,

View File

@ -185,7 +185,7 @@ export type FieldAddressValue = {
addressLat: number | null; addressLat: number | null;
addressLng: number | null; addressLng: number | null;
}; };
export type FieldRatingValue = (typeof RATING_VALUES)[number]; export type FieldRatingValue = (typeof RATING_VALUES)[number] | null;
export type FieldSelectValue = string | null; export type FieldSelectValue = string | null;
export type FieldMultiSelectValue = string[] | null; export type FieldMultiSelectValue = string[] | null;

View File

@ -1,7 +1,8 @@
import { useContext, useState } from 'react';
import { styled } from '@linaria/react'; import { styled } from '@linaria/react';
import { useContext, useState } from 'react';
import { IconTwentyStarFilled, THEME_COMMON, ThemeContext } from 'twenty-ui'; import { IconTwentyStarFilled, THEME_COMMON, ThemeContext } from 'twenty-ui';
import { useClearField } from '@/object-record/record-field/hooks/useClearField';
import { RATING_VALUES } from '@/object-record/record-field/meta-types/constants/RatingValues'; import { RATING_VALUES } from '@/object-record/record-field/meta-types/constants/RatingValues';
import { FieldRatingValue } from '@/object-record/record-field/types/FieldMetadata'; import { FieldRatingValue } from '@/object-record/record-field/types/FieldMetadata';
@ -31,16 +32,29 @@ export const RatingInput = ({
readonly, readonly,
}: RatingInputProps) => { }: RatingInputProps) => {
const { theme } = useContext(ThemeContext); const { theme } = useContext(ThemeContext);
const clearField = useClearField();
const activeColor = theme.font.color.secondary; const activeColor = theme.font.color.secondary;
const inactiveColor = theme.background.quaternary; const inactiveColor = theme.background.quaternary;
const [hoveredValue, setHoveredValue] = useState<FieldRatingValue | null>( const [hoveredValue, setHoveredValue] = useState<FieldRatingValue>(null);
null,
);
const currentValue = hoveredValue ?? value; const currentValue = hoveredValue ?? value;
const selectedIndex = RATING_VALUES.indexOf(currentValue); const selectedIndex =
currentValue !== null ? RATING_VALUES.indexOf(currentValue) : -1;
const canClick = !readonly;
const handleClick = (newValue: FieldRatingValue) => {
if (!canClick) return;
if (newValue === value) {
setHoveredValue(null);
clearField();
} else {
onChange?.(newValue);
}
};
return ( return (
<StyledContainer <StyledContainer
@ -48,7 +62,7 @@ export const RatingInput = ({
aria-label="Rating" aria-label="Rating"
aria-valuemax={RATING_VALUES.length} aria-valuemax={RATING_VALUES.length}
aria-valuemin={1} aria-valuemin={1}
aria-valuenow={RATING_VALUES.indexOf(currentValue) + 1} aria-valuenow={selectedIndex + 1}
tabIndex={0} tabIndex={0}
> >
{RATING_VALUES.map((value, index) => { {RATING_VALUES.map((value, index) => {
@ -58,7 +72,7 @@ export const RatingInput = ({
<StyledRatingIconContainer <StyledRatingIconContainer
key={index} key={index}
color={isActive ? activeColor : inactiveColor} color={isActive ? activeColor : inactiveColor}
onClick={readonly ? undefined : () => onChange?.(value)} onClick={() => handleClick(value)}
onMouseEnter={readonly ? undefined : () => setHoveredValue(value)} onMouseEnter={readonly ? undefined : () => setHoveredValue(value)}
onMouseLeave={readonly ? undefined : () => setHoveredValue(null)} onMouseLeave={readonly ? undefined : () => setHoveredValue(null)}
> >