Skip to content

Commit

Permalink
Merge pull request #4282 from qburst/issue-4268/fix/retain-selected-d…
Browse files Browse the repository at this point in the history
…ate-on-time-change

Fix #4268: Retain the selected date when changing the time
  • Loading branch information
martijnrusschen authored Oct 1, 2023
2 parents b10a14a + 2831b94 commit 583ebe1
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/inputTime.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,14 @@ export default class inputTime extends React.Component {

onTimeChange = (time) => {
this.setState({ time });
const date = new Date();

const { date: propDate } = this.props;
const isPropDateValid = propDate instanceof Date && !isNaN(propDate);
const date = isPropDateValid ? propDate : new Date();

date.setHours(time.split(":")[0]);
date.setMinutes(time.split(":")[1]);

this.props.onChange(date);
};

Expand Down
45 changes: 45 additions & 0 deletions test/time_input_test.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,49 @@ describe("timeInput", () => {
new Date(new Date().setHours(14, 0, 0, 0)),
);
});

it("should trigger onChange event with the specified date prop if available", () => {
const mockOnChange = jest.fn();
const mockDate = new Date("2023-09-30");

const timeComponent = shallow(
<InputTimeComponent date={mockDate} onChange={mockOnChange} />,
);

const newTime = "13:00";
const input = timeComponent.find("input");
input.simulate("change", { target: { value: newTime } });

const expectedDate = new Date(mockDate);
const [expectedHours, expectedMinutes] = newTime.split(":");
expectedDate.setHours(expectedHours);
expectedDate.setMinutes(expectedMinutes);

expect(mockOnChange).toHaveBeenCalledWith(expectedDate);
});

it("should trigger onChange event with the default date when date prop is missing", () => {
const mockOnChange = jest.fn();
const mockCurrentDate = new Date("2023-09-30");
const dateSpy = jest
.spyOn(global, "Date")
.mockImplementation(() => mockCurrentDate);

const timeComponent = shallow(
<InputTimeComponent onChange={mockOnChange} />,
);

const newTime = "13:00";
const input = timeComponent.find("input");
input.simulate("change", { target: { value: newTime } });

const expectedDate = new Date(mockCurrentDate);
const [expectedHours, expectedMinutes] = newTime.split(":");
expectedDate.setHours(expectedHours);
expectedDate.setMinutes(expectedMinutes);

expect(mockOnChange).toHaveBeenCalledWith(expectedDate);

dateSpy.mockRestore();
});
});

0 comments on commit 583ebe1

Please sign in to comment.