fix: simplify input field handling in InputListComponent (#5255)

* 🔧 (index.tsx): Remove unnecessary conditional rendering for addNewInput button and simplify the logic for onClick event handler to improve code readability and maintainability.

*  (button-input-list.tsx): Add a new component ButtonInputList to handle button input list functionality in the frontend
📝 (get-class-name.ts): Create a helper function getButtonClassName to generate button class names based on disabled state
📝 (get-test-id.ts): Create a helper function getTestId to generate unique test ids for input list buttons
🔄 (index.tsx): Refactor InputListComponent to use the new ButtonInputList component for handling button input list functionality in the frontend
This commit is contained in:
Cristhian Zanforlin Lousa 2024-12-13 19:06:47 -03:00 committed by GitHub
commit 32a0707f9f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 111 additions and 87 deletions

View file

@ -896,6 +896,7 @@
},
"node_modules/@clack/prompts/node_modules/is-unicode-supported": {
"version": "1.3.0",
"extraneous": true,
"inBundle": true,
"license": "MIT",
"engines": {

View file

@ -0,0 +1,77 @@
import IconComponent from "@/components/common/genericIconComponent";
import { Button } from "@/components/ui/button";
import { ICON_STROKE_WIDTH } from "@/constants/constants";
import { cn } from "@/utils/utils";
import { getButtonClassName } from "../helpers/get-class-name";
import { getTestId } from "../helpers/get-test-id";
export const ButtonInputList = ({
index,
value,
addNewInput,
removeInput,
disabled,
editNode,
addIcon,
componentName,
}: {
index: number;
value: string[];
addNewInput: (e) => void;
removeInput: (index: number, e: React.MouseEvent<HTMLDivElement>) => void;
disabled: boolean;
editNode: boolean;
addIcon: boolean;
componentName: string;
}) => {
return (
<>
<div
onClick={
(index === 0 && value.length <= 1) || addIcon
? addNewInput
: (e) => removeInput(index, e)
}
className={cn(
"hit-area-icon group flex items-center justify-center text-center",
disabled
? "pointer-events-none bg-background hover:bg-background"
: "",
(index === 0 && value.length <= 1) || addIcon
? "bg-background hover:bg-muted"
: "hover:bg-smooth-red",
)}
>
<Button
unstyled
size="icon"
className={cn(
"hit-area-icon flex items-center justify-center",
getButtonClassName(disabled),
)}
data-testid={getTestId(
(index === 0 && value.length <= 1) || addIcon ? "plus" : "minus",
index,
editNode,
componentName,
)}
disabled={disabled}
>
<IconComponent
name={
(index === 0 && value.length <= 1) || addIcon ? "Plus" : "Trash2"
}
className={cn(
"icon-size justify-self-center text-muted-foreground",
!disabled && "hover:cursor-pointer hover:text-foreground",
(index === 0 && value.length <= 1) || addIcon
? "group-hover:text-foreground"
: "group-hover:text-destructive",
)}
strokeWidth={ICON_STROKE_WIDTH}
/>
</Button>
</div>
</>
);
};

View file

@ -0,0 +1,4 @@
import { classNames } from "@/utils/utils";
export const getButtonClassName = (disabled: boolean) =>
classNames(disabled ? "text-hard-zinc" : "text-placeholder-foreground");

View file

@ -0,0 +1,7 @@
export const getTestId = (
type: string,
index: number,
editNode: boolean,
componentName: string,
) =>
`input-list-${type}-btn${editNode ? "-edit" : ""}_${componentName}-${index}`;

View file

@ -1,13 +1,11 @@
import { useEffect, useRef } from "react";
import { ICON_STROKE_WIDTH } from "@/constants/constants";
import _ from "lodash";
import { classNames, cn } from "../../../../../utils/utils";
import IconComponent from "../../../../common/genericIconComponent";
import { Button } from "../../../../ui/button";
import { Input } from "../../../../ui/input";
import { getPlaceholder } from "../../helpers/get-placeholder-disabled";
import { InputListComponentType, InputProps } from "../../types";
import { ButtonInputList } from "./components/button-input-list";
export default function InputListComponent({
value = [""],
@ -52,12 +50,6 @@ export default function InputListComponent({
handleOnNewValue({ value: newInputList });
};
const getButtonClassName = () =>
classNames(disabled ? "text-hard-zinc" : "text-placeholder-foreground");
const getTestId = (type, index) =>
`input-list-${type}-btn${editNode ? "-edit" : ""}_${componentName}-${index}`;
return (
<div
className={classNames(
@ -76,91 +68,34 @@ export default function InputListComponent({
editNode ? "input-edit-node" : "",
disabled ? "disabled-state" : "",
"peer relative",
index === 0 && value.length > 1 && "pr-7 focus:pr-3",
index === 0 && value.length > 1 && "w-3/4 pr-7 focus:pr-3",
)}
placeholder={getPlaceholder(disabled, placeholder)}
onChange={(event) => handleInputChange(index, event.target.value)}
data-testid={`${id}_${index}`}
/>
{index === 0 && value.length > 1 && (
<div className="absolute right-[65px] flex items-center peer-focus:pointer-events-none peer-focus:hidden">
<div
onClick={addNewInput}
className={cn(
"hit-area-icon group flex !h-9 items-center justify-center text-center",
disabled
? "pointer-events-none bg-background hover:bg-background"
: "",
index === 0
? "bg-background hover:bg-muted"
: "hover:bg-smooth-red",
)}
>
<Button
unstyled
size="icon"
className={cn(
"hit-area-icon flex items-center justify-center",
getButtonClassName(),
)}
data-testid={getTestId("plus", index)}
disabled={disabled}
>
<IconComponent
name={"Plus"}
className={cn(
"icon-size justify-self-center text-muted-foreground",
!disabled && "hover:cursor-pointer hover:text-foreground",
"group-hover:text-foreground",
)}
strokeWidth={ICON_STROKE_WIDTH}
/>
</Button>
</div>
</div>
)}
<div
onClick={
index === 0 && value.length <= 1
? addNewInput
: (e) => removeInput(index, e)
}
className={cn(
"hit-area-icon group flex items-center justify-center text-center",
disabled
? "pointer-events-none bg-background hover:bg-background"
: "",
index === 0 && value.length <= 1
? "bg-background hover:bg-muted"
: "hover:bg-smooth-red",
)}
>
<Button
unstyled
size="icon"
className={cn(
"hit-area-icon flex items-center justify-center",
getButtonClassName(),
)}
data-testid={getTestId(
index === 0 && value.length <= 1 ? "plus" : "minus",
index,
)}
<ButtonInputList
index={index}
value={value}
addNewInput={addNewInput}
removeInput={removeInput}
disabled={disabled}
>
<IconComponent
name={index === 0 && value.length <= 1 ? "Plus" : "Trash2"}
className={cn(
"icon-size justify-self-center text-muted-foreground",
!disabled && "hover:cursor-pointer hover:text-foreground",
index === 0 && value.length <= 1
? "group-hover:text-foreground"
: "group-hover:text-destructive",
)}
strokeWidth={ICON_STROKE_WIDTH}
/>
</Button>
</div>
editNode={editNode}
addIcon
componentName={componentName || ""}
/>
)}
<ButtonInputList
index={index}
value={value}
addNewInput={addNewInput}
removeInput={removeInput}
disabled={disabled}
editNode={editNode}
addIcon={false}
componentName={componentName || ""}
/>
</div>
))}
</div>