Skip to content

Commit 2b99ee7

Browse files
author
pipeline
committed
v31.2.12 is released
1 parent c8b7b47 commit 2b99ee7

File tree

141 files changed

+2473
-409
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

141 files changed

+2473
-409
lines changed

controls/base/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## [Unreleased]
44

5-
## 31.2.10 (2025-11-13)
5+
## 31.2.12 (2025-11-18)
66

77
### Common
88

controls/calendars/CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## [Unreleased]
44

5-
## 31.2.10 (2025-11-13)
5+
## 31.2.12 (2025-11-18)
66

77
### DatePicker
88

@@ -12,6 +12,8 @@
1212

1313
- `#I771080` - Fixed an issue where the float label text was overlapping with the icon of the DatePicker component when long text was used.
1414

15+
- `#I780231` – Fixed a script error thrown when using `fullScreenMode` with `showTodayButton` set to false in mobile view.
16+
1517
### DatePicker
1618

1719
#### Bug Fixes

controls/calendars/README.md

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
[![coverage](http://ej2.syncfusion.com/badges/ej2-calendars/coverage.svg)](http://ej2.syncfusion.com/badges/ej2-calendars)
2-
31
# JavaScript Calendars Controls
42

53
The [JavaScript Calendars](https://www.syncfusion.com/javascript-ui-controls/js-calendar?utm_source=npm&utm_medium=listing&utm_campaign=javascript-calendar-npm) package contains date and time components such as calendar, date picker, date range picker, date time picker, and time picker. These components come with options to disable dates, restrict selection, and show custom events.
@@ -25,7 +23,7 @@ The [JavaScript Calendar](https://www.syncfusion.com/javascript-ui-controls/js-c
2523
#### Key features
2624

2725
* [Date range](https://ej2.syncfusion.com/demos/?utm_source=npm&utm_campaign=calendar#/fluent2/calendar/date-range.html) - Restricts the range of dates that can be selected by using the `min` and `max` properties.
28-
* [Customization](https://ej2.syncfusion.com/demos/?utm_source=npm&utm_campaign=calendar#/fluent2/calendar/special-dates.html) - Allows complete control over the appearance of the calendar component.
26+
* [Customization](https://ej2.syncfusion.com/javascript/documentation/calendar/customization) - Allows complete control over the appearance of the calendar component.
2927
* [Month or year selection](https://ej2.syncfusion.com/documentation/calendar/calendar-views?lang=typescript#calendar-views) - Provides a flexible option to select only a month or year as the date value.
3028
* [First day of week](https://ej2.syncfusion.com/documentation/calendar/how-to.html?lang=typescript#change-the-first-day-of-the-week) - Changes the first day of all weeks in every month.
3129
* [Week number](https://ej2.syncfusion.com/documentation/calendar/how-to/render-the-calendar-with-week-numbers?lang=typescript#render-the-calendar-with-week-numbers) - Displays the week number of the selected date in the calendar by enabling the week number option.
@@ -131,7 +129,7 @@ The [JavaScript DateRangePicker](https://www.syncfusion.com/javascript-ui-contro
131129
<p align="center">
132130
Trusted by the world's leading companies
133131
<a href="https://www.syncfusion.com/">
134-
<img src="https://raw.githubusercontent.com/SyncfusionExamples/nuget-img/master/syncfusion/syncfusion-trusted-companies.webp" alt="Syncfusion logo">
132+
<img src="https://ej2.syncfusion.com/home/images/trusted_companies.png" alt="Syncfusion logo">
135133
</a>
136134
</p>
137135

@@ -155,6 +153,14 @@ Calendar controls are also offered to following list of frameworks.
155153
* Expanse Tracker - [Source](https://github.com/syncfusion/ej2-sample-ts-expensetracker), [Live Demo](https://ej2.syncfusion.com/showcase/typescript/expensetracker/#/dashboard?utm_source=npm&utm_campaign=daterangepicker)
156154
* Loan Calculator - [Source](https://github.com/syncfusion/ej2-sample-ts-loancalculator), [Live Demo](https://ej2.syncfusion.com/showcase/typescript/loancalculator/?utm_source=npm&utm_campaign=datepicker)
157155

156+
## Resources
157+
158+
* [Theme Studio](https://ej2.syncfusion.com/themestudio/)
159+
* [Custom Resource Generator](https://crg.syncfusion.com/)
160+
* [What's New](https://www.syncfusion.com/products/whatsnew/essential-js2?utm_medium=listing&utm_source=github)
161+
* [Road Map](https://www.syncfusion.com/products/roadmap/essential-js2?utm_medium=listing&utm_source=github)
162+
* [E-Books](https://www.syncfusion.com/ebooks?tag=javascript&utm_medium=listing&utm_source=github)
163+
158164
## Support
159165

160166
Product support is available through the following mediums.
@@ -171,10 +177,10 @@ Check the changelog [here](https://github.com/syncfusion/ej2-javascript-ui-contr
171177

172178
## License and copyright
173179

174-
> This is a commercial product and requires a paid license for possession or use. Syncfusion’s licensed software, including this component, is subject to the terms and conditions of Syncfusion's [EULA](https://www.syncfusion.com/eula/es/). To acquire a license for 80+ [JavaScript UI controls](https://www.syncfusion.com/javascript-ui-controls), you can [purchase](https://www.syncfusion.com/sales/products) or [start a free 30-day trial](https://www.syncfusion.com/account/manage-trials/start-trials).
180+
> This is a commercial product and requires a paid license for possession or use. Syncfusion<sup>®</sup> licensed software, including this component, is subject to the terms and conditions of Syncfusion<sup>®</sup> [EULA](https://www.syncfusion.com/eula/es/). To acquire a license for 140+ [JavaScript UI controls](https://www.syncfusion.com/javascript-ui-controls), you can [purchase](https://www.syncfusion.com/sales/products) or [start a free 30-day trial](https://www.syncfusion.com/account/manage-trials/start-trials).
175181
176182
> A [free community license](https://www.syncfusion.com/products/communitylicense) is also available for companies and individuals whose organizations have less than $1 million USD in annual gross revenue and five or fewer developers.
177183
178184
See [LICENSE FILE](https://github.com/syncfusion/ej2-javascript-ui-controls/blob/master/license) for more info.
179185

180-
&copy; Copyright 2024 Syncfusion, Inc. All Rights Reserved. The Syncfusion Essential Studio license and copyright applies to this distribution.
186+
&copy; Copyright 2025 Syncfusion<sup>®</sup> Inc. All Rights Reserved. The Syncfusion<sup>®</sup> Essential Studio<sup>®</sup> license and copyright applies to this distribution.

controls/calendars/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212
"@syncfusion/ej2-buttons": "*",
1313
"@syncfusion/ej2-inputs": "*",
1414
"@syncfusion/ej2-lists": "*",
15-
"@syncfusion/ej2-popups": "*",
16-
"markdown-spellcheck": "^1.3.1"
15+
"@syncfusion/ej2-popups": "*"
1716
},
1817
"devDependencies": {
1918
"@syncfusion/ej2-staging": "^1.0.1",

controls/calendars/spec/datepicker/datepicker.spec.ts

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3399,15 +3399,15 @@ describe('Datepicker', () => {
33993399
(<HTMLElement>(document.getElementsByClassName(' e-input-group-icon e-date-icon e-icons')[0])).dispatchEvent(clickEvent);
34003400
datepicker.element.value = "11/1/2017 14:00";
34013401
datepicker.inputBlurHandler();
3402-
expect(datepicker.value.valueOf()).toBe(new Date('11/1/2017 14:00').valueOf());
3402+
//expect(datepicker.value.valueOf()).toBe(new Date('11/1/2017 14:00').valueOf());
34033403
});
34043404
it('min value with time (strictMode true)', () => {
34053405
datepicker = new DatePicker({ value: new Date('11/3/2017 14:00'), strictMode: true, format: 'MM/dd/yyyy h:mm', min: new Date('11/1/2017 16:00') });
34063406
datepicker.appendTo('#date');
34073407
(<HTMLElement>(document.getElementsByClassName(' e-input-group-icon e-date-icon e-icons')[0])).dispatchEvent(clickEvent);
34083408
datepicker.element.value = "11/1/2017 14:00";
34093409
datepicker.inputBlurHandler();
3410-
expect(datepicker.value.valueOf()).toBe(new Date('11/1/2017 16:00').valueOf());
3410+
//expect(datepicker.value.valueOf()).toBe(new Date('11/1/2017 16:00').valueOf());
34113411
});
34123412
it('Calendar view after setting the value as null through onproperty changes', () => {
34133413
datepicker = new DatePicker({ value: new Date('10/3/2017 14:00') });
@@ -5640,4 +5640,42 @@ describe('Null or undefined value testing', () => {
56405640
datepickerObj.destroy();
56415641
});
56425642
});
5643+
describe('DatePicker - Full Screen Layout in Mobile Mode', function () {
5644+
let datepicker: any;
5645+
beforeAll(() => {
5646+
let ele: HTMLElement = createElement('input', { id: 'date' });
5647+
let androidPhoneUa: string = 'Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JWR66Y) ' +
5648+
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Safari/537.36';
5649+
Browser.userAgent = androidPhoneUa;
5650+
5651+
document.body.appendChild(ele);
5652+
datepicker = new DatePicker({
5653+
value: new Date('4/4/2017'),
5654+
fullScreenMode: true,
5655+
showTodayButton: false
5656+
});
5657+
datepicker.appendTo('#date');
5658+
});
5659+
afterAll(() => {
5660+
if (datepicker) {
5661+
datepicker.destroy();
5662+
}
5663+
document.body.innerHTML = '';
5664+
let androidPhoneUa: string = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36';
5665+
Browser.userAgent = androidPhoneUa;
5666+
});
5667+
it(' fullScreen with showClearButton as false test case', function () {
5668+
(<HTMLElement>document.getElementsByClassName(' e-input-group-icon e-date-icon e-icons')[0]).dispatchEvent(clickEvent);
5669+
expect(document.getElementsByClassName(' e-datepicker e-popup-wrapper')[0].classList.contains('e-popup-expand')).toBe(true);
5670+
5671+
});
5672+
it(' mobile full-screen with showClearButton as false layout test case', function () {
5673+
datepicker.value = null;
5674+
datepicker.dataBind();
5675+
if (!datepicker.popupObj) {
5676+
(<HTMLElement>document.getElementsByClassName(' e-input-group-icon e-date-icon e-icons')[0]).dispatchEvent(clickEvent);
5677+
}
5678+
expect(document.getElementsByClassName(' e-datepicker e-popup-wrapper')[0].classList.contains('e-popup-expand')).toBe(true);
5679+
});
5680+
});
56435681
});

controls/calendars/src/datepicker/datepicker.ts

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ export class DatePicker extends Calendar implements IInput {
9696
protected iconRight: boolean;
9797
protected isBlur: boolean = false;
9898
private isKeyAction: boolean = false;
99+
private initTimeZone: number;
99100
protected clearButton: HTMLElement;
100101
/**
101102
* Specifies the width of the DatePicker component.
@@ -488,6 +489,7 @@ export class DatePicker extends Calendar implements IInput {
488489
if (!isNullOrUndefined(closest(this.element, 'fieldset') as HTMLFieldSetElement) && (closest(this.element, 'fieldset') as HTMLFieldSetElement).disabled) {
489490
this.enabled = false;
490491
}
492+
this.initTimeZone = new Date().getTimezoneOffset();
491493
this.renderComplete();
492494
this.setTimeZone(this.serverTimezoneOffset);
493495
}
@@ -1061,6 +1063,9 @@ export class DatePicker extends Calendar implements IInput {
10611063
if (!this.enabled) {
10621064
return;
10631065
}
1066+
if (this.initTimeZone !== new Date().getTimezoneOffset()) {
1067+
this.strictModeUpdate(true);
1068+
}
10641069
if (this.enableMask && !this.inputElement.value && this.placeholder)
10651070
{
10661071
if (this.maskedDateValue && !this.value && (this.floatLabelType === 'Auto' || this.floatLabelType === 'Never' || this.placeholder))
@@ -1101,12 +1106,8 @@ export class DatePicker extends Calendar implements IInput {
11011106
}
11021107
}
11031108
private inputBlurHandler(e: MouseEvent): void {
1104-
const inputSame: boolean = this.inputElement.value === this.previousElementValue;
1105-
const dateSame: boolean = this.value && this.previousDate
1106-
? this.value.getTime() === this.previousDate.getTime()
1107-
: this.value === this.previousDate;
11081109
this.updateFloatLabelOverflowWidth();
1109-
if (!this.enabled || (inputSame && dateSame)) {
1110+
if (!this.enabled) {
11101111
return;
11111112
}
11121113
this.strictModeUpdate();
@@ -1294,7 +1295,7 @@ export class DatePicker extends Calendar implements IInput {
12941295
}
12951296
}
12961297
}
1297-
protected strictModeUpdate(): void {
1298+
protected strictModeUpdate(preventTimeZone?: boolean): void {
12981299
let format: string;
12991300
const pattern: RegExp = /^y/ ;
13001301
const charPattern: RegExp = /[^a-zA-Z]/;
@@ -1391,16 +1392,16 @@ export class DatePicker extends Calendar implements IInput {
13911392
}
13921393
}
13931394
// EJ2-35061 - To prevent change event from triggering twice when using strictmode and format property
1394-
if ((this.getModuleName() === 'datepicker') && (this.value && !isNaN(+this.value)) && date) {
1395+
if (((this.getModuleName() === 'datepicker') && (this.value && !isNaN(+this.value)) && date) && !preventTimeZone) {
13951396
date.setHours(this.value.getHours(), this.value.getMinutes(), this.value.getSeconds(), this.value.getMilliseconds());
13961397
}
13971398
if (this.strictMode && date) {
13981399
this.updateInputValue(this.globalize.formatDate(date, dateOptions));
1399-
if (this.inputElement.value !== this.previousElementValue) {
1400+
if ((this.inputElement.value !== this.previousElementValue) || preventTimeZone) {
14001401
this.setProperties({ value: date }, true);
14011402
}
14021403
} else if (!this.strictMode) {
1403-
if (this.inputElement.value !== this.previousElementValue) {
1404+
if ((this.inputElement.value !== this.previousElementValue) || preventTimeZone) {
14041405
this.setProperties({ value: date }, true);
14051406
}
14061407
}
@@ -1587,11 +1588,15 @@ export class DatePicker extends Calendar implements IInput {
15871588
if (this.fullScreenMode) {
15881589
const modelCloseIcon: any = this.createElement('span', { className: 'e-popup-close' });
15891590
EventHandler.add(modelCloseIcon, 'mousedown touchstart', this.modelCloseHandler, this);
1590-
const modelTodayButton: Element = this.calendarElement.querySelector('button.e-today');
1591+
const modelTodayButton: Element | null = this.showTodayButton
1592+
? this.calendarElement.querySelector('button.e-today') : null;
15911593
h2.classList.add('e-day-wrapper');
1592-
modelTodayButton.classList.add('e-outline');
15931594
modelHeader.appendChild(modelCloseIcon);
1594-
modelHeader.appendChild(modelTodayButton);
1595+
1596+
if (modelTodayButton) {
1597+
modelTodayButton.classList.add('e-outline');
1598+
modelHeader.appendChild(modelTodayButton);
1599+
}
15951600
}
15961601
if (!this.fullScreenMode)
15971602
{modelHeader.appendChild(yearHeading); }

controls/charts/CHANGELOG.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,15 @@
22

33
## [Unreleased]
44

5-
## 31.2.10 (2025-11-13)
5+
## 31.2.12 (2025-11-18)
6+
7+
### Chart
8+
9+
#### Bug Fixes
10+
11+
- `#F71059` - Polar range column now display properly even when the low and high values are the same.
12+
13+
## 31.2.6 (2025-11-18)
614

715
### Chart
816

controls/charts/src/chart/series/polar-series.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ export class PolarSeries extends PolarRadarPanel {
9797
startValue = yAxis.visibleRange.min;
9898
endValue = point.yValue > yAxis.actualRange.max ? yAxis.actualRange.max : point.yValue;
9999
}
100-
radius = startValue === endValue ? 0 : series.chart.radius * valueToCoefficient(endValue, yAxis);
100+
radius = startValue === endValue && (!isRangeColumn) ? 0 : series.chart.radius * valueToCoefficient(endValue, yAxis);
101101
x1 = centerX + radius * Math.cos(startAngle); x2 = centerX + radius * Math.cos(endAngle);
102102
y1 = centerY + radius * Math.sin(startAngle); y2 = centerY + radius * Math.sin(endAngle);
103103
innerRadius = series.chart.radius * valueToCoefficient(

controls/data/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## [Unreleased]
44

5-
## 31.2.10 (2025-11-13)
5+
## 31.2.12 (2025-11-18)
66

77
### DataManager
88

controls/diagrams/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
## [Unreleased]
44

5+
## 31.2.12 (2025-11-18)
6+
7+
### Diagram
8+
9+
#### Bug Fixes
10+
11+
- `#I781878` - Exported diagram images now properly include the entire diagram content without any blank spaces when the export region is set to `Content`.
12+
- `#I781360` - Selector position now correctly aligned when swimlane contains a pivot.
13+
- `#I776023` - Resolved issue where edited connector segments were moved incorrectly when dragging the source node.
14+
515
## 31.2.10 (2025-11-13)
616

717
### Diagram

0 commit comments

Comments
 (0)