From 4ea1b678c3475b50d4b74675a71ad8e86e07f534 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8C=80=EC=97=B0?= Date: Wed, 23 Nov 2022 15:49:53 +0900 Subject: [PATCH] fix: fire change event redundantly when time also changed (#110) * test: add test about firing change event when calling setDate * chore: update tui-time-picker * fix: fire change event redundantly when time also changed * test: change date to selectable date in added test * feat: add silent option to setDate for preventing change event fired --- package-lock.json | 6 +++--- package.json | 2 +- src/js/datepicker/index.js | 9 ++++++--- test/datepicker/datepicker.spec.js | 32 +++++++++++++++++++++++++----- 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index a57dbd6..fed5126 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13214,9 +13214,9 @@ "dev": true }, "tui-time-picker": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tui-time-picker/-/tui-time-picker-2.1.3.tgz", - "integrity": "sha512-EjOOaS+NqTSuBbsR+gEsNytyd6Mtw+JvwaIsFc6iytJi+Ncm7yQMhZE7T8CjLrFEhPFluuma10WgU8WIxJrsbQ==" + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/tui-time-picker/-/tui-time-picker-2.1.5.tgz", + "integrity": "sha512-A0JzWpVIaTun8m4BEGa/COVKRk3m+FyBdC6s8xJ0mPToloBqkQ1SRC2Gd/GDZHhxKAdlDoLCfgCselK0oN5Ykw==" }, "type-check": { "version": "0.3.2", diff --git a/package.json b/package.json index 0c6ac93..4cd5a5d 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,6 @@ "webpack-dev-server": "^3.8.0" }, "dependencies": { - "tui-time-picker": "^2.1.3" + "tui-time-picker": "^2.1.5" } } diff --git a/src/js/datepicker/index.js b/src/js/datepicker/index.js index 974d096..6ebf41c 100644 --- a/src/js/datepicker/index.js +++ b/src/js/datepicker/index.js @@ -1133,11 +1133,12 @@ var DatePicker = defineClass( /** * Select the date. * @param {Date|number} date - Date instance or timestamp to set + * @param {boolean} [silent] - Prevents firing 'change' event if it is true. * @example * datepicker.setDate(new Date()); // Set today */ // eslint-disable-next-line complexity - setDate: function(date) { + setDate: function(date, silent) { var isValidInput, newDate, shouldUpdate; if (date === null) { @@ -1155,7 +1156,7 @@ var DatePicker = defineClass( this._date = newDate; this._calendar.draw({ date: newDate }); if (this._timePicker) { - this._timePicker.setTime(newDate.getHours(), newDate.getMinutes()); + this._timePicker.setTime(newDate.getHours(), newDate.getMinutes(), true); } this._syncToInput(); @@ -1174,7 +1175,9 @@ var DatePicker = defineClass( * // unbind the 'change' event * datepicker.off('change'); */ - this.fire('change'); + if (!silent) { + this.fire('change'); + } } }, diff --git a/test/datepicker/datepicker.spec.js b/test/datepicker/datepicker.spec.js index 6ab2229..3895008 100755 --- a/test/datepicker/datepicker.spec.js +++ b/test/datepicker/datepicker.spec.js @@ -1,3 +1,5 @@ +/* eslint-disable max-nested-callbacks */ + /** * @fileoverview DatePicker spec */ @@ -131,14 +133,34 @@ describe('Date Picker', function() { expect(datepicker.getCalendar()).toEqual(expect.any(Calendar)); }); - it('setDate', function() { - datepicker.setDate(new Date(2017, 2, 12)); + describe('setDate', function() { + it('default', function() { + datepicker.setDate(new Date(2017, 2, 12)); + + expect(datepicker.getDate()).toEqual(new Date(2017, 2, 12)); + + datepicker.setDate(); + + expect(datepicker.getDate()).toEqual(new Date(2017, 2, 12)); + }); - expect(datepicker.getDate()).toEqual(new Date(2017, 2, 12)); + it('should firing change event only once', function() { + var spy = jest.fn(); + datepicker.on('change', spy); - datepicker.setDate(); + datepicker.setDate(new Date(2017, 10, 27, 23, 59)); - expect(datepicker.getDate()).toEqual(new Date(2017, 2, 12)); + expect(spy).toHaveBeenCalledTimes(1); + }); + + it('should not fire change event when silent is true', function() { + var spy = jest.fn(); + datepicker.on('change', spy); + + datepicker.setDate(new Date(2017, 10, 27, 23, 59), true); + + expect(spy).toHaveBeenCalledTimes(0); + }); }); it('setType', function() {