Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ You are given an array of goods. Render them in a table with the ability to sele
- Implement a solution following the [React task guideline](https://github.com/mate-academy/react_task-guideline#react-tasks-guideline).
- Use the [React TypeScript cheat sheet](https://mate-academy.github.io/fe-program/js/extra/react-typescript).
- Open one more terminal and run tests with `npm test` to ensure your solution is correct.
- Replace `<your_account>` with your Github username in the [DEMO LINK](https://<your_account>.github.io/react_goods-selector/) and add it to the PR description.
- Replace `<your_account>` with your Github username in the [DEMO LINK](https://DDefty.github.io/react_goods-selector/) and add it to the PR description.
133 changes: 86 additions & 47 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,58 +15,97 @@ export const goods = [
'Garlic',
];

export const App: React.FC = () => (
<main className="section container">
<h1 className="title">No goods selected</h1>
interface State {
selectedGood: string;
}

<h1 className="title is-flex is-align-items-center">
Jam is selected
{/* eslint-disable-next-line jsx-a11y/control-has-associated-label */}
<button data-cy="ClearButton" type="button" className="delete ml-3" />
</h1>
export class App extends React.Component<{}, State> {
state = {
selectedGood: 'Jam',
};

<table className="table">
<tbody>
<tr data-cy="Good">
<td>
<button data-cy="AddButton" type="button" className="button">
+
</button>
</td>
// Select a good by reading the data-good attribute from the event target
handleSelectGood = (e: React.MouseEvent<HTMLButtonElement>) => {
const good = e.currentTarget.dataset.good || '';

<td data-cy="GoodTitle" className="is-vcentered">
Dumplings
</td>
</tr>
this.setState({ selectedGood: good });
};

<tr data-cy="Good" className="has-background-success-light">
<td>
// Clear the current selection
handleClearSelection = () => {
this.setState({ selectedGood: '' });
};

// Remove (clear) selection — kept as a separate method per request
handleRemoveSelection = () => {
this.setState({ selectedGood: '' });
};

render() {
return (
<main className="section container">
<h1 className="title is-flex is-align-items-center">
{this.state.selectedGood !== '' ? (
<>{this.state.selectedGood} is selected</>
) : (
<>No goods selected</>
)}
{/* eslint-disable-next-line jsx-a11y/control-has-associated-label */}
{this.state.selectedGood !== '' ? (
<button
data-cy="RemoveButton"
data-cy="ClearButton"
type="button"
className="button is-info"
>
-
</button>
</td>

<td data-cy="GoodTitle" className="is-vcentered">
Jam
</td>
</tr>
className="delete ml-3"
onClick={this.handleClearSelection}
/>
) : null}
</h1>

<tr data-cy="Good">
<td>
<button data-cy="AddButton" type="button" className="button">
+
</button>
</td>
<table className="table">
<tbody>
{goods.map(good => {
return (
<tr
data-cy="Good"
key={good}
className={
good === this.state.selectedGood
? 'has-background-success-light'
: ''
}
>
<td>
{this.state.selectedGood !== good ? (

Choose a reason for hiding this comment

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

This violates the task description: "Don't show AddButton when a good is selected." Currently the code renders AddButton when this.state.selectedGood !== good, which leaves AddButtons visible for non-selected rows while some other good is selected. Change the condition so AddButtons are shown only when there is no selection (e.g., this.state.selectedGood === ''). See the description for the exact requirement .

<button
data-cy="AddButton"
type="button"
className="button"
data-good={good}
onClick={this.handleSelectGood}
>
+
</button>
) : (
<button
data-cy="RemoveButton"
type="button"
className="button is-info"
onClick={this.handleRemoveSelection}
>
-
</button>
)}
Comment on lines +78 to +97

Choose a reason for hiding this comment

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

This violates the requirement: "Don't show AddButton when a good is selected" (from the task description) . Current condition this.state.selectedGood !== good renders an AddButton for every non-selected row even when some other good is selected. Update the rendering logic in the goods map so that:

  • If this.state.selectedGood === '' => show the AddButton for every row.
  • Else if good === this.state.selectedGood => show the RemoveButton for that row only.
  • Else => render nothing in the action cell for non-selected rows.

This ensures AddButtons are hidden whenever a selection exists and only the selected row shows the RemoveButton, matching the specification and tests.

</td>

<td data-cy="GoodTitle" className="is-vcentered">
Garlic
</td>
</tr>
</tbody>
</table>
</main>
);
<td data-cy="GoodTitle" className="is-vcentered">
{good}
</td>
</tr>
);
})}
</tbody>
</table>
</main>
);
}
}