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:
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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)}
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user