diff --git a/creme/creme_core/static/creme_core/js/tests/widgets/datetimepicker.js b/creme/creme_core/static/creme_core/js/tests/widgets/datetimepicker.js index 655e09bf0..6126e33af 100644 --- a/creme/creme_core/static/creme_core/js/tests/widgets/datetimepicker.js +++ b/creme/creme_core/static/creme_core/js/tests/widgets/datetimepicker.js @@ -33,6 +33,23 @@ QUnit.module("creme.widgets.datetime.js", new QUnitMixin(QUnitAjaxMixin, value: options.value || '' }); + return html; + }, + + createDatePickerHtml: function(options) { + options = Object.assign({ + format: 'dd-mm-yy' + }, options || {}); + + var html = ( + '' + ).template({ + readonly: options.readonly ? 'readonly' : '', + disabled: options.disabled ? 'disabled' : '', + format: options.format, + value: options.value ? String(options.value) : '' + }); + return html; } })); @@ -143,4 +160,116 @@ QUnit.parametrize('creme.widget.DateTimePicker.val (from widget)', [ equal(element.find('.minute input').val(), expected.minute); }); +QUnit.parameterize('creme.widget.DatePicker.create (initial)', [ + [{format: 'dd-mm-yy', value: ''}, ''], + [{format: 'dd-mm-yy', value: '12-02-2025'}, '12-02-2025'], + [{format: 'dd/mm/yy', value: '12-02-2025'}, ''], + [{format: 'dd/mm/yy', value: '12/02/2025'}, '12/02/2025'] +], function(options, expected, assert) { + var element = $(this.createDatePickerHtml(options)).appendTo(this.qunitFixture()); + var widget = creme.widget.create(element); + + equal(element.hasClass('widget-active'), true); + equal(element.hasClass('widget-ready'), true); + equal(element.hasClass('hasDatepicker'), true); // jquery datepicker is enabled + + equal(element.is('[disabled]'), false); + equal(element.is('[readonly]'), false); + + equal(expected, element.val()); + equal(expected, widget.val()); +}); + +QUnit.parameterize('creme.widget.DatePicker.create (disabled, readonly)', [ + [{value: '12-02-2025', disabled: true, readonly: false}], + [{value: '12-02-2025', disabled: false, readonly: true}], + [{value: '12-02-2025', disabled: true, readonly: true}] +], function(options, assert) { + var element = $(this.createDatePickerHtml(options)).appendTo(this.qunitFixture()); + creme.widget.create(element); + + equal(element.hasClass('widget-active'), true); + equal(element.hasClass('widget-ready'), true); + equal(element.hasClass('hasDatepicker'), true); // jquery datepicker is enabled + + equal(element.is('[disabled]'), options.disabled || options.readonly); + equal(element.is('[readonly]'), options.readonly); +}); + +QUnit.test('creme.widget.DatePicker.val (today)', function(assert) { + var element = $(this.createDatePickerHtml({ + value: '12-02-2024' + })).appendTo(this.qunitFixture()); + var widget = creme.widget.create(element); + + equal(element.hasClass('widget-active'), true); + equal(element.hasClass('widget-ready'), true); + + equal('12-02-2024', element.val()); + equal('12-02-2024', widget.val()); + + widget.val('13-03-2023'); + + equal('13-03-2023', element.val()); + equal('13-03-2023', widget.val()); + + equal(1, $('[name="today"]').length); + + $('[name="today"]').trigger('click'); + + var today = moment().format('DD-MM-YYYY'); + + equal(today, element.val()); + equal(today, widget.val()); +}); + +QUnit.parameterize('creme.widget.YearPicker.create', [ + [{value: '2025', disabled: false, readonly: false}], + [{value: '2025', disabled: true, readonly: false}], + [{value: '2025', disabled: false, readonly: true}], + [{value: '', disabled: false, readonly: false}] +], function(options, assert) { + options = options || {}; + + var element = $(( + '' + ).template({ + readonly: options.readonly ? 'readonly' : '', + disabled: options.disabled ? 'disabled' : '', + value: options.value ? String(options.value) : '' + })).appendTo(this.qunitFixture()); + var widget = creme.widget.create(element); + + equal(element.hasClass('widget-active'), true); + equal(element.hasClass('widget-ready'), true); + + equal(element.is('[disabled]'), options.disabled || false); + equal(element.is('[readonly]'), options.readonly || false); + + equal(options.value, element.val()); + equal(options.value, widget.val()); +}); + +QUnit.test('creme.widget.YearPicker.val (current year)', function(assert) { + var element = $( + '' + ).appendTo(this.qunitFixture()); + var widget = creme.widget.create(element); + + equal(element.hasClass('widget-active'), true); + equal(element.hasClass('widget-ready'), true); + + widget.val('2024'); + + equal('2024', element.val()); + equal('2024', widget.val()); + + equal(1, $('[name="current-year"]').length); + + $('[name="current-year"]').trigger('click'); + + equal(String(new Date().getFullYear()), element.val()); + equal(String(new Date().getFullYear()), widget.val()); +}); + }(jQuery)); diff --git a/creme/creme_core/static/creme_core/js/widgets/datetime.js b/creme/creme_core/static/creme_core/js/widgets/datetime.js index dd7bf1d38..dc0a01ea7 100644 --- a/creme/creme_core/static/creme_core/js/widgets/datetime.js +++ b/creme/creme_core/static/creme_core/js/widgets/datetime.js @@ -1,6 +1,6 @@ /******************************************************************************* Creme is a free/open-source Customer Relationship Management software - Copyright (C) 2009-2024 Hybird + Copyright (C) 2009-2025 Hybird This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by @@ -21,7 +21,6 @@ "use strict"; /* TODO: factorise? */ -/* TODO: unit test */ creme.widget.YearPicker = creme.widget.declare('ui-creme-yearpicker', { options: { readonly: false, @@ -74,7 +73,12 @@ creme.widget.YearPicker = creme.widget.declare('ui-creme-yearpicker', { }, val: function(element, value) { - return element.val(value); + if (value === undefined) { + return element.val(); + } + + element.val(value); + return this; } }); @@ -148,7 +152,12 @@ creme.widget.DatePicker = creme.widget.declare('ui-creme-datepicker', { }, val: function(element, value) { - return element.val(value); + if (value === undefined) { + return element.val(); + } + + element.val(value); + return this; } }); @@ -201,6 +210,7 @@ creme.widget.DateTimePicker = creme.widget.declare('ui-creme-datetimepicker', { } $('input[type="hidden"]', element).val(value).trigger('change'); + return this; } }); diff --git a/creme/creme_core/templates/creme_core/tests/test_datefield.html b/creme/creme_core/templates/creme_core/tests/test_datefield.html new file mode 100644 index 000000000..6b681c4f1 --- /dev/null +++ b/creme/creme_core/templates/creme_core/tests/test_datefield.html @@ -0,0 +1,68 @@ +{% extends "creme_core/tests/testbase.html" %} + +{% block test_title %}Date fields{% endblock %} + +{% block test_header %} + +{% endblock %} + +{% block test_content %} +

creme.widget.YearPicker

+

+ + + +

+ +

creme.widget.DatePicker

+

+ + + + +

+ +

creme.widget.DateTimePicker

+

+ +

+ + + + + + +

+{% endblock %}